{"version":3,"sources":["types/ActivityTypes.ts","views/icons/SOGoS.tsx","views/components/Banner.tsx","views/auth/LoggedOut.tsx","views/auth/PrivateRoute.tsx","views/time/TimeDisplay.tsx","miscellanous/Tools.ts","views/icons/MountainIcon.tsx","views/icons/ActivityIcon.tsx","views/icons/TacticalActivityIcon.tsx","events/UserEvents.ts","events/SecurityEvents.ts","events/ActivityEvents.ts","reducers/UserReducer.ts","reducers/security/TokenReducer.ts","reducers/SecurityReducer.ts","reducers/MiscellaneousReducer.ts","events/ApplicationLifecycleEvents.ts","events/ConfigurationEvents.ts","reducers/ConfigurationReducer.ts","types/ConfigurationTypes.ts","reducers/ActivityReducer.ts","reducers/NetworkReducer.ts","events/NetworkEvents.ts","events/HistoryEvents.ts","reducers/HistoryReducer.ts","events/StrategyEvents.ts","reducers/StrategyReducer.ts","events/TacticalEvents.ts","reducers/TacticalActivityReducer.ts","reducers/TacticalReducer.ts","events/MiscEvents.ts","events/TimeEvents.ts","reducers/TimeReducer.ts","reducers/index.ts","views/time/ActivitySelection.tsx","views/icons/TomatoIcon.tsx","actions/ActivityActions.ts","views/time/ActivityHub.tsx","views/time/PomodoroTimer.tsx","views/time/Stopwatch.tsx","miscellanous/Projection.ts","views/history/Projections.ts","views/history/TimeLine.tsx","types/TacticalTypes.ts","views/history/HeatMap.tsx","views/history/PieFlavored.tsx","views/time/ActivityTimeBar.tsx","views/components/OfflineMode.tsx","views/components/InstallApplication.tsx","views/components/UpdateApplication.tsx","views/icons/GoalIcon.tsx","views/components/MenuNavigation.tsx","views/components/ManualSync.tsx","views/components/MenuAppBar.tsx","views/auth/SessionExpired.tsx","views/time/PausedPomodoro.tsx","views/components/SnackBoi.tsx","views/components/TacModThankYou.tsx","views/components/Onboarding.tsx","views/components/LoggedInLayout.tsx","views/icons/HistoryIcon.tsx","views/Dashboard.tsx","views/components/OutOfSync.tsx","security/OAuth.ts","sagas/security/TokenSagas.ts","sagas/NetworkSagas.ts","sagas/security/RefreshTokenSagas.ts","types/SecurityTypes.ts","sagas/configuration/ConfigurationConvienenceSagas.ts","sagas/security/AccessTokenSagas.ts","sagas/security/ReadOnlySaga.tsx","sagas/security/ReadTokenSagas.ts","sagas/APISagas.ts","sagas/activity/PomodoroActivitySagas.ts","views/history/HistoryDashboardComponents.tsx","views/time/SharedPausedPomodoro.tsx","views/history/SharedHistoryDashboardComponents.tsx","views/About.tsx","views/App.tsx","serviceWorker.ts","sagas/security/SecurityInitializationSaga.ts","security/StupidShit.ts","sagas/security/AuthorizationFlowSagas.ts","sagas/activity/LogoutActivitySaga.ts","sagas/security/LogoutSaga.ts","sagas/SecuritySagas.ts","sagas/configuration/OAuthConfigurationSagas.ts","sagas/configuration/InitialConfigurationSagas.ts","sagas/configuration/ConfigurationSetupSagas.ts","sagas/ConfigurationSagas.ts","types/EventTypes.ts","sagas/activity/RegisterActivitySaga.ts","sagas/UserSagas.ts","sagas/activity/LogonActivitySaga.ts","sagas/activity/CurrentActivitySaga.ts","sagas/activity/ActivitySyncSaga.ts","sagas/activity/ActivityNotificationSaga.ts","sagas/ActivitySagas.ts","sagas/history/ActivityHistorySagas.ts","sagas/history/CapstoneHistorySaga.ts","sagas/history/SingularActivityHistorySagas.ts","sagas/HistorySagas.ts","sagas/strategy/ObjectiveCreationSagas.ts","sagas/strategy/ObjectiveSagas.ts","sagas/strategy/StrategySyncSaga.ts","sagas/StrategySagas.ts","sagas/tactical/TacticalActivitySyncSaga.ts","sagas/tactical/TacticalActivityVisibilitySagas.ts","sagas/tactical/TacticalActivityCreationSagas.ts","sagas/tactical/PomodoroSettingsSagas.ts","sagas/tactical/TacticalActivitiesSagas.ts","sagas/TacticalSagas.ts","sagas/CacheSagas.ts","sagas/time/PomodoroSaga.ts","sagas/time/StopwatchSaga.ts","sagas/time/SandsOfTimeSaga.ts","sagas/time/FocusSaga.ts","sagas/TimeSagas.ts","sagas/OnboardingSagas.ts","sagas/index.ts","config/Configuration.ts","index.tsx","images/SOGoS.svg","images/ActivityIcon.svg","images/Goal.svg","images/Tomato.svg","images/confetti.png","images/History.svg"],"names":["ActivityType","ActivityStrategy","ActivityTimedType","defaultSize","height","width","SOGoS","props","size","styles","usableSize","style","src","SOGoSIcon","beforeInjection","svg","setAttribute","String","useStyles","makeStyles","theme","headerContent","borderRadius","spacing","backgroundColor","palette","background","paper","padding","marginBottom","headerContentWithHover","boxShadow","Banner","children","hideExcerpt","navigateable","containerProps","cursor","dispetch","useDispatch","display","position","top","left","verticalAlign","Container","maxWidth","className","onClick","push","textAlign","Typography","component","variant","align","color","gutterBottom","paragraph","Link","themeStyles","root","border","label","textTransform","LoggedOut","href","connect","state","isLoggedIn","security","Component","path","exact","rest","render","to","location","pathname","from","TimeDisplay","timeElapsed","hours","Math","floor","remainingTimeForMinutes","minutes","displayTime","seconds","displayHours","displayMinutes","log10","displaySeconds","getDisplayTime","objectToArray","object","Object","keys","map","key","numberObjectToArray","objectToKeyValueArray","value","reverseBinarySearch","list","comparator","low","high","length","mid","cmp","findChild","node","finder","queue","touched","currentNode","pop","forEach","n","_checked","childNodes","filter","unshift","MountainIcon","skyColor","Goal","id","indexOf","hex","opacity","defaultBackground","defaultLine","ActivityIcon","lineColor","usableBackground","usableLine","alterColor","childID","usableColorType","modifier","startsWith","Activity","TacticalActivityIcon","tacticalActivity","iconCustomization","line","RECEIVED_USER","createReceivedUserEvent","user","type","payload","createReceivedUserProfileEvent","userProfile","createDownloadedAvatarEvent","avatarUrl","createFailedToUploadAvatarEvent","createSyncedSharedDashboardUpdateEvent","hasShared","createCheckedCachesEvent","hasItemsToCache","createReceivedReadToken","readTokenPayload","createFailedToReceiveReadToken","userIdentifier","requestAuthorizationGrantCheck","oauthConfig","createTokenReceptionEvent","tokenResponse","DEFAULT_ACTIVITY","antecedenceTime","content","uuid","name","timedType","NA","RECOVERY","getActivityContent","activity","getActivityName","isPausedActivity","paused","getActivityID","activityID","isActivityRecovery","GENERIC","getId","activitiesEqual","currentActivity","activityOneId","createStartedActivityEvent","Date","getTime","createStartedTimedActivityEvent","createResumedStartedTimedActivityEvent","createFoundPreviousActivityActivityEvent","createResumedStartedNonTimedActivityEvent","createCachedActivityEvent","createRegisteredStartEvent","INITIAL_USER_STATE","information","firstName","lastName","email","fullName","guid","userName","miscellaneous","hasItemsCached","onboarding","userReducer","action","TacModNotified","welcomed","TacModThanked","misc","localAvatar","decodeAndMapToken","token","decodedToken","issuedAt","iat","expiresAt","exp","expiresHuman","toISOString","mapTokenClaims","jwtDecode","parseRefreshToken","refreshToken","e","INITIAL_SECURITY_STATE","refreshTokenInformation","SharedStatus","tokenReceptionReducer","tokenReceptionPayload","accessToken","idToken","accessTokenInformation","realAccessToken","readTokenReceptionReducer","readToken","readTokenInformation","readOnly","SHARED","NotificationType","UploadStatus","defaultTokenInfo","verificationKey","isExpired","isInitialized","isOutOfSync","UNKNOWN","securityReducer","identityProvider","omit","NOT_SHARED","createReceivedOAuthConfigurations","createReceivedInitialConfigurationsEvent","initialConfig","INITIAL_CONFIGURATION_STATE","oauth","authorizationEndpoint","endSessionEndpoint","revocationEndpoint","tokenEndpoint","userInfoEndpoint","initial","clientID","appClientID","logoutEndpoint","openIDConnectURI","provider","notificationsAllowed","configurationReducer","defaultActivity","NONE","PASSIVE","autoStart","INITIAL_ACTIVITY_STATE","shouldTime","previousActivity","completedPomodoro","dateCounted","count","cache","activityReducer","userGUID","cachedActivity","reduceRight","keyValues","accum","keyValue","INITIAL_NETWORK_STATE","isOnline","hasInternet","networkReducer","createFoundBeforeCapstoneEvent","capstoneActivity","createUpdatedFullFeedEvent","activityUpdate","createAdjustedHistoryTimeFrame","dateRange","DEFAULT_RANGE","INITIAL_HISTORY_STATE","activityFeed","fullFeed","selectedHistoryRange","fullHistoryRange","capstone","topActivity","bottomActivity","loading","HistoryReducer","selection","activities","between","full","newFullFeedPayload","newSelectionPayload","newCapstones","afterCapstone","beforeCapstone","createSyncedObjectiveEvent","objective","INITIAL_STRATEGY_STATE","objectives","keyResults","dictionaryReducer","toIndex","updateStateWithObjectives","newObjectives","newKeyResults","reduce","StrategyReducer","newObjective","keyResult","deletedObjective","suspiciousObjective","possibleRemovableKeyResult","keyResultToRemove","rememberedObjectives","rememberedKeyResults","flatMap","foundObjective","createSyncedTacticalActivityEvent","createUpdatedTacticalActivityEvent","createArchivedTacticalActivityEvent","createRestoredTacticalActivityEvent","rankReducer","index","rank","updateStateWithActivities","newActivities","tacticalActivities","tactAct","hidden","archivedTacticalActivities","archivedActivities","TacticalActivityReducer","INITIAL_TACTICAL_STATE","newActivity","deletedActivity","suspiciousActivity","activeActivities","tactActivity","rememberedActivities","pomodoro","settings","loadDuration","shortRecoveryDuration","longRecoveryDuration","TacticalReducer","updatedState","cachedSettings","createShowWarningNotificationEvent","message","WARNING","INITIAL_MISC_STATE","notification","shown","avatarUpload","uploadStatus","NOT_STARTED","redirectPath","MiscellaneousReducer","UPLOADING","COMPLETED","FAILED","createTimeSetEvent","timeToSet","INITIAL_TIME_STATE","selectSecurityState","globalState","selectMiscState","selectTimeState","time","selectActivityState","selectNetworkState","network","selectUserState","selectConfigurationState","configuration","selectHistoryState","history","selectStrategyState","strategy","selectTacticalState","tactical","selectPomodoroState","selectTacticalActivityState","rootReducer","combineReducers","timeReducer","router","connectRouter","extendedIcon","marginRight","speedDial","margin","hubRoot","container","zIndex","overflow","toolTip","flexDirection","alignItems","toolTipInner","fontSize","contents","icon","cancel","marginTop","cancelIcon","bigIcon","primary","main","bigIconTomato","activityIcon","activityContainer","flexWrap","justifyContent","mapStateToProps","ActivitySelection","classes","useSelector","useEffect","open","Grow","in","IconButton","onClose","Cancel","KeyboardArrowDown","onActivitySelection","onGenericActivitySelection","genericIcon","TomatoIcon","Tomato","startTimedActivity","activityContent","startNonTimedActivity","TacModDownloaded","buildCommenceActivityContents","supplements","ACTIVE","STOP_WATCH","workStartedWomboCombo","ActivityHub","useState","setOpen","strategyOpen","setStrategyOpen","commenceActivity","commenceTimedActivity","Notification","requestPermission","then","res","TIMER","duration","commenceTimedObjectiveActivity","commenceGenericTimedActivity","commenceObjectiveActivity","commenceGenericActivity","_","selectedAction","setSelectedAction","selectedGenericAction","setSelectedGenericAction","selectedIcon","setSelectedIcon","baseAction","genericAction","closeStrategy","actions","perform","showToolTips","setShowTooltips","setTimeout","SpeedDial","ariaLabel","transitionDuration","SpeedDialIcon","direction","SpeedDialAction","tooltipTitle","tooltipOpen","tooltipPlacement","activityChosen","title","stopwatchContainer","actionButton","marginLeft","lineHeight","swappo","PomodoroTimer","onPause","pivotActivity","swapActivity","hidePause","selectionOpen","setSelectionOpen","changeActivity","changeActivityFunction","setChangeActivityFunction","closeSelection","SwapHoriz","Stopwatch","pauseTimer","actualFontSize","areDifferent","nextActivity","currentActivityIdentifier","getActivityIdentifier","haveSameDefinedId","activityName","haveSameDefaultName","constructProjection","modifiedFeed","activityIdentifier","activityBins","start","stop","spawn","withStyles","__","timeBar","fillOpacity","strokeWidth","constructColorMappings","defaultColors","blue","kv","idToColor","responsivefy","resize","targetWidth","parseInt","attr","round","aspect","select","parentNode","call","window","on","addCurrentActivity","activityProjection","relativeToTime","bins","meow","valueOf","relativeFromTime","dispatch","earliestActivity","binsToArray","laneLength","kV","right","bottom","timeBegin","timeEnd","endingTime","moment","unix","beginningTime","timeSpanDuration","diff","x","scaleLinear","domain","range","y1","remove","timeSVG","append","dayz","asDays","timeLabelAxis","axisTop","tickFormat","d","i","dateBoi","format","items","lane","mappedTacticalActivities","mapTacticalActivitiesToID","colorToActivity","selectAll","data","enter","timebar","text","milliseconds","meaningFullName","getMeaningFullName","millisecondsDuration","toFixed","bBoi","brushX","extent","bBoiSelection","event","sourceEvent","clear","invert","newFrom","newTo","brushEnd","RecoveryActivity","categories","borderTop","paddingTop","legendLabel","flexGrow","weekDays","weekTimes","gridSize","minuteRow","Array","fill","minuteColumn","sanitizeName","capitalize","toLowerCase","filteredLinearProjection","setFilteredLinearProjection","linearProjection","setLinearProjection","displayName","currentHeatMapActivity","setCurrentHeatMapActivity","heatMapType","setHeatMapType","isHour","rows","heatBoiSvg","modifiedBottom","newestActivity","modifiedTop","projection","linearProj","values","a","multiplier","unfilteredSteppos","stepSize","closestFullStep","closestEndingStep","fullSteps","safeSteps","fullTimeSteps","timeStamp","fullTimeStepsLength","lastFullStep","breakIntoHeatSteps","filterdSteppos","steppo","timeSteppoMaker","dateTime","absTime","hour","day","unfilteredHourSteppo","filteredHourSteppo","weekProjection","sillyAdditionThing","completeTaskProjection","entries","dayEntry","hourEntry","completeGrid","numberOfGrids","j","actualTimeOnTask","steps","almostMaxValue","max","s","colorMappings","colorScale","opacityScale","scaleSequential","this","classed","toString","humanize","currentTime","utc","timeOfDay","legend","legendRange","legendWidth","legendRect","exit","activityToSteppoCount","proj","accumElement","activityOptions","sort","b","find","opt","9001","FormControl","FormLabel","RadioGroup","row","aria-label","onChange","target","defaultValue","FormControlLabel","control","Radio","labelPlacement","Select","nextSelection","option","MenuItem","activityId","heightBoi","createActivity","trackedTime","addCurrentActivityToProjection","bottomCapActivity","bottomActivityIdentifier","bottomCapActivityName","bottomTime","bottomDuration","pieData","kvAccum","binBoi","totalTime","pieSVG","arcs","pie","padAngle","pieFlavored","radius","min","arcThing","arc","innerRadius","outerRadius","join","orderedPieData","slice","minHeight","ExpansionPanel","ExpansionPanelSummary","expandIcon","aria-controls","ExpansionPanelDetails","pomoCount","timer","paddingBottom","green","recovery","close","paddingRight","pomodoroSettings","numberOfCompletedPomodoro","ActivityTimeBar","startPausedRecovery","isTimer","isRecovery","isTimeBarActivity","Slide","timerBarClasses","getTimerBarClasses","pivotName","onResume","offline","alertColor","Tooltip","Zoom","download","InstallApplication","componentDidMount","sogosInstallPrompt","installPrompt","setInstallPromptState","askedToInstall","setAskedToInstall","addEventListener","hasInstallPrompt","firstTimeAsking","notInstalledAlready","matchMedia","matches","prompt","userChoice","choice","outcome","console","log","UpdateApplication","registration","setRegistrationState","didUpdate","setDidUpdate","detail","hasRegistration","hasUpdated","waiting","postMessage","GoalIcon","drawer","secondary","contrastText","fullList","menuButton","grow","MenuNavigation","topics","drawerOpen","setDrawerOpen","toggleDrawer","getListItem","topic","ListItem","button","ListItemIcon","ListItemText","menuTopics","List","textDecoration","slideProps","edge","Drawer","anchor","SlideProps","tabIndex","role","onKeyDown","shouldDisplay","link","React","anchorEl","setAnchorEl","Boolean","handleClose","AppBar","Toolbar","aria-owns","undefined","aria-haspopup","currentTarget","Menu","anchorOrigin","vertical","horizontal","transformOrigin","Transition","forwardRef","ref","goToLogin","Dialog","TransitionComponent","keepMounted","aria-labelledby","aria-describedby","DialogTitle","DialogContent","DialogContentText","DialogActions","Button","stopWatch","pivotContainer","pivotLabel","PausedPomodoro","stopwatch","resumeActivity","replace","snackBarWarn","amber","snackBaInfo","Snackbar","autoHideDuration","SnackbarContent","INFO","getConfetti","y","confetti","particleCount","spread","origin","tacModDownloaded","tacModThanked","yourName","myName","autoplay","onStart","media","mediaBackgroundStyle","whiteSpace","subtitle","orange","purple","alt","Confetti","cyan","LoggedInLayout","otherProperties","HistoryIcon","History","placeIcon","gridItem","placesToGo","description","navigator","withRouter","Grid","justify","item","placeToGo","xs","Card","CardActionArea","CardContent","OutOfSync","canRefreshToken","securityState","isAccessTokenValid","nowInSeconds","fetchTokenSaga","fetchTokenWithRefreshSaga","tokenHandler","BaseTokenRequestHandler","requestToken","tokenRequest","performTokenRequest","responseModifier","put","error","identityFunction","onlineSaga","offlineSaga","waitForWifi","initialNetworkStateSaga","initialInternetStateSaga","checkInternet","listenToNetworkEvents","rootSaga","createOnlineChannel","createNetworkChannel","createOfflineChannel","eventChannel","statusObserver","statusHandler","status","removeEventListener","onlineEventChannel","take","fork","iO","onLine","race","worked","didNot","all","refreshTokenSaga","refreshTokenWithReplacementSaga","refreshTokenRequestSaga","refreshTokenRequest","successResponse","failureResponse","initialConfigurations","TokenRequest","client_id","redirect_uri","callbackURI","grant_type","GRANT_TYPE_REFRESH_TOKEN","refresh_token","SessionExpiredException","Error","oauthConfigurationSaga","initialConfigurationSaga","accessTokenWithSessionExtensionSaga","accessTokenSagas","getOrRefreshAccessTokenWithSessionExtension","getOrRefreshAccessToken","awaitToken","getOrRefreshAccessTokenSaga","shouldTokenRefresh","oauthConfiguration","tokenReception","tokenFailure","readOnlyLocationSaga","readOnlySaga","attemptToGetReadOnlyToken","locationStuff","bridgeCode","substring","hasReadToken","notHasReadToken","attempt","performOpenGet","readOnlyTokenPayload","delay","readTokenFetchSaga","shouldRefreshReadToken","isReadTokenValid","performStreamedGet","getAuthorizationStuff","getVerificationStuff","createHeaders","getConfig","constructURL","performGetWithToken","performGet","performGetWithoutVerification","performGetWithoutSessionExtension","performFullOpenGet","performPost","performPut","performDelete","createStreamChannel","url","method","headers","body","requestStream","oboe","cached","withCredentials","done","jsonThingo","fail","END","abort","buffers","expanding","options","fullURL","streamChannel","aggregate","itemChunk","userEvent","fullUser","partialUser","timeout","userGuid","vK","Verification","accessTokenSaga","includeVerification","verificationStuff","baseHeaders","Authorization","apiURL","apiUrl","axios","get","post","delete","pomodoroActivityInitializationSaga","getCount","startOf","endOf","heading","typography","pxToRem","fontWeight","fontWeightRegular","toolbar","toolbarIcon","mixins","appBar","transition","transitions","create","easing","sharp","leavingScreen","appBarShift","enteringScreen","menuButtonHidden","fixedHeight","maxHeight","common","black","form","alignContent","LoadingIndicator","transform","PRIMARY_THEME_COLOR","selectedFrom","selectedTo","meowMinusSeven","timeSpan","focusedInput","setFocusedInput","Paper","InputLabel","startDate","startDateId","endDate","isOutsideRange","date","isSameOrBefore","endDateId","onDatesChange","fromUnix","toUnix","submitTimeFrame","onFocusChange","SharedPausedPomodoro","isPausedPomodoro","StyledBadge","badge","animation","Badge","avatar","SOGoSSharedLogo","grey","overlap","invisible","Avatar","CardMedia","responsiveFontSizes","createMuiTheme","outline","App","ThemeProvider","About","Dashboard","isLocalhost","hostname","match","registerValidSW","swUrl","config","serviceWorker","register","onupdatefound","installingWorker","installing","onstatechange","controller","onUpdate","onSuccess","catch","oauthInitializationSaga","authorizationServiceConfigurationKey","handle","authorizationRequestKey","queryStringBitch","BasicQueryStringUtils","getResponse","queryParams","AuthorizationResponse","code","getError","AuthorizationError","error_description","error_uri","completeAuthorizationRequest","authorizationHandler","storageBackend","getItem","authorizationRequest","JSON","parse","AuthorizationRequest","Promise","removeItem","request","response","resolve","completeRequest","result","uri","queryParamStart","clean_uri","replaceState","document","cleanUpURI","createOauthConfigurationObject","toJson","stringify","authorizationGrantSaga","requestedLoginSaga","loginSaga","performAuthorizationGrantFlowSaga","constructAuthorizationCodeGrantRequest","exchangeAuthorizationGrantForAccessToken","constructAuthorizationRequestHandler","notifier","AuthorizationNotifier","RedirectRequestHandler","setAuthorizationNotifier","performAuthorizationRequest","shouldRequestLogon","authorizationResult","scope","resolvedIdp","response_type","RESPONSE_TYPE_CODE","extras","identity_provider","NodeCrypto","codeVerifier","internal","code_verifier","GRANT_TYPE_AUTHORIZATION_CODE","activityLogoutSaga","constructRedirectURI","logoffPreFlightSaga","redirecto","logoutSaga","getRedirectParameter","queryParameter","getQueryParameter","isCognito","getClientIfNecessary","isOkta","getIdTokenIfNecessary","encodeURI","isKeycloak","initialConfiguration","pushRedirect","securityRequestSaga","listenToStartupEvent","listenToAppLifecycleEvents","listenToLoginEvents","waitBeforeLoggingIn","listenToSecurityEvents","takeEvery","fetchOAuthConfiguration","initialConfigurationFetchSaga","initialConfigurationResponseSaga","configData","protocol","port","backendConfigurations","authorizationServiceConfigurationSaga","oAuthConfigs","listenToApplicationEvents","listenToConfigurationRequestEvents","EventTypes","registerActivitySaga","activityUploadSaga","activityCacheSaga","isNotUnAuthorized","uploadType","CREATED","findUserSaga","requestUserSaga","userProfileSaga","sharedDashboardSaga","presignedAvatarUrlSaga","uploadAvatarSaga","userAvatarUploadSaga","userAvatarDownloadSaga","attemptToDownloadAvatar","attempts","profileInformation","contentLength","avatarBlobUrl","responseType","thing","presignedUrl","buildGravatarURL","resolvedEmail","hashedEmail","md5","trim","gravatar","blobbo","URL","createObjectURL","activityLogonSaga","handleNewActivity","updateCurrentActivity","updatePreviousActivity","handleError","delayWork","currentActivitySaga","isTimedActivity","getActivityType","getTimedType","wasNew","functionToRetry","pow","random","onlineStatus","isReadOnly","activitySyncSaga","audio","Audio","activityNotificationSaga","play","vibrate","listenToActivityEvents","archiveFetchSaga","historyInitializationSaga","historyObservationSaga","sharedHistoryObservationSaga","historyAdjustmentSaga","getOrUpdateFullFeed","updateFullFeed","updateSelection","firstActivityAdjustmentSaga","createHistoryAPIURL","fromDate","toDate","initialHistoryFeed","fullHistoryFeed","historyState","userState","olderHistory","updatedHistory","concat","newerHistory","fromRaw","abs","safeFrom","toRaw","veryFirstActivity","rightMeow","timeToMoveBack","capstoneHistorySaga","getFirstBefore","findOldestTimedActivity","getFirstAfter","findFirstActivityBeforeTime","findFirstActivityAfterTime","findCapstoneActivity","getFullHistory","selectedDateRange","fullRangeAndFeed","firstBefore","timeRange","maybeAfter","firstAfter","selectedFromDate","activityIndex","updatedActivityIndex","oldestActivity","findOldestTimedActivityInCache","oldActivity","currentOldie","selectedToRange","safeAfter","constructActivityBeforeURL","constructActivityAfterURL","relativeTime","urlBuilder","beforeURL","apiBeforeCapstoneSaga","addActivityAfter","apiAfterCapstoneSaga","currentActivityHistorySaga","initializeActivityFeedSaga","historyFeedAdjustmentSaga","historyAdjustmentCapstoneSaga","historyInitializationCapstoneSaga","listenToCurrentActivityEvents","listenToCapstoneEvents","HistorySagas","askedForHistory","privateHistory","publicHistory","foundUser","fullRangeAndActivities","objectiveCreationSaga","objectiveChangesSaga","objectiveTerminationSaga","objectiveCompletionSaga","objectiveCreateSaga","objectiveUpdateSaga","objectiveDeleteSaga","objectiveCompleteSaga","objectiveAPIInteractionSaga","objectiveUploadSaga","cacheObjectiveSaga","objectiveUploadToCached","objectiveUpdateToCached","objectiveDeleteToCached","objectiveCompleteToCached","_objective","OBJECTIVES_URL","UPDATED","DELETED","objectiveSaga","cachedObjectiveFunction","apiAction","cachingFunction","urlFunction","objectiveHistoryFetchSaga","objectiveObservationSaga","strategySyncSaga","objectiveObservationInitializationSaga","StrategySagas","tacticalActivitySyncSaga","removalReRankSaga","tacticalActivityHiddenSaga","tacticalActivityShownSaga","tacticalActivityState","allTacticalActivities","changedActivities","splice","activityCreationSaga","activityChangesSaga","activityRankSaga","activityTerminationSaga","activityCreateSaga","activityUpdateSaga","activityDeleteSaga","activityAPIInteractionSaga","cacheTacticalActivitySaga","activityUploadToCached","activityUpdateToCached","hasOwnProperty","activityDeleteToCached","activitySaga","cachedTacticalActivityFunction","TACTICAL_ACTIVITIES_URL","fetchSettings","settingsSyncSaga","settingsCacheSaga","updatePomodoroSaga","settingsUploadSaga","POMODORO_API","tacticalActivitiesFetchSaga","tacticalActivityObservationSaga","initializeTacticalSettings","initializeReadTacticalSettings","watchForSettingsUpdates","tacticalActivitiesObservationInitializationSaga","listenForTacticalEvents","checkCaches","inspectCaches","cachedItemsSaga","listenToCachingEvents","fetchUserGuidSaga","listenToEvents","CacheSagas","hasCachedItems","stateSelector","setTimer","pomodoroSaga","checkCurrentActivity","getTimerTime","stopTime","activityThatStartedThis","addThis","shouldKeepTiming","before","cA","pA","after","waitFor","waitForCurrentActivity","newCurrentActivity","areSame","stopWatchSaga","extractStartTime","sandsOfTimeSaga","extractState","firstActivity","userActivity","updateTime","focusSaga","delta","focusChannel","listener","startTimeSagas","tacModAffirmationSaga","tacModGratefulSaga","initialOnboardingSaga","setUpOnboardingSagas","initialWalkThroughSaga","SecuritySagas","ConfigurationSagas","TimeSagas","UserSagas","ActivitySagas","NetworkSagas","TacticalSagas","OnboardingSagas","createBrowserHistory","blackListTransform","createTransform","inboundState","persistConfig","storage","stateReconciler","autoMergeLevel2","whitelist","transforms","sagaMiddleware","createSagaMiddleware","store","createStore","persistReducer","commonMiddleware","thunk","routerMiddleware","applyMiddleware","fetchMiddleware","run","persistor","persistStore","fetchApplicationConfiguration","ReactDOM","getElementById","renderRefreshUI","dispatchEvent","CustomEvent","process","fetch","contentType","ready","unregister","reload","checkValidServiceWorker","initWorkboxRefresh","module","exports"],"mappings":"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","file":"static/js/main.c6f83011.chunk.js","sourcesContent":["import {EventTypes} from './EventTypes';\n\nexport enum ActivityType {\n ACTIVE = 'ACTIVE',\n PASSIVE = 'PASSIVE',\n NA = 'NA',\n}\n\nexport enum ActivityStrategy {\n GENERIC = 'GENERIC',\n}\n\nexport enum ActivityTimedType {\n NA = 'NA',\n NONE = 'NONE',\n TIMER = 'TIMER',\n STOP_WATCH = 'STOP_WATCH',\n}\n\nexport interface ActivityCacheEvent {\n cachedActivity: CachedActivity;\n userGUID: string;\n}\n\nexport interface ActivityContent {\n uuid: string;\n name: string;\n timedType: ActivityTimedType;\n type: ActivityType;\n paused?: boolean;\n autoStart?: boolean;\n veryFirstActivity?: boolean;\n activityID?: string;\n duration?: number;\n workStartedWomboCombo?: number;\n}\n\nexport interface Activity {\n antecedenceTime: number;\n content: ActivityContent;\n}\n\nexport const DEFAULT_ACTIVITY: Activity = {\n antecedenceTime: 0,\n content: {\n uuid: '',\n name: '',\n timedType: ActivityTimedType.NA,\n type: ActivityType.NA,\n },\n};\n\nexport interface CachedActivity {\n uploadType: EventTypes.CREATED | EventTypes.UPDATED | EventTypes.DELETED;\n activity: Activity;\n}\nexport interface ActivityRegistryFailure {\n error: any;\n activity: Activity;\n}\nexport const RECOVERY = 'RECOVERY';\n\nexport const getActivityContent = (activity: Activity): ActivityContent =>\n (activity && activity.content) || {};\nexport const getTimedType = (activity: Activity) =>\n getActivityContent(activity).timedType || ActivityTimedType.NONE;\nexport const getActivityType = (activity: Activity) =>\n getActivityContent(activity).type || ActivityType.PASSIVE;\nexport const getActivityName = (activity: Activity) =>\n getActivityContent(activity).name;\nexport const isPausedActivity = (activity: Activity) =>\n getActivityContent(activity).paused;\nexport const getActivityID = (activity: Activity) =>\n getActivityContent(activity).activityID ||\n (isActivityRecovery(activity) && RECOVERY) ||\n ActivityStrategy.GENERIC;\nconst getId = (activity: Activity) => getActivityContent(activity).uuid;\n\nexport const activitiesEqual = (\n currentActivity: Activity,\n activity: Activity,\n) => {\n const activityOneId = getId(currentActivity);\n return activityOneId === getId(activity) && !!activityOneId;\n};\nexport const isActivityRecovery = (activity: Activity) =>\n activity && activity.content && activity.content.name === RECOVERY;\n","import * as React from 'react';\nimport SOGoSIcon from '../../images/SOGoS.svg';\nimport ReactSVG from 'react-svg';\nimport {ColorType} from '../../types/StrategyTypes';\nimport {SizeType} from './MountainIcon';\n\ntype Props = {\n backgroundColor?: ColorType;\n lineColor?: ColorType;\n size?: SizeType;\n styles?: any\n};\n\nconst defaultSize: SizeType = {\n height: '150px',\n width: '150px',\n};\n\nexport const SOGoS = (props: Props) => {\n const {size, styles} = props;\n const usableSize = size || defaultSize;\n return (\n
\n {\n svg.setAttribute(\n 'width',\n String(usableSize.width || defaultSize.width),\n );\n svg.setAttribute(\n 'height',\n String(usableSize.height || defaultSize.height),\n );\n }}\n />\n
\n );\n};\n","import React, {FC} from 'react';\nimport makeStyles from '@material-ui/core/styles/makeStyles';\nimport Container from '@material-ui/core/Container';\nimport {Typography, Link} from '@material-ui/core';\nimport {SOGoS} from '../icons/SOGoS';\nimport {useDispatch} from \"react-redux\";\nimport {push} from \"connected-react-router\";\n\nconst useStyles = makeStyles(theme => ({\n headerContent: {\n borderRadius: theme.spacing(1),\n backgroundColor: theme.palette.background.paper,\n padding: theme.spacing(6, 0, 6),\n marginBottom: theme.spacing(1),\n },\n headerContentWithHover: {\n borderRadius: theme.spacing(1),\n backgroundColor: theme.palette.background.paper,\n padding: theme.spacing(6, 0, 6),\n marginBottom: theme.spacing(1),\n '&:hover': {\n boxShadow: '0px 2px 1px -1px rgba(0,0,0,0.2),0px 1px 1px 0px rgba(0,0,0,0.14),0px 1px 3px 0px rgba(0,0,0,0.12)',\n backgroundColor: '#fafafa'\n },\n },\n}));\n\ninterface Props {\n hideExcerpt?: boolean;\n navigateable?: boolean;\n}\n\nconst Banner: FC = ({\n children,\n hideExcerpt,\n navigateable\n }) => {\n const {headerContent, headerContentWithHover} = useStyles();\n\n const containerProps = navigateable ? {\n cursor: 'pointer',\n } : {};\n\n const dispetch = useDispatch();\n const navigateMaybe = () => {\n if (navigateable) {\n dispetch(push(\"/login\"));\n }\n }\n\n const navigateToAbout = () => {\n dispetch(push(('/about')));\n }\n return (\n
\n \n \n \n
\n \n \n SOGoS\n \n \n Strategic Orchestration and Governance System\n \n {\n !hideExcerpt &&\n <>\n \n Find out where your maximum potential lies. Then push yourself to the\n limits of your ability. Knowing that you can rest easy when\n you really need to.\n \n \n Read more about what SOGoS can do for you!\n \n \n }\n \n {children}\n \n
\n
\n
\n \n \n );\n};\nexport default Banner;\n","import React from 'react';\nimport {Link, Typography} from '@material-ui/core';\nimport Banner from '../components/Banner';\n\nexport const themeStyles = {\n root: {\n background: 'linear-gradient(45deg, #e49d2c 30%, #e0be5f 90%)',\n borderRadius: 3,\n border: 0,\n color: '#585858',\n height: 48,\n padding: '0 30px',\n boxShadow: '0 3px 5px 2px rgba(227, 158, 45, .5)',\n },\n label: {\n textTransform: 'capitalize',\n },\n};\n\nconst LoggedOut = () => {\n return (\n \n \n SOGos has fulfilled its purpose and has been sunset.\n \n \n For more information follow this link.\n \n \n );\n};\nexport default LoggedOut;\n","import {connect} from 'react-redux';\nimport * as React from 'react';\nimport {Redirect, Route} from 'react-router-dom';\nimport {GlobalState} from '../../reducers';\n\nconst PrivateRoute = ({\n isLoggedIn,\n component: Component,\n path,\n exact,\n ...rest\n}: {\n isLoggedIn: boolean;\n component: any;\n path: string;\n exact?: boolean;\n}) => (\n \n isLoggedIn ? (\n \n ) : (\n \n )\n }\n />\n);\n\nconst mapStateToProps = (state: GlobalState) => {\n const {\n security: {isLoggedIn},\n } = state;\n return {\n isLoggedIn,\n };\n};\n\nexport default connect(mapStateToProps)(PrivateRoute);\n","import * as React from 'react';\n\nconst getDisplayTime = (hours: number, minutes: number, seconds: number) => {\n const displayHours = hours ? `${hours}:` : '';\n const displayMinutes = Math.floor(Math.log10(minutes || 1))\n ? `${minutes}:`\n : `0${minutes}:`;\n const displaySeconds = Math.floor(Math.log10(seconds || 1))\n ? `${seconds}`\n : `0${seconds}`;\n return `${displayHours}${displayMinutes}${displaySeconds}`;\n};\n\nexport const TimeDisplay = ({timeElapsed}: {timeElapsed: number}) => {\n const hours = Math.floor(timeElapsed / 3600);\n const remainingTimeForMinutes = timeElapsed - hours * 3600;\n const minutes = Math.floor(remainingTimeForMinutes / 60);\n const seconds = remainingTimeForMinutes - minutes * 60;\n const displayTime = getDisplayTime(hours, minutes, seconds);\n return
{displayTime}
;\n};\n","import {NumberDictionary, StringDictionary} from '../types/BaseTypes';\n\nexport const objectToArray = (object: StringDictionary): T[] =>\n Object.keys(object || {}).map(key => object[key]);\n\nexport const numberObjectToArray = (object: NumberDictionary): T[] =>\n Object.keys(object || {}).map(key => object[key]);\n\nexport interface KeyValue {\n key: string;\n value: T;\n}\n\nexport const objectToKeyValueArray = (\n object: StringDictionary,\n): KeyValue[] =>\n Object.keys(object || {}).map(key => ({\n key,\n value: object[key],\n }));\n\nexport const reverseBinarySearch = (\n list: T[],\n comparator: (arg: T) => number,\n): number => {\n let low = 0;\n let high = list.length - 1;\n\n while (low <= high) {\n // eslint-disable-next-line no-bitwise\n const mid = (low + high) >>> 1;\n const midVal = list[mid];\n const cmp = comparator(midVal);\n\n if (cmp > 0) {\n low = mid + 1;\n } else if (cmp < 0) {\n high = mid - 1;\n } else {\n return mid;\n }\n }\n return -(low + 1);\n};\n","import * as React from 'react';\nimport Goal from '../../images/Goal.svg';\nimport ReactSVG from 'react-svg';\nimport {objectToArray} from '../../miscellanous/Tools';\nimport {ColorType} from '../../types/StrategyTypes';\n\nexport const findChild = (node: any, finder: (arg0: any) => boolean) => {\n const queue = [];\n const touched = [];\n queue.push(node);\n while (queue.length > 0) {\n const currentNode = queue.pop();\n touched.push(currentNode);\n if (finder(currentNode)) {\n touched.forEach(n => (n._checked = 0));\n return currentNode;\n } else {\n currentNode._checked = 1;\n objectToArray(currentNode.childNodes)\n .filter((n: any) => !n._checked)\n .forEach(n => queue.unshift(n));\n }\n }\n touched.forEach(n => (n._checked = 0));\n return undefined;\n};\n\nexport type SizeType = {\n width?: string | number;\n height?: string | number;\n};\n\ntype Props = {\n skyColor: ColorType;\n size?: SizeType;\n};\n\nconst defaultSize: SizeType = {\n height: '100px',\n width: '100px',\n};\nexport const MountainIcon = (props: Props) => {\n const {skyColor, size} = props;\n const usableSize = size || defaultSize;\n return (\n
\n {\n svg.setAttribute(\n 'width',\n String(usableSize.width || defaultSize.width),\n );\n svg.setAttribute(\n 'height',\n String(usableSize.height || defaultSize.height),\n );\n const background = findChild(svg, node => {\n return node.id && node.id.indexOf('sky') > -1;\n });\n background.setAttribute('fill', skyColor.hex);\n background.setAttribute('fill-opacity', skyColor.opacity);\n }}\n />\n
\n );\n};\n","import * as React from 'react';\nimport Activity from '../../images/ActivityIcon.svg';\nimport ReactSVG from 'react-svg';\nimport {findChild, SizeType} from './MountainIcon';\nimport {ColorType} from '../../types/StrategyTypes';\n\ntype Props = {\n backgroundColor?: ColorType;\n lineColor?: ColorType;\n size?: SizeType;\n};\n\nconst defaultSize: SizeType = {\n height: '100px',\n width: '100px',\n};\n\nexport const defaultBackground: ColorType = {\n hex: '#1fdb1f',\n opacity: 1,\n};\n\nexport const defaultLine: ColorType = {\n hex: '#44932d',\n opacity: 1,\n};\n\nexport const ActivityIcon = (props: Props) => {\n const {backgroundColor, lineColor, size} = props;\n const usableBackground: ColorType = {\n ...defaultBackground,\n ...(backgroundColor || {}),\n };\n const usableLine: ColorType = {\n ...defaultLine,\n ...(lineColor || {}),\n };\n\n const usableSize = size || defaultSize;\n\n const alterColor = (\n svg: any,\n childID: any,\n usableColorType: any,\n modifier: any = (node: any, color: ColorType) => {\n node.setAttribute('fill', color.hex);\n node.setAttribute('fill-opacity', String(color.opacity));\n },\n ) => {\n const background = findChild(svg, (node: any) => {\n return node.id && node.id.startsWith(childID);\n });\n modifier(background, usableColorType);\n };\n\n return (\n {\n svg.setAttribute(\n 'width',\n String(usableSize.width || defaultSize.width),\n );\n svg.setAttribute(\n 'height',\n String(usableSize.height || defaultSize.height),\n );\n alterColor(\n svg,\n 'activityLine',\n usableLine,\n (node: any, color: ColorType) => {\n node.setAttribute('stroke', color.hex);\n node.setAttribute('stroke-opacity', String(color.opacity));\n },\n );\n alterColor(svg, 'activityBackground', usableBackground);\n }}\n />\n );\n};\n","import * as React from 'react';\nimport {ActivityIcon, defaultBackground, defaultLine} from './ActivityIcon';\nimport {TacticalActivity} from '../../types/TacticalTypes';\nimport {SizeType} from './MountainIcon';\n\ntype TacticalActivityIconProps = {\n tacticalActivity?: TacticalActivity;\n size?: SizeType;\n};\nexport const TacticalActivityIcon = ({\n tacticalActivity,\n size,\n}: TacticalActivityIconProps) => {\n const iconCustomization = (tacticalActivity || {}).iconCustomization;\n const backgroundColor =\n (iconCustomization && iconCustomization.background) || defaultBackground;\n const lineColor =\n (iconCustomization && iconCustomization.line) || defaultLine;\n return (\n
\n \n
\n );\n};\n","import {UserProfile, UserResponse} from '../types/UserTypes';\nimport {BaseEvent, PayloadEvent} from './Event';\n\nexport const FAILED_REQUESTED_USER: 'FAILED_REQUESTED_USER' =\n 'FAILED_REQUESTED_USER';\nexport const RECEIVED_USER: 'RECEIVED_USER' = 'RECEIVED_USER';\nexport const RECEIVED_USER_PROFILE: 'RECEIVED_USER_PROFILE' = 'RECEIVED_USER_PROFILE';\nexport const RECEIVED_PARTIAL_USER: 'RECEIVED_PARTIAL_USER' = 'RECEIVED_PARTIAL_USER';\nexport const SELECTED_AVATAR: 'SELECTED_AVATAR' = 'SELECTED_AVATAR';\nexport const UPLOADED_AVATAR: 'UPLOADED_AVATAR' = 'UPLOADED_AVATAR';\nexport const DOWNLOADED_AVATAR: 'DOWNLOADED_AVATAR' = 'DOWNLOADED_AVATAR';\nexport const FAILED_TO_UPLOAD_AVATAR: 'FAILED_TO_UPLOAD_AVATAR' = 'FAILED_TO_UPLOAD_AVATAR';\nexport const UPDATED_SHARED_DASHBOARD: 'UPDATED_SHARED_DASHBOARD' = 'UPDATED_SHARED_DASHBOARD';\nexport const SYNCED_SHARED_DASHBOARD: 'SYNCED_SHARED_DASHBOARD' = 'SYNCED_SHARED_DASHBOARD';\nexport const CHECKED_CACHES: 'CHECKED_CACHES' = 'CHECKED_CACHES';\nexport const CACHED_DATA: 'CACHED_DATA' = 'CACHED_DATA';\nexport const SYNCED_DATA: 'SYNCED_DATA' = 'SYNCED_DATA';\nexport const REQUESTED_SYNC: 'REQUESTED_SYNC' = 'REQUESTED_SYNC';\nexport const LANDED_ON_SHARE: 'LANDED_ON_SHARE' = 'LANDED_ON_SHARE';\n\nexport const createReceivedUserEvent = (\n user: UserResponse,\n): PayloadEvent => ({\n type: RECEIVED_USER,\n payload: user,\n});\n\nexport const createReceivedPartialUserEvent = (\n userIdentifier: string,\n): PayloadEvent => ({\n type: RECEIVED_PARTIAL_USER,\n payload: userIdentifier,\n});\n\nexport const createReceivedUserProfileEvent = (\n userProfile: UserProfile,\n): PayloadEvent => ({\n type: RECEIVED_USER_PROFILE,\n payload: userProfile,\n});\n\nexport const createUploadAvatarEvent = (\n avatarUrl: string,\n): PayloadEvent => ({\n type: SELECTED_AVATAR,\n payload: avatarUrl,\n});\n\nexport const createUploadedAvatarEvent = (\n avatarUrl: string,\n): PayloadEvent => ({\n type: UPLOADED_AVATAR,\n payload: avatarUrl,\n});\n\nexport const createDownloadedAvatarEvent = (\n avatarUrl: string,\n): PayloadEvent => ({\n type: DOWNLOADED_AVATAR,\n payload: avatarUrl,\n});\n\nexport const createFailedToUploadAvatarEvent = (\n avatarUrl: string,\n): PayloadEvent => ({\n type: FAILED_TO_UPLOAD_AVATAR,\n payload: avatarUrl,\n});\n\nexport const createUserUpdatedSharedDashboardEvent = (\n hasShared: boolean,\n): PayloadEvent => ({\n type: UPDATED_SHARED_DASHBOARD,\n payload: hasShared,\n});\nexport const createSyncedSharedDashboardUpdateEvent = (\n hasShared: boolean,\n): PayloadEvent => ({\n type: SYNCED_SHARED_DASHBOARD,\n payload: hasShared,\n});\n\nexport const createRequestedSyncEvent = (): BaseEvent => ({\n type: REQUESTED_SYNC,\n});\n\nexport const createCheckedCachesEvent = (\n hasItemsToCache: boolean,\n): PayloadEvent => ({\n type: CHECKED_CACHES,\n payload: hasItemsToCache,\n});\n\nexport const createCachedDataEvent = (): BaseEvent => ({\n type: CACHED_DATA,\n});\n\nexport const createSyncedDataEvent = (): BaseEvent => ({\n type: SYNCED_DATA,\n});\n\nexport const createFailedToGetUserEvent = (\n error: Error,\n): PayloadEvent => ({\n type: FAILED_REQUESTED_USER,\n payload: error,\n});\n\nexport const createLandedOnSharedBridgeEvent = (\n shareId: string,\n): PayloadEvent => ({\n type: LANDED_ON_SHARE,\n payload: shareId\n});\n","import {TokenRequest, TokenResponse} from '@openid/appauth';\nimport {OAuthConfig} from '../types/ConfigurationTypes';\nimport {PayloadEvent} from \"./Event\";\nimport {ReceivedReadToken} from \"../types/SecurityTypes\";\n\nexport const LOGGED_ON: 'LOGGED_ON' = 'LOGGED_ON';\nexport const LOGGED_OFF: 'LOGGED_OFF' = 'LOGGED_OFF';\nexport const REQUESTED_LOGOFF: 'REQUESTED_LOGOFF' = 'REQUESTED_LOGOFF';\nexport const REQUESTED_LOGON: 'REQUESTED_LOGON' = 'REQUESTED_LOGON';\nexport const REQUESTED_READ_ONLY_MODE: 'REQUESTED_READ_ONLY_MODE' = 'REQUESTED_READ_ONLY_MODE';\nexport const REQUESTED_AUTH_CHECK: 'REQUESTED_AUTH_CHECK' =\n 'REQUESTED_AUTH_CHECK';\nexport const CHECKED_AUTH: 'CHECKED_AUTH' = 'CHECKED_AUTH';\nexport const FORCED_LOGIN: 'FORCED_LOGIN' = 'FORCED_LOGIN';\nexport const RECEIVED_TOKENS: 'RECEIVED_TOKENS' = 'RECEIVED_TOKENS';\nexport const FAILED_TO_RECEIVE_TOKEN: 'FAILED_TO_RECEIVE_TOKEN' =\n 'FAILED_TO_RECEIVE_TOKEN';\nexport const INITIALIZED_SECURITY: 'INITIALIZED_SECURITY' =\n 'INITIALIZED_SECURITY';\nexport const EXPIRED_SESSION: 'EXPIRED_SESSION' = 'EXPIRED_SESSION';\nexport const RECEIVED_READ_TOKEN: 'RECEIVED_READ_TOKEN' = 'RECEIVED_READ_TOKEN';\nexport const FAILED_TO_RECEIVE_READ_TOKEN: 'FAILED_TO_RECEIVE_READ_TOKEN' = 'FAILED_TO_RECEIVE_READ_TOKEN';\n\nexport const createReceivedReadToken = (readTokenPayload: ReceivedReadToken): PayloadEvent => ({\n type: RECEIVED_READ_TOKEN,\n payload: readTokenPayload,\n});\n\nexport const createFailedToReceiveReadToken =\n (userIdentifier: string): PayloadEvent => ({\n type: FAILED_TO_RECEIVE_READ_TOKEN,\n payload: userIdentifier,\n })\n\nexport const requestLogoff = () => ({\n type: REQUESTED_LOGOFF,\n});\n\nexport const createRequestedReadOnlyMode = () => ({\n type: REQUESTED_READ_ONLY_MODE,\n});\n\nexport const createRequestLogonEvent = (identityProvider: string): PayloadEvent => ({\n type: REQUESTED_LOGON,\n payload: identityProvider,\n});\n\nexport const createForcedLoginEvent = () => ({\n type: FORCED_LOGIN,\n});\n\nexport const createExpiredSessionEvent = () => ({\n type: EXPIRED_SESSION,\n});\n\nexport const requestAuthorizationGrantCheck = (oauthConfig: OAuthConfig) => ({\n type: REQUESTED_AUTH_CHECK,\n payload: oauthConfig,\n});\n\nexport const createTokenReceptionEvent = (tokenResponse: TokenResponse) => ({\n type: RECEIVED_TOKENS,\n payload: tokenResponse,\n});\n\nexport type TokenFailurePayload = {\n tokenRequest: TokenRequest;\n error: any;\n};\n\nexport const createTokenFailureEvent = (\n tokenFailurePayload: TokenFailurePayload,\n) => ({\n type: FAILED_TO_RECEIVE_TOKEN,\n payload: tokenFailurePayload,\n});\n\nexport const createSecurityInitializedEvent = () => ({\n type: INITIALIZED_SECURITY,\n});\n\nexport const createCheckedAuthorizationEvent = () => ({\n type: CHECKED_AUTH,\n});\n\nexport const createLoggedOffEvent = () => ({\n type: LOGGED_OFF,\n});\n\nexport const createLoggedOnAction = () => ({\n type: LOGGED_ON,\n});\n","import {\n Activity,\n ActivityCacheEvent,\n ActivityContent,\n ActivityRegistryFailure,\n ActivityTimedType,\n} from '../types/ActivityTypes';\nimport {RememberedPomodoro} from '../types/TacticalTypes';\nimport {BaseEvent, PayloadEvent} from './Event';\n\nexport const STARTED_ACTIVITY = 'STARTED_ACTIVITY';\nexport const CACHED_ACTIVITY = 'CACHED_ACTIVITY';\nexport const SYNCED_ACTIVITIES = 'SYNCED_ACTIVITIES';\nexport const FOUND_PREVIOUS_ACTIVITY = 'FOUND_PREVIOUS_ACTIVITY';\nexport const STARTED_TIMED_ACTIVITY = 'STARTED_TIMED_ACTIVITY';\nexport const STARTED_NON_TIMED_ACTIVITY = 'STARTED_NON_TIMED_ACTIVITY';\nexport const RESUMED_TIMED_ACTIVITY = 'RESUMED_TIMED_ACTIVITY';\nexport const RESUMED_NON_TIMED_ACTIVITY = 'RESUMED_NON_TIMED_ACTIVITY';\nexport const REGISTERED_ACTIVITY_START = 'REGISTERED_ACTIVITY_START';\nexport const FAILED_TO_REGISTER_ACTIVITY_START =\n 'FAILED_TO_REGISTER_ACTIVITY_START';\nexport const INITIALIZED_CURRENT_ACTIVITY = 'INITIALIZED_CURRENT_ACTIVITY';\n\nexport const INITIALIZED_POMODORO = 'INITIALIZED_POMODORO';\nexport const COMPLETED_POMODORO = 'COMPLETED_POMODORO';\nexport const ACKNOWLEDGED_TACMOD = 'ACKNOWLEDGED_TACMOD';\nexport const AFFIRMED_ACKNOWLEDGMENT = 'AFFIRMED_ACKNOWLEDGMENT';\nexport const THANKED_FOR_TACMOD = 'THANKED_FOR_TACMOD';\nexport const SYNCED_THANKED_FOR_TACMOD = 'SYNCED_THANKED_FOR_TACMOD';\nexport const USER_WELCOMED = 'USER_WELCOMED';\nexport const SYNCED_USER_WELCOMED = 'SYNCED_USER_WELCOMED';\n\nexport const HIDE_TIMER = 'HIDE_TIMER';\nexport const SHOW_TIMER = 'SHOW_TIMER';\nexport const CAPSTONED_ACTIVITIES: 'CAPSTONED_ACTIVITIES' =\n 'CAPSTONED_ACTIVITIES';\n\nexport const createHideTimerEvent = (): BaseEvent => ({\n type: HIDE_TIMER,\n});\nexport const createShowTimerEvent = (): BaseEvent => ({\n type: SHOW_TIMER,\n});\n\nexport const createAcknowledgedTacModEvent = (): BaseEvent => ({\n type: ACKNOWLEDGED_TACMOD,\n});\nexport const createWelcomedUserEvent = (): BaseEvent => ({\n type: USER_WELCOMED,\n});\nexport const createSyncedUserWelcomed = (): BaseEvent => ({\n type: SYNCED_USER_WELCOMED,\n});\nexport const createThankedForDownloadingTacModEvent = (): BaseEvent => ({\n type: THANKED_FOR_TACMOD,\n});\nexport const createSyncedThankedForDownloadingTacModEvent = (): BaseEvent => ({\n type: SYNCED_THANKED_FOR_TACMOD,\n});\nexport const createAffirmedTabModAcknowledgementEvent = (): BaseEvent => ({\n type: AFFIRMED_ACKNOWLEDGMENT,\n});\n\nexport const createCapstoneActivitesEvent = (\n oldestActivity: Activity,\n newestActivity: Activity,\n) => ({\n type: CAPSTONED_ACTIVITIES,\n payload: {\n oldestActivity,\n newestActivity,\n },\n});\n\nexport const createCompletedPomodoroEvent = (): BaseEvent => ({\n type: COMPLETED_POMODORO,\n});\n\nexport const createInitializedPomodoroEvent = (\n rememberedPomodoro: RememberedPomodoro,\n): PayloadEvent => ({\n type: INITIALIZED_POMODORO,\n payload: rememberedPomodoro,\n});\n\nexport const createStartedActivityEvent = (\n content: ActivityContent,\n): PayloadEvent => ({\n type: STARTED_ACTIVITY,\n payload: {\n antecedenceTime: new Date().getTime(),\n content,\n },\n});\n\nexport const createStartedTimedActivityEvent = (\n content: ActivityContent,\n): PayloadEvent => ({\n type: STARTED_TIMED_ACTIVITY,\n payload: {\n antecedenceTime: new Date().getTime(),\n content,\n },\n});\n\nexport const createStartedNonTimedActivityEvent = (\n content: ActivityContent,\n): PayloadEvent => ({\n type: STARTED_NON_TIMED_ACTIVITY,\n payload: {\n antecedenceTime: new Date().getTime(),\n content: {\n ...content,\n timedType: ActivityTimedType.NONE,\n },\n },\n});\n\nexport const createResumedStartedTimedActivityEvent = (\n activity: Activity,\n): PayloadEvent => ({\n type: RESUMED_TIMED_ACTIVITY,\n payload: activity,\n});\n\nexport const createInitializedCurrentActivityEvent = (\n activity: Activity,\n): PayloadEvent => ({\n type: INITIALIZED_CURRENT_ACTIVITY,\n payload: activity,\n});\n\nexport const createFoundPreviousActivityActivityEvent = (\n activity: Activity,\n): PayloadEvent => ({\n type: FOUND_PREVIOUS_ACTIVITY,\n payload: activity,\n});\n\nexport const createResumedStartedNonTimedActivityEvent = (\n activity: Activity,\n): PayloadEvent => ({\n type: RESUMED_NON_TIMED_ACTIVITY,\n payload: activity,\n});\n\nexport const createCachedActivityEvent = (\n activity: ActivityCacheEvent,\n): PayloadEvent => ({\n type: CACHED_ACTIVITY,\n payload: activity,\n});\n\nexport const createSyncedActivitiesEvent = (\n userGUID: string,\n): PayloadEvent => ({\n type: SYNCED_ACTIVITIES,\n payload: userGUID,\n});\n\nexport const createRegisteredStartEvent = (\n activity: Activity,\n): PayloadEvent => ({\n type: REGISTERED_ACTIVITY_START,\n payload: activity,\n});\n\nexport const createFailureToRegisterStartEvent = (\n activityRegistryFailure: ActivityRegistryFailure,\n): PayloadEvent => ({\n type: FAILED_TO_REGISTER_ACTIVITY_START,\n payload: activityRegistryFailure,\n});\n","import {\n CHECKED_CACHES,\n DOWNLOADED_AVATAR,\n RECEIVED_PARTIAL_USER,\n RECEIVED_USER,\n RECEIVED_USER_PROFILE\n} from '../events/UserEvents';\nimport {FAILED_TO_RECEIVE_READ_TOKEN, LOGGED_OFF} from '../events/SecurityEvents';\nimport {User, UserOnBoarding} from '../types/UserTypes';\nimport {ACKNOWLEDGED_TACMOD, THANKED_FOR_TACMOD, USER_WELCOMED} from '../events/ActivityEvents';\n\nexport type UserMiscellaneous = {\n hasItemsCached: boolean;\n onboarding: UserOnBoarding;\n};\n\nexport type UserState = {\n information: User;\n miscellaneous: UserMiscellaneous;\n};\nexport const INITIAL_USER_STATE: UserState = {\n information: {\n firstName: '',\n lastName: '',\n email: '',\n fullName: '',\n guid: '',\n userName: '',\n },\n miscellaneous: {\n hasItemsCached: false,\n onboarding: {},\n },\n};\n\nconst userReducer = (state: UserState = INITIAL_USER_STATE, action: any) => {\n switch (action.type) {\n case ACKNOWLEDGED_TACMOD:\n return {\n ...state,\n miscellaneous: {\n ...state.miscellaneous,\n onboarding: {\n ...state.miscellaneous.onboarding,\n TacModNotified: true,\n },\n },\n };\n case USER_WELCOMED:\n return {\n ...state,\n miscellaneous: {\n ...state.miscellaneous,\n onboarding: {\n ...state.miscellaneous.onboarding,\n welcomed: true,\n },\n },\n };\n case THANKED_FOR_TACMOD:\n return {\n ...state,\n miscellaneous: {\n ...state.miscellaneous,\n onboarding: {\n ...state.miscellaneous.onboarding,\n TacModThanked: true,\n },\n },\n };\n case RECEIVED_USER_PROFILE:\n return {\n ...state,\n information: {\n ...state.information,\n ...action.payload,\n }\n }\n case RECEIVED_PARTIAL_USER:\n return {\n ...state,\n information: {\n ...state.information,\n guid: action.payload,\n }\n }\n case RECEIVED_USER:\n return {\n ...state,\n information: {\n ...state.information,\n ...action.payload.information,\n },\n miscellaneous: {\n ...state.miscellaneous,\n onboarding: action.payload.misc.onboarding || {},\n },\n };\n case DOWNLOADED_AVATAR:\n return {\n ...state,\n information: {\n ...state.information,\n localAvatar: action.payload,\n },\n };\n case LOGGED_OFF:\n case FAILED_TO_RECEIVE_READ_TOKEN:\n return INITIAL_USER_STATE;\n case CHECKED_CACHES: {\n return {\n ...state,\n miscellaneous: {\n ...state.miscellaneous,\n hasItemsCached: action.payload,\n },\n };\n }\n\n default:\n return state;\n }\n};\n\nexport default userReducer;\n","import {INITIAL_SECURITY_STATE, SecurityState, SharedStatus} from '../SecurityReducer';\nimport {TokenResponse} from '@openid/appauth';\nimport jwtDecode from 'jwt-decode';\nimport {ReceivedReadToken, TokenInformation} from \"../../types/SecurityTypes\";\n\nfunction mapTokenClaims(decodedToken: any) {\n return {\n issuedAt: decodedToken.iat,\n expiresAt: decodedToken.exp,\n expiresHuman: new Date(decodedToken.exp * 1000 || 0).toISOString(),\n };\n}\n\nfunction decodeAndMapToken(token: string) {\n const decodedToken = jwtDecode(token);\n return mapTokenClaims(decodedToken)\n}\n\nfunction parseRefreshToken(refreshToken: string): TokenInformation {\n try {\n return decodeAndMapToken(refreshToken);\n } catch (e) {\n return INITIAL_SECURITY_STATE.refreshTokenInformation;\n }\n}\n\nconst getRefreshTokenInformation = (refreshToken: string | undefined) => {\n if (refreshToken) {\n return {\n refreshTokenInformation: parseRefreshToken(refreshToken),\n };\n } else {\n return {};\n }\n};\n\nexport const tokenReceptionReducer = (\n state: SecurityState,\n tokenReceptionPayload: TokenResponse,\n): SecurityState => {\n const accessToken = tokenReceptionPayload.idToken || tokenReceptionPayload.accessToken;\n return {\n ...state,\n accessToken,\n accessTokenInformation: parseRefreshToken(accessToken),\n ...getRefreshTokenInformation(tokenReceptionPayload.refreshToken),\n refreshToken: tokenReceptionPayload.refreshToken || state.refreshToken,\n idToken: tokenReceptionPayload.idToken,\n realAccessToken: tokenReceptionPayload.accessToken\n };\n};\n\nexport const readTokenReceptionReducer = (\n state: SecurityState,\n tokenReceptionPayload: ReceivedReadToken,\n): SecurityState => ({\n ...state,\n readToken: tokenReceptionPayload.readToken,\n readTokenInformation: decodeAndMapToken(tokenReceptionPayload.readToken),\n readOnly: true,\n hasShared: SharedStatus.SHARED,\n});\n","import {\n EXPIRED_SESSION,\n FAILED_TO_RECEIVE_READ_TOKEN,\n INITIALIZED_SECURITY,\n LOGGED_OFF,\n LOGGED_ON,\n RECEIVED_READ_TOKEN,\n RECEIVED_TOKENS, REQUESTED_LOGON,\n} from '../events/SecurityEvents';\nimport {readTokenReceptionReducer, tokenReceptionReducer} from './security/TokenReducer';\nimport {RECEIVED_USER, UPDATED_SHARED_DASHBOARD} from '../events/UserEvents';\nimport {TokenInformation} from '../types/SecurityTypes';\nimport {TIME_IS_WACK} from '../events/ApplicationLifecycleEvents';\nimport omit from 'lodash/omit';\n\nexport enum SharedStatus {\n UNKNOWN, NOT_SHARED, SHARED\n}\n\nexport type SecurityState = {\n isLoggedIn: boolean;\n accessToken: string;\n accessTokenInformation: TokenInformation;\n refreshToken: string;\n refreshTokenInformation: TokenInformation;\n idToken?: string;\n realAccessToken: string;\n verificationKey: string;\n isExpired: boolean;\n isInitialized: boolean;\n isOutOfSync: boolean;\n readOnly: boolean;\n readToken: string;\n hasShared: SharedStatus;\n shareCode?: string;\n identityProvider?: string;\n readTokenInformation: TokenInformation;\n};\n\nconst defaultTokenInfo = {\n issuedAt: 0,\n expiresAt: 69,\n expiresHuman: '69',\n};\nexport const INITIAL_SECURITY_STATE: SecurityState = {\n refreshTokenInformation: defaultTokenInfo,\n accessToken: '',\n accessTokenInformation: defaultTokenInfo,\n idToken: '',\n refreshToken: '',\n verificationKey: '',\n isLoggedIn: false,\n realAccessToken: '',\n isExpired: false,\n isInitialized: false,\n isOutOfSync: false,\n readToken: '',\n readOnly: false,\n hasShared: SharedStatus.UNKNOWN,\n readTokenInformation: defaultTokenInfo,\n};\n\nconst securityReducer = (state = INITIAL_SECURITY_STATE, action: any) => {\n switch (action.type) {\n case LOGGED_ON:\n return {\n ...state,\n isLoggedIn: true,\n };\n case LOGGED_OFF:\n return {\n ...INITIAL_SECURITY_STATE,\n identityProvider: state.identityProvider\n };\n case FAILED_TO_RECEIVE_READ_TOKEN:\n return {\n ...omit(state, ['readToken']),\n hasShared: SharedStatus.NOT_SHARED\n }\n case REQUESTED_LOGON: {\n return {\n ...state,\n identityProvider: action.payload,\n }\n }\n case EXPIRED_SESSION:\n delete state.refreshToken;\n delete state.refreshTokenInformation;\n return {\n ...state,\n isExpired: true,\n };\n case INITIALIZED_SECURITY:\n return {\n ...state,\n isExpired: false,\n isInitialized: true,\n };\n case TIME_IS_WACK:\n return {\n ...state,\n isOutOfSync: true,\n };\n case UPDATED_SHARED_DASHBOARD:\n return {\n ...state,\n hasShared: action.payload ? SharedStatus.SHARED : SharedStatus.NOT_SHARED\n }\n case RECEIVED_READ_TOKEN:\n return readTokenReceptionReducer(state, action.payload);\n case RECEIVED_TOKENS:\n return tokenReceptionReducer(state, action.payload);\n case RECEIVED_USER:\n return {\n ...state,\n ...action.payload.security,\n hasShared: action.payload.security ?\n action.payload.security.hasShared ? SharedStatus.SHARED :\n SharedStatus.NOT_SHARED : SharedStatus.UNKNOWN,\n };\n default:\n return state;\n }\n};\n\nexport default securityReducer;\n","import {\n DISMISSED_NOTIFICATION,\n REQUESTED_NOTIFICATION,\n SAVED_REDIRECT,\n} from '../events/MiscEvents';\nimport {FAILED_TO_UPLOAD_AVATAR, SELECTED_AVATAR, UPLOADED_AVATAR} from \"../events/UserEvents\";\n\nexport enum NotificationType {\n WARNING, INFO, UNKNOWN\n}\n\nexport interface NotificationState {\n message: string;\n shown: boolean;\n type: NotificationType;\n}\n\n\nexport enum UploadStatus {\n NOT_STARTED, UPLOADING, COMPLETED, FAILED\n}\nexport interface AvatarUploadState {\n uploadStatus: UploadStatus;\n}\n\nexport interface MiscellaneousState {\n notification: NotificationState;\n redirectPath: string;\n avatarUpload: AvatarUploadState;\n}\n\nexport const INITIAL_MISC_STATE: MiscellaneousState = {\n notification: {\n message: 'We done goofed.',\n shown: false,\n type: NotificationType.WARNING,\n },\n avatarUpload: {\n uploadStatus: UploadStatus.NOT_STARTED\n },\n redirectPath: '',\n};\n\nconst MiscellaneousReducer = (\n state: MiscellaneousState = INITIAL_MISC_STATE,\n action: any,\n): MiscellaneousState => {\n switch (action.type) {\n case SELECTED_AVATAR:\n return {\n ...state,\n avatarUpload: {\n ...state.avatarUpload,\n uploadStatus: UploadStatus.UPLOADING,\n }\n }\n case UPLOADED_AVATAR:\n return {\n ...state,\n avatarUpload: {\n ...state.avatarUpload,\n uploadStatus: UploadStatus.COMPLETED,\n }\n }\n case FAILED_TO_UPLOAD_AVATAR:\n return {\n ...state,\n avatarUpload: {\n ...state.avatarUpload,\n uploadStatus: UploadStatus.FAILED,\n }\n }\n case DISMISSED_NOTIFICATION:\n return {\n ...state,\n notification: {\n ...state.notification,\n shown: false,\n },\n };\n case REQUESTED_NOTIFICATION:\n return {\n ...state,\n notification: {\n message: action.payload.message,\n shown: true,\n type: action.payload.type,\n },\n };\n case SAVED_REDIRECT:\n return {\n ...state,\n redirectPath: action.payload,\n };\n default:\n return state;\n }\n};\n\nexport default MiscellaneousReducer;\n","export const INITIALIZED_APPLICATION: 'INITIALIZED_APPLICATION' =\n 'INITIALIZED_APPLICATION';\nexport const TIME_IS_WACK: 'TIME_IS_WACK' = 'TIME_IS_WACK';\n\nexport const createApplicationInitializedEvent = () => ({\n type: INITIALIZED_APPLICATION,\n});\n\nexport const createOutOfSyncEvent = () => ({\n type: TIME_IS_WACK,\n});\n","import {InitialConfig, OAuthConfig} from '../types/ConfigurationTypes';\nimport {BaseEvent, PayloadEvent} from './Event';\n\nexport const REQUESTED_OAUTH_CONFIGURATION: 'REQUESTED_OAUTH_CONFIGURATION' =\n 'REQUESTED_OAUTH_CONFIGURATION';\nexport const REQUESTED_INITIAL_CONFIGURATION: 'REQUESTED_INITIAL_CONFIGURATION' =\n 'REQUESTED_INITIAL_CONFIGURATION';\nexport const FAILED_RECEPTION_INITIAL_CONFIGURATION: 'FAILED_RECEPTION_INITIAL_CONFIGURATION' =\n 'FAILED_RECEPTION_INITIAL_CONFIGURATION';\nexport const FOUND_INITIAL_CONFIGURATION: 'FOUND_INITIAL_CONFIGURATION' =\n 'FOUND_INITIAL_CONFIGURATION';\nexport const RECEIVED_OAUTH_CONFIGURATION: 'RECEIVED_OAUTH_CONFIGURATION' =\n 'RECEIVED_OAUTH_CONFIGURATION';\nexport const RECEIVED_REMOTE_OAUTH_CONFIGURATION: 'RECEIVED_REMOTE_OAUTH_CONFIGURATION' =\n 'RECEIVED_REMOTE_OAUTH_CONFIGURATION';\nexport const FAILED_TO_RECEIVE_REMOTE_OAUTH_CONFIGURATION: 'FAILED_TO_RECEIVE_REMOTE_OAUTH_CONFIGURATION' =\n 'FAILED_TO_RECEIVE_REMOTE_OAUTH_CONFIGURATION';\nexport const RECEIVED_INITIAL_CONFIGURATION: 'RECEIVED_INITIAL_CONFIGURATION' =\n 'RECEIVED_INITIAL_CONFIGURATION';\nexport const RECEIVED_PARTIAL_INITIAL_CONFIGURATION: 'RECEIVED_PARTIAL_INITIAL_CONFIGURATION' =\n 'RECEIVED_PARTIAL_INITIAL_CONFIGURATION';\nexport const NOTIFICATION_ANSWERED: 'NOTIFICATION_ANSWERED' =\n 'NOTIFICATION_ANSWERED';\n\nexport const createFailedToGetRemoteOAuthConfigurationsEvent = (): BaseEvent => ({\n type: FAILED_TO_RECEIVE_REMOTE_OAUTH_CONFIGURATION,\n});\n\nexport const createReceivedOAuthConfigurations = (\n oauthConfig: OAuthConfig,\n): PayloadEvent => ({\n type: RECEIVED_OAUTH_CONFIGURATION,\n payload: oauthConfig,\n});\n\nexport const createNotificationPermissionReceivedEvent = (\n notificationPermission: String,\n): PayloadEvent => ({\n type: NOTIFICATION_ANSWERED,\n payload: notificationPermission,\n});\n\nexport const createReceivedRemoteOAuthConfigurations = (\n oauthConfig: OAuthConfig,\n): PayloadEvent => ({\n type: RECEIVED_REMOTE_OAUTH_CONFIGURATION,\n payload: oauthConfig,\n});\n\nexport const createReceivedInitialConfigurationsEvent = (\n initialConfig: InitialConfig,\n): PayloadEvent => ({\n type: RECEIVED_INITIAL_CONFIGURATION,\n payload: initialConfig,\n});\n\nexport const createReceivedPartialInitialConfigurationsEvent = (\n initialConfig: InitialConfig,\n): PayloadEvent => ({\n type: RECEIVED_PARTIAL_INITIAL_CONFIGURATION,\n payload: initialConfig,\n});\n\nexport const createFailedToGetInitialConfigurationsEvent = (\n error: Error,\n): PayloadEvent => ({\n type: FAILED_RECEPTION_INITIAL_CONFIGURATION,\n payload: error,\n});\n\nexport const createFoundInitialConfigurationsEvent = (\n initialConfig: InitialConfig,\n): PayloadEvent => ({\n type: FOUND_INITIAL_CONFIGURATION,\n payload: initialConfig,\n});\n\nexport const createRequestForInitialConfigurations = (): BaseEvent => ({\n type: REQUESTED_INITIAL_CONFIGURATION,\n});\n\nexport const requestOAuthConfigurations = (): BaseEvent => ({\n type: REQUESTED_OAUTH_CONFIGURATION,\n});\n","import {\n NOTIFICATION_ANSWERED,\n RECEIVED_INITIAL_CONFIGURATION,\n RECEIVED_PARTIAL_INITIAL_CONFIGURATION,\n RECEIVED_REMOTE_OAUTH_CONFIGURATION,\n} from '../events/ConfigurationEvents';\nimport {\n InitialConfig,\n MiscellaneousConfig,\n NOT_ASKED,\n OAuthConfig,\n} from '../types/ConfigurationTypes';\n\nexport type ConfigurationState = {\n oauth: OAuthConfig;\n initial: InitialConfig;\n miscellaneous: MiscellaneousConfig;\n};\n\nexport const INITIAL_CONFIGURATION_STATE: ConfigurationState = {\n oauth: {\n authorizationEndpoint: '',\n endSessionEndpoint: '',\n revocationEndpoint: '',\n tokenEndpoint: '',\n userInfoEndpoint: '',\n },\n initial: {\n clientID: '',\n authorizationEndpoint: '',\n appClientID: '',\n logoutEndpoint: '',\n userInfoEndpoint: '',\n tokenEndpoint: '',\n openIDConnectURI: '',\n provider: '',\n },\n miscellaneous: {\n notificationsAllowed: NOT_ASKED,\n },\n};\n\nexport const configurationReducer = (\n state: ConfigurationState = INITIAL_CONFIGURATION_STATE,\n action: any,\n) => {\n switch (action.type) {\n case RECEIVED_REMOTE_OAUTH_CONFIGURATION:\n return {\n ...state,\n oauth: {\n ...state.oauth,\n ...action.payload,\n },\n };\n case RECEIVED_INITIAL_CONFIGURATION:\n case RECEIVED_PARTIAL_INITIAL_CONFIGURATION:\n return {\n ...state,\n initial: {\n ...state.initial,\n ...action.payload,\n },\n };\n case NOTIFICATION_ANSWERED:\n return {\n ...state,\n miscellaneous: {\n ...state.miscellaneous,\n notificationsAllowed: action.payload,\n },\n };\n default:\n return state;\n }\n};\n\nexport default configurationReducer;\n","export interface OAuthConfig {\n authorizationEndpoint: string;\n endSessionEndpoint: string;\n revocationEndpoint: string;\n tokenEndpoint: string;\n userInfoEndpoint: string;\n}\n\nexport interface InitialConfig {\n clientID: string;\n appClientID: string;\n authorizationEndpoint: string;\n logoutEndpoint: string;\n userInfoEndpoint: string;\n tokenEndpoint: string;\n openIDConnectURI: string;\n provider: string;\n callbackURI?: string;\n apiURL?: string;\n stagingURL?: string;\n}\n\nexport interface MiscellaneousConfig {\n notificationsAllowed: string;\n}\n\nexport const NOT_ASKED = 'NOT_ASKED';\n","import {\n CACHED_ACTIVITY,\n COMPLETED_POMODORO,\n FOUND_PREVIOUS_ACTIVITY, HIDE_TIMER,\n INITIALIZED_POMODORO,\n RESUMED_NON_TIMED_ACTIVITY,\n RESUMED_TIMED_ACTIVITY, SHOW_TIMER,\n STARTED_NON_TIMED_ACTIVITY,\n STARTED_TIMED_ACTIVITY,\n SYNCED_ACTIVITIES,\n} from '../events/ActivityEvents';\nimport {objectToKeyValueArray} from '../miscellanous/Tools';\nimport {\n Activity,\n ActivityTimedType,\n ActivityType,\n CachedActivity,\n} from '../types/ActivityTypes';\nimport {StringDictionary} from '../types/BaseTypes';\nimport reduceRight from 'lodash/reduceRight';\nimport {FAILED_TO_RECEIVE_READ_TOKEN, LOGGED_OFF} from '../events/SecurityEvents';\n\nexport type RememberedPomodoro = {\n dateCounted: number;\n count: number;\n};\n\nexport type ActivityState = {\n shouldTime: boolean;\n currentActivity: Activity;\n previousActivity: Activity;\n completedPomodoro: RememberedPomodoro;\n cache: StringDictionary;\n};\n\nexport const defaultActivity = {\n antecedenceTime: 0,\n content: {\n uuid: '',\n name: '',\n timedType: ActivityTimedType.NONE,\n type: ActivityType.PASSIVE,\n paused: false,\n autoStart: false,\n },\n};\nexport const INITIAL_ACTIVITY_STATE: ActivityState = {\n shouldTime: false,\n currentActivity: defaultActivity,\n previousActivity: defaultActivity,\n completedPomodoro: {\n dateCounted: 0,\n count: 0,\n },\n cache: {},\n};\n\nconst activityReducer = (\n state: ActivityState = INITIAL_ACTIVITY_STATE,\n action: any,\n): ActivityState => {\n switch (action.type) {\n case LOGGED_OFF:\n case FAILED_TO_RECEIVE_READ_TOKEN:\n return {\n ...INITIAL_ACTIVITY_STATE,\n cache: state.cache,\n };\n case INITIALIZED_POMODORO:\n return {\n ...state,\n completedPomodoro: action.payload,\n };\n case COMPLETED_POMODORO:\n return {\n ...state,\n completedPomodoro: {\n ...state.completedPomodoro,\n count: state.completedPomodoro.count + 1,\n },\n };\n case STARTED_TIMED_ACTIVITY:\n case RESUMED_TIMED_ACTIVITY:\n return {\n ...state,\n shouldTime: true,\n previousActivity: state.currentActivity.antecedenceTime\n ? state.currentActivity\n : state.previousActivity,\n currentActivity: action.payload,\n };\n case STARTED_NON_TIMED_ACTIVITY:\n case RESUMED_NON_TIMED_ACTIVITY:\n return {\n ...state,\n shouldTime: false,\n previousActivity: state.currentActivity.antecedenceTime\n ? state.currentActivity\n : state.previousActivity,\n currentActivity: action.payload,\n };\n case HIDE_TIMER:\n return {\n ...state,\n shouldTime: false,\n }\n case SHOW_TIMER:\n return {\n ...state,\n shouldTime: true,\n }\n case FOUND_PREVIOUS_ACTIVITY:\n return {\n ...state,\n previousActivity: action.payload,\n };\n case CACHED_ACTIVITY: {\n const {userGUID, cachedActivity} = action.payload;\n if (state.cache[userGUID]) {\n state.cache[userGUID].push(cachedActivity);\n } else {\n state.cache[userGUID] = [cachedActivity];\n }\n return {\n ...state,\n cache: {\n ...state.cache,\n },\n };\n }\n case SYNCED_ACTIVITIES: {\n return {\n ...state,\n cache: {\n ...reduceRight(\n objectToKeyValueArray(state.cache).filter(\n keyValues => keyValues.key !== action.payload,\n ),\n (accum: StringDictionary, keyValue) => {\n accum[keyValue.key] = keyValue.value;\n return accum;\n },\n {},\n ),\n },\n };\n }\n default:\n return state;\n }\n};\n\nexport default activityReducer;\n","import {\n FOUND_INTERNET,\n FOUND_WIFI,\n LOST_INTERNET,\n LOST_WIFI,\n} from '../events/NetworkEvents';\n\nexport interface NetworkState {\n isOnline: boolean;\n hasInternet: boolean;\n}\n\nexport const INITIAL_NETWORK_STATE: NetworkState = {\n isOnline: false,\n hasInternet: false,\n};\n\nconst networkReducer = (\n state: NetworkState = INITIAL_NETWORK_STATE,\n action: any,\n) => {\n switch (action.type) {\n case FOUND_WIFI:\n return {\n ...state,\n isOnline: true,\n };\n case FOUND_INTERNET:\n return {\n ...state,\n hasInternet: true,\n };\n case LOST_WIFI:\n return {\n ...state,\n isOnline: false,\n };\n case LOST_INTERNET:\n return {\n ...state,\n hasInternet: false,\n };\n default:\n return state;\n }\n};\n\nexport default networkReducer;\n","import {BaseEvent} from './Event';\n\nexport const FOUND_WIFI: 'FOUND_WIFI' = 'FOUND_WIFI';\nexport const LOST_WIFI: 'LOST_WIFI' = 'LOST_WIFI';\nexport const FOUND_INTERNET: 'FOUND_INTERNET' = 'FOUND_INTERNET';\nexport const LOST_INTERNET: 'LOST_INTERNET' = 'LOST_INTERNET';\n\nexport const createFoundWifiEvent = (): BaseEvent => ({\n type: FOUND_WIFI,\n});\nexport const createLostWifiEvent = (): BaseEvent => ({\n type: LOST_WIFI,\n});\n\nexport const createFoundInternetEvent = (): BaseEvent => ({\n type: FOUND_INTERNET,\n});\nexport const createLostInternetEvent = (): BaseEvent => ({\n type: LOST_INTERNET,\n});\n","import {Activity} from '../types/ActivityTypes';\nimport {DateRange} from '../types/HistoryTypes';\nimport {BaseEvent, PayloadEvent} from './Event';\n\nexport const UPDATED_HISTORY_SELECTION: 'UPDATED_HISTORY_SELECTION' =\n 'UPDATED_HISTORY_SELECTION';\nexport const UPDATED_FULL_FEED: 'UPDATED_FULL_FEED' = 'UPDATED_FULL_FEED';\nexport const INITIALIZED_HISTORY: 'INITIALIZED_HISTORY' = 'INITIALIZED_HISTORY';\nexport const FOUND_BEFORE_CAPSTONE: 'FOUND_BEFORE_CAPSTONE' =\n 'FOUND_BEFORE_CAPSTONE';\nexport const FOUND_AFTER_CAPSTONE: 'FOUND_AFTER_CAPSTONE' =\n 'FOUND_AFTER_CAPSTONE';\nexport const UPDATED_CAPSTONES: 'UPDATED_CAPSTONES' = 'UPDATED_CAPSTONES';\nexport const UPDATED_HISTORY: 'UPDATED_HISTORY' = 'UPDATED_HISTORY';\nexport const VIEWED_HISTORY: 'VIEWED_HISTORY' = 'VIEWED_HISTORY';\nexport const VIEWED_SHARED_HISTORY: 'VIEWED_SHARED_HISTORY' = 'VIEWED_SHARED_HISTORY';\nexport const ADJUSTED_HISTORY: 'ADJUSTED_HISTORY' = 'ADJUSTED_HISTORY';\n\nexport interface ActivityReceptionPayload {\n activities: Activity[];\n between: DateRange;\n}\n\nexport interface CapstoneActivityUpdatePayload {\n beforeCapstone: Activity;\n afterCapstone: Activity;\n}\n\nexport interface ActivityUpdatePayload {\n selection: ActivityReceptionPayload;\n full: ActivityReceptionPayload;\n}\n\nexport const createViewedHistoryEvent = (): BaseEvent => ({\n type: VIEWED_HISTORY,\n});\n\nexport const createViewedSharedHistoryEvent = (): BaseEvent => ({\n type: VIEWED_SHARED_HISTORY,\n});\n\nexport const createInitializedHistoryEvent = (\n activityUpdate: ActivityUpdatePayload,\n): PayloadEvent => ({\n type: INITIALIZED_HISTORY,\n payload: activityUpdate,\n});\n\nexport const createUpdatedHistoryEvent = (\n activityUpdate: ActivityUpdatePayload,\n): PayloadEvent => ({\n type: UPDATED_HISTORY,\n payload: activityUpdate,\n});\n\nexport const createFoundBeforeCapstoneEvent = (\n capstoneActivity: Activity,\n): PayloadEvent => ({\n type: FOUND_BEFORE_CAPSTONE,\n payload: capstoneActivity,\n});\n\nexport const createFoundAfterCapstoneEvent = (\n capstoneActivity: Activity,\n): PayloadEvent => ({\n type: FOUND_AFTER_CAPSTONE,\n payload: capstoneActivity,\n});\n\nexport const createUpdatedCapstonesEvent = (\n capstoneActivityUpdatePayload: CapstoneActivityUpdatePayload,\n): PayloadEvent => ({\n type: UPDATED_CAPSTONES,\n payload: capstoneActivityUpdatePayload,\n});\n\nexport const createUpdatedHistorySelectionEvent = (\n activityUpdate: ActivityReceptionPayload,\n): PayloadEvent => ({\n type: UPDATED_HISTORY_SELECTION,\n payload: activityUpdate,\n});\n\nexport const createUpdatedFullFeedEvent = (\n activityUpdate: ActivityReceptionPayload,\n): PayloadEvent => ({\n type: UPDATED_FULL_FEED,\n payload: activityUpdate,\n});\n\nexport const createAdjustedHistoryTimeFrame = (\n dateRange: DateRange,\n): PayloadEvent => ({\n type: ADJUSTED_HISTORY,\n payload: dateRange,\n});\n","import {\n ActivityReceptionPayload,\n ActivityUpdatePayload, ADJUSTED_HISTORY,\n CapstoneActivityUpdatePayload,\n INITIALIZED_HISTORY,\n UPDATED_CAPSTONES,\n UPDATED_FULL_FEED,\n UPDATED_HISTORY,\n UPDATED_HISTORY_SELECTION,\n} from '../events/HistoryEvents';\nimport {Activity} from '../types/ActivityTypes';\nimport {defaultActivity} from './ActivityReducer';\nimport {FAILED_TO_RECEIVE_READ_TOKEN} from \"../events/SecurityEvents\";\n\nexport interface DateRange {\n from: number;\n to: number;\n}\n\nexport interface CapstoneState {\n topActivity: Activity;\n bottomActivity: Activity;\n}\n\nexport interface HistoryState {\n activityFeed: Activity[];\n selectedHistoryRange: DateRange;\n fullFeed: Activity[];\n fullHistoryRange: DateRange;\n capstone: CapstoneState;\n loading: boolean;\n}\n\nconst DEFAULT_RANGE: DateRange = {\n from: 0,\n to: 69,\n};\n\nexport const INITIAL_HISTORY_STATE: HistoryState = {\n activityFeed: [],\n fullFeed: [],\n selectedHistoryRange: DEFAULT_RANGE,\n fullHistoryRange: DEFAULT_RANGE,\n capstone: {\n topActivity: defaultActivity,\n bottomActivity: defaultActivity,\n },\n loading: false,\n};\n\nconst HistoryReducer = (\n state: HistoryState = INITIAL_HISTORY_STATE,\n action: any,\n): HistoryState => {\n switch (action.type) {\n case FAILED_TO_RECEIVE_READ_TOKEN:\n return INITIAL_HISTORY_STATE;\n case INITIALIZED_HISTORY:\n case UPDATED_HISTORY:\n const payload: ActivityUpdatePayload = action.payload;\n return {\n ...state,\n activityFeed: payload.selection.activities,\n selectedHistoryRange: payload.selection.between,\n fullFeed: payload.full.activities,\n fullHistoryRange: payload.full.between,\n };\n case UPDATED_FULL_FEED:\n const newFullFeedPayload: ActivityReceptionPayload = action.payload;\n return {\n ...state,\n fullHistoryRange: newFullFeedPayload.between,\n fullFeed: newFullFeedPayload.activities,\n };\n case UPDATED_HISTORY_SELECTION:\n const newSelectionPayload: ActivityReceptionPayload = action.payload;\n return {\n ...state,\n selectedHistoryRange: newSelectionPayload.between,\n activityFeed: newSelectionPayload.activities,\n };\n case ADJUSTED_HISTORY:\n return {\n ...state,\n loading: true,\n };\n case UPDATED_CAPSTONES:\n const newCapstones: CapstoneActivityUpdatePayload = action.payload;\n return {\n ...state,\n loading: false,\n capstone: {\n topActivity: newCapstones.afterCapstone,\n bottomActivity: newCapstones.beforeCapstone,\n },\n };\n default:\n return state;\n }\n};\n\nexport default HistoryReducer;\n","import {Objective, ObjectiveCacheEvent} from '../types/StrategyTypes';\nimport {BaseEvent, PayloadEvent} from './Event';\n\nexport const VIEWED_OBJECTIVES: 'VIEWED_OBJECTIVES' = 'VIEWED_OBJECTIVES';\nexport const CREATED_OBJECTIVE: 'CREATED_OBJECTIVE' = 'CREATED_OBJECTIVE';\nexport const UPDATED_OBJECTIVE: 'UPDATED_OBJECTIVE' = 'UPDATED_OBJECTIVE';\nexport const DELETED_OBJECTIVE: 'DELETED_OBJECTIVE' = 'DELETED_OBJECTIVE';\nexport const COMPLETED_OBJECTIVE: 'COMPLETED_OBJECTIVE' = 'COMPLETED_OBJECTIVE';\nexport const SYNCED_OBJECTIVE: 'SYNCED_OBJECTIVE' = 'SYNCED_OBJECTIVE';\nexport const SYNCED_OBJECTIVES: 'SYNCED_OBJECTIVES' = 'SYNCED_OBJECTIVES';\nexport const CACHED_OBJECTIVE: 'CACHED_OBJECTIVE' = 'CACHED_OBJECTIVE';\nexport const FOUND_OBJECTIVES: 'FOUND_OBJECTIVES' = 'FOUND_OBJECTIVES';\n\nexport const createViewedObjectivesEvent = (): BaseEvent => ({\n type: VIEWED_OBJECTIVES,\n});\n\nexport const createCachedObjectiveEvent = (\n objectiveCacheEvent: ObjectiveCacheEvent,\n): PayloadEvent => ({\n type: CACHED_OBJECTIVE,\n payload: objectiveCacheEvent,\n});\n\nexport const createFetchedObjectivesEvent = (\n objectiveHistory: Objective[],\n): PayloadEvent => ({\n type: FOUND_OBJECTIVES,\n payload: objectiveHistory,\n});\n\nexport const createSyncedObjectiveEvent = (\n objective: Objective,\n): PayloadEvent => ({\n type: SYNCED_OBJECTIVE,\n payload: objective,\n});\n\nexport const createSyncedObjectivesEvent = (\n userGUID: string,\n): PayloadEvent => ({\n type: SYNCED_OBJECTIVES,\n payload: userGUID,\n});\n\nexport const createCreatedObjectiveEvent = (\n objective: Objective,\n): PayloadEvent => ({\n type: CREATED_OBJECTIVE,\n payload: objective,\n});\n\nexport const createUpdatedObjectiveEvent = (\n objective: Objective,\n): PayloadEvent => ({\n type: UPDATED_OBJECTIVE,\n payload: objective,\n});\n\nexport const createDeletedObjectiveEvent = (\n objective: Objective,\n): PayloadEvent => ({\n type: DELETED_OBJECTIVE,\n payload: objective,\n});\n\nexport const createCompletedObjectiveEvent = (\n objective: Objective,\n): PayloadEvent => ({\n type: COMPLETED_OBJECTIVE,\n payload: objective,\n});\n","import {\n CACHED_OBJECTIVE,\n COMPLETED_OBJECTIVE,\n CREATED_OBJECTIVE,\n DELETED_OBJECTIVE,\n FOUND_OBJECTIVES,\n SYNCED_OBJECTIVES,\n UPDATED_OBJECTIVE,\n} from '../events/StrategyEvents';\nimport {objectToArray, objectToKeyValueArray} from '../miscellanous/Tools';\nimport {CachedObjective, KeyResult, Objective} from '../types/StrategyTypes';\nimport {HasId, StringDictionary} from '../types/BaseTypes';\nimport {FAILED_TO_RECEIVE_READ_TOKEN, LOGGED_OFF} from '../events/SecurityEvents';\n\nexport interface StrategyState {\n objectives: StringDictionary;\n keyResults: StringDictionary;\n cache: StringDictionary;\n}\n\nconst INITIAL_STRATEGY_STATE: StrategyState = {\n objectives: {},\n keyResults: {},\n cache: {},\n};\n\nexport const dictionaryReducer = (\n accum: StringDictionary,\n toIndex: T,\n) => {\n accum[toIndex.id] = toIndex;\n return accum;\n};\n\nconst updateStateWithObjectives = (\n newObjectives: Objective[],\n newKeyResults: KeyResult[],\n state: StrategyState,\n): StrategyState => {\n const objectives = [\n ...objectToArray(state.objectives),\n ...newObjectives,\n ].reduce(dictionaryReducer, {});\n const keyResults = [\n ...objectToArray(state.keyResults),\n ...newKeyResults,\n ].reduce(dictionaryReducer, {});\n return {\n ...state,\n objectives,\n keyResults,\n };\n};\n\nconst StrategyReducer = (\n state: StrategyState = INITIAL_STRATEGY_STATE,\n action: any,\n) => {\n switch (action.type) {\n case LOGGED_OFF:\n case FAILED_TO_RECEIVE_READ_TOKEN:\n return {\n ...INITIAL_STRATEGY_STATE,\n cache: state.cache,\n };\n case CREATED_OBJECTIVE:\n case UPDATED_OBJECTIVE:\n const newObjective = [action.payload];\n const keyResult = action.payload.keyResults;\n return updateStateWithObjectives(newObjective, keyResult, state);\n case DELETED_OBJECTIVE:\n case COMPLETED_OBJECTIVE:\n const {payload} = action;\n const deletedObjective: Objective = payload;\n const newObjectives = objectToArray(state.objectives).filter(\n suspiciousObjective => suspiciousObjective.id !== deletedObjective.id,\n );\n const newKeyResults = objectToArray(state.keyResults).filter(\n possibleRemovableKeyResult =>\n deletedObjective.keyResults.filter(\n keyResultToRemove =>\n keyResultToRemove.id === possibleRemovableKeyResult.id,\n ).length === 0,\n );\n return {\n ...state,\n objectives: newObjectives.reduce(dictionaryReducer, {}),\n keyResults: newKeyResults.reduce(dictionaryReducer, {}),\n };\n case FOUND_OBJECTIVES:\n const rememberedObjectives = action.payload.reduce(dictionaryReducer, {});\n const rememberedKeyResults = action.payload\n .flatMap((foundObjective: Objective) => foundObjective.keyResults)\n .reduce(dictionaryReducer, {});\n return {\n ...state,\n objectives: rememberedObjectives,\n keyResults: rememberedKeyResults,\n };\n case CACHED_OBJECTIVE: {\n const {userGUID, objective} = action.payload;\n if (state.cache[userGUID]) {\n state.cache[userGUID].push(objective);\n } else {\n state.cache[userGUID] = [objective];\n }\n return {\n ...state,\n cache: {\n ...state.cache,\n },\n };\n }\n case SYNCED_OBJECTIVES: {\n return {\n ...state,\n cache: {\n ...objectToKeyValueArray(state.cache)\n .filter(keyValues => keyValues.key !== action.payload)\n .reduce((accum: StringDictionary, keyValue) => {\n accum[keyValue.key] = keyValue.value;\n return accum;\n }, {}),\n },\n };\n }\n default:\n return state;\n }\n};\n\nexport default StrategyReducer;\n","import {\n PomodoroSettings,\n PomodoroSettingsRegistryFailure,\n TacticalActivity,\n TacticalActivityCacheEvent,\n} from '../types/TacticalTypes';\nimport {BaseEvent, PayloadEvent} from './Event';\n\nexport const CREATED_ACTIVITY: 'CREATED_ACTIVITY' = 'CREATED_ACTIVITY';\nexport const UPDATED_ACTIVITY: 'UPDATED_ACTIVITY' = 'UPDATED_ACTIVITY';\nexport const DELETED_ACTIVITY: 'DELETED_ACTIVITY' = 'DELETED_ACTIVITY';\nexport const REQUESTED_ACTIVITY_DELETION: 'REQUESTED_ACTIVITY_DELETION' =\n 'REQUESTED_ACTIVITY_DELETION';\nexport const HID_ACTIVITY: 'HID_ACTIVITY' = 'HID_ACTIVITY';\nexport const UNHID_ACTIVITY: 'UNHID_ACTIVITY' = 'UNHID_ACTIVITY';\nexport const FOUND_ACTIVITIES: 'FOUND_ACTIVITIES' = 'FOUND_ACTIVITIES';\nexport const RESTORED_ACTIVITY: 'RESTORED_ACTIVITY' = 'RESTORED_ACTIVITY';\nexport const REPLACE_ACTIVITIES: 'REPLACE_ACTIVITIES' = 'REPLACE_ACTIVITIES';\nexport const ARCHIVED_ACTIVITY: 'ARCHIVED_ACTIVITY' = 'ARCHIVED_ACTIVITY';\nexport const RANKED_ACTIVITIES: 'RANKED_ACTIVITIES' = 'RANKED_ACTIVITIES';\nexport const CACHED_TACTICAL_ACTIVITY: 'CACHED_TACTICAL_ACTIVITY' =\n 'CACHED_TACTICAL_ACTIVITY';\nexport const VIEWED_ACTIVITIES: 'VIEWED_ACTIVITIES' = 'VIEWED_ACTIVITIES';\nexport const VIEWED_ACTIVITY_SELECTION: 'VIEWED_ACTIVITY_SELECTION' = 'VIEWED_ACTIVITY_SELECTION';\nexport const SYNCED_TACTICAL_ACTIVITIES: 'SYNCED_TACTICAL_ACTIVITIES' =\n 'SYNCED_TACTICAL_ACTIVITIES';\nexport const SYNCED_TACTICAL_ACTIVITY: 'SYNCED_TACTICAL_ACTIVITY' =\n 'SYNCED_TACTICAL_ACTIVITY';\n\nexport const UPDATED_POMODORO_SETTINGS: 'UPDATED_POMODORO_SETTINGS' =\n 'UPDATED_POMODORO_SETTINGS';\nexport const FOUND_POMODORO_SETTINGS: 'FOUND_POMODORO_SETTINGS' =\n 'FOUND_POMODORO_SETTINGS';\nexport const CACHED_SETTINGS: 'CACHED_SETTINGS' = 'CACHED_SETTINGS';\nexport const VIEWED_SETTINGS: 'VIEWED_SETTINGS' = 'VIEWED_SETTINGS';\nexport const SYNCED_SETTINGS: 'SYNCED_SETTINGS' = 'SYNCED_SETTINGS';\nexport const REGISTERED_POMODORO_SETTINGS: 'REGISTERED_POMODORO_SETTINGS' =\n 'REGISTERED_POMODORO_SETTINGS';\nexport const FAILED_TO_REGISTER_POMODORO_SETTINGS: 'FAILED_TO_REGISTER_POMODORO_SETTINGS' =\n 'FAILED_TO_REGISTER_POMODORO_SETTINGS';\n\nexport interface SettingsCacheEvent {\n cachedSettings: PomodoroSettings;\n userGUID: string;\n}\n\nexport const createUpdatedPomodoroSettingsEvent = (\n pomodoroSettings: PomodoroSettings,\n): PayloadEvent => ({\n type: UPDATED_POMODORO_SETTINGS,\n payload: pomodoroSettings,\n});\n\nexport const createFoundPomodoroSettingsEvent = (\n pomodoroSettings: PomodoroSettings,\n): PayloadEvent => ({\n type: FOUND_POMODORO_SETTINGS,\n payload: pomodoroSettings,\n});\n\nexport const createViewedSettingsEvent = (): BaseEvent => ({\n type: VIEWED_SETTINGS,\n});\n\nexport const createCachedSettingsEvent = (\n cachedSettings: SettingsCacheEvent,\n): PayloadEvent => ({\n type: CACHED_SETTINGS,\n payload: cachedSettings,\n});\n\nexport const createSyncedSettingsEvent = (\n userGUID: string,\n): PayloadEvent => ({\n type: SYNCED_SETTINGS,\n payload: userGUID,\n});\n\nexport const createRegisteredPomodoroSettingsEvent = (\n pomodoroSettings: PomodoroSettings,\n): PayloadEvent => ({\n type: REGISTERED_POMODORO_SETTINGS,\n payload: pomodoroSettings,\n});\n\nexport const createFailureToRegisterPomodoroSettingsEvent = (\n pomodoroSettingsRegistryFailure: PomodoroSettingsRegistryFailure,\n): PayloadEvent => ({\n type: FAILED_TO_REGISTER_POMODORO_SETTINGS,\n payload: pomodoroSettingsRegistryFailure,\n});\n\nexport const createViewedTacticalActivitesEvent = (): BaseEvent => ({\n type: VIEWED_ACTIVITIES,\n});\n\nexport const createViewedActivitySelectionEvent = (): BaseEvent => ({\n type: VIEWED_ACTIVITY_SELECTION,\n});\n\nexport const createCachedTacticalActivityEvent = (\n tacticalActivityCacheEvent: TacticalActivityCacheEvent,\n): PayloadEvent => ({\n type: CACHED_TACTICAL_ACTIVITY,\n payload: tacticalActivityCacheEvent,\n});\n\nexport const createFetchedTacticalActivitesEvent = (\n tacticalActivityHistory: TacticalActivity[],\n): PayloadEvent => ({\n type: FOUND_ACTIVITIES,\n payload: tacticalActivityHistory,\n});\n\nexport const createReplaceActiveActivitesEvent = (\n tacticalActivityHistory: TacticalActivity[],\n): PayloadEvent => ({\n type: REPLACE_ACTIVITIES,\n payload: tacticalActivityHistory,\n});\n\nexport const createReRankedTacticalActivitiesEvent = (\n tacticalActivityHistory: TacticalActivity[],\n): PayloadEvent => ({\n type: RANKED_ACTIVITIES,\n payload: tacticalActivityHistory,\n});\n\nexport const createSyncedTacticalActivityEvent = (\n tacticalActivity: TacticalActivity,\n): PayloadEvent => ({\n type: SYNCED_TACTICAL_ACTIVITY,\n payload: tacticalActivity,\n});\n\nexport const createSyncedTacticalActivitiesEvent = (\n userGUID: string,\n): PayloadEvent => ({\n type: SYNCED_TACTICAL_ACTIVITIES,\n payload: userGUID,\n});\n\nexport const createCreatedTacticalActivityEvent = (\n tacticalActivity: TacticalActivity,\n): PayloadEvent => ({\n type: CREATED_ACTIVITY,\n payload: tacticalActivity,\n});\n\nexport const createUpdatedTacticalActivityEvent = (\n tacticalActivity: TacticalActivity,\n): PayloadEvent => ({\n type: UPDATED_ACTIVITY,\n payload: tacticalActivity,\n});\n\nexport const createDeletedTacticalActivityEvent = (\n tacticalActivity: TacticalActivity,\n): PayloadEvent => ({\n type: DELETED_ACTIVITY,\n payload: tacticalActivity,\n});\n\nexport const createRequestToDeleteTacticalActivityEvent = (\n tacticalActivity: TacticalActivity,\n): PayloadEvent => ({\n type: REQUESTED_ACTIVITY_DELETION,\n payload: tacticalActivity,\n});\n\nexport const createHideTacticalActivityEvent = (\n tacticalActivity: TacticalActivity,\n): PayloadEvent => ({\n type: HID_ACTIVITY,\n payload: tacticalActivity,\n});\n\nexport const createArchivedTacticalActivityEvent = (\n tacticalActivity: TacticalActivity,\n): PayloadEvent => ({\n type: ARCHIVED_ACTIVITY,\n payload: tacticalActivity,\n});\n\nexport const createRestoredTacticalActivityEvent = (\n tacticalActivity: TacticalActivity,\n): PayloadEvent => ({\n type: RESTORED_ACTIVITY,\n payload: tacticalActivity,\n});\n\nexport const createShowTacticalActivityEvent = (\n tacticalActivity: TacticalActivity,\n): PayloadEvent => ({\n type: UNHID_ACTIVITY,\n payload: tacticalActivity,\n});\n","import {\n numberObjectToArray,\n objectToKeyValueArray,\n} from '../miscellanous/Tools';\nimport {INITIAL_TACTICAL_STATE} from './TacticalReducer';\nimport {\n ARCHIVED_ACTIVITY,\n CACHED_TACTICAL_ACTIVITY,\n CREATED_ACTIVITY,\n DELETED_ACTIVITY,\n FOUND_ACTIVITIES,\n REPLACE_ACTIVITIES,\n RESTORED_ACTIVITY,\n SYNCED_TACTICAL_ACTIVITIES,\n UPDATED_ACTIVITY,\n} from '../events/TacticalEvents';\nimport {dictionaryReducer} from './StrategyReducer';\nimport {\n CachedTacticalActivity,\n TacticalActivity,\n TacticalState,\n} from '../types/TacticalTypes';\nimport {NumberDictionary, StringDictionary} from '../types/BaseTypes';\nimport reduceRight from 'lodash/reduceRight';\n\nexport const rankReducer = (\n accum: NumberDictionary,\n toIndex: TacticalActivity,\n index: number,\n) => {\n if (!toIndex.rank && toIndex.rank !== 0) {\n toIndex.rank = index;\n }\n accum[toIndex.rank] = toIndex;\n return accum;\n};\n\nconst updateStateWithActivities = (\n newActivities: TacticalActivity[],\n state: TacticalState,\n): TacticalState => {\n const tacticalActivities = [\n ...numberObjectToArray(state.activity.activities),\n ...newActivities.filter(tactAct => !tactAct.hidden),\n ].reduce(rankReducer, {});\n const archivedTacticalActivities = [\n ...numberObjectToArray(state.activity.archivedActivities),\n ...newActivities.filter(tactAct => tactAct.hidden),\n ].reduce(dictionaryReducer, {});\n return {\n ...state,\n activity: {\n ...state.activity,\n activities: tacticalActivities,\n archivedActivities: archivedTacticalActivities,\n },\n };\n};\n\nconst TacticalActivityReducer = (\n state: TacticalState = INITIAL_TACTICAL_STATE,\n action: any,\n) => {\n switch (action.type) {\n case CREATED_ACTIVITY:\n case UPDATED_ACTIVITY:\n const newActivity = [action.payload];\n return updateStateWithActivities(newActivity, state);\n case DELETED_ACTIVITY:\n const {payload: deletedActivity} = action;\n const newActivities = numberObjectToArray(\n state.activity.activities,\n ).filter(\n suspiciousActivity => suspiciousActivity.id !== deletedActivity.id,\n );\n return {\n ...state,\n activity: {\n ...state.activity,\n activities: newActivities.reduce(rankReducer, {}),\n },\n };\n case ARCHIVED_ACTIVITY:\n return {\n ...state,\n activity: {\n ...state.activity,\n activities: numberObjectToArray(state.activity.activities)\n .filter(activity => activity.id !== action.payload.id)\n .reduce(rankReducer, {}),\n },\n };\n case RESTORED_ACTIVITY:\n return {\n ...state,\n activity: {\n ...state.activity,\n archivedActivities: numberObjectToArray(\n state.activity.archivedActivities,\n )\n .filter(activity => activity.id !== action.payload.id)\n .reduce(rankReducer, {}),\n },\n };\n case FOUND_ACTIVITIES:\n const activeActivities = action.payload.filter(\n (tactActivity: TacticalActivity) => !tactActivity.hidden,\n );\n const archivedActivities = action.payload.filter(\n (tactActivity: TacticalActivity) => tactActivity.hidden,\n );\n const rememberedActivities = activeActivities.reduce(rankReducer, {});\n return {\n ...state,\n activity: {\n ...state.activity,\n activities: rememberedActivities,\n archivedActivities: archivedActivities.reduce(dictionaryReducer, {}),\n },\n };\n case REPLACE_ACTIVITIES:\n return {\n ...state,\n activity: {\n ...state.activity,\n activities: action.payload\n .filter((tactActivity: TacticalActivity) => !tactActivity.hidden)\n .reduce(rankReducer, {}),\n },\n };\n case CACHED_TACTICAL_ACTIVITY: {\n const {userGUID, cachedActivity} = action.payload;\n if (state.activity.cache[userGUID]) {\n state.activity.cache[userGUID].push(cachedActivity);\n } else {\n state.activity.cache[userGUID] = [cachedActivity];\n }\n return {\n ...state,\n activity: {\n ...state.activity,\n },\n };\n }\n case SYNCED_TACTICAL_ACTIVITIES: {\n return {\n ...state,\n activity: {\n ...state.activity,\n cache: {\n ...reduceRight(\n objectToKeyValueArray(state.activity.cache).filter(\n keyValues => keyValues.key !== action.payload,\n ),\n (accum: StringDictionary, keyValue) => {\n accum[keyValue.key] = keyValue.value;\n return accum;\n },\n {},\n ),\n },\n },\n };\n }\n default:\n return state;\n }\n};\n\nexport default TacticalActivityReducer;\n","import {\n CachedTacticalActivity,\n PomodoroSettings,\n TacticalActivity,\n TacticalState,\n} from '../types/TacticalTypes';\nimport {\n CACHED_SETTINGS,\n FOUND_POMODORO_SETTINGS,\n REGISTERED_POMODORO_SETTINGS,\n SettingsCacheEvent,\n SYNCED_SETTINGS,\n UPDATED_POMODORO_SETTINGS,\n} from '../events/TacticalEvents';\nimport {objectToKeyValueArray} from '../miscellanous/Tools';\nimport TacticalActivityReducer from './TacticalActivityReducer';\nimport {NumberDictionary, StringDictionary} from '../types/BaseTypes';\nimport {FAILED_TO_RECEIVE_READ_TOKEN, LOGGED_OFF} from '../events/SecurityEvents';\n\nexport interface PomodoroState {\n settings: PomodoroSettings;\n cache: StringDictionary;\n}\n\nexport interface TacticalActivityState {\n activities: NumberDictionary;\n archivedActivities: StringDictionary;\n cache: StringDictionary;\n}\n\nexport const INITIAL_TACTICAL_STATE: TacticalState = {\n pomodoro: {\n settings: {\n loadDuration: 1620000, //milliseconds\n shortRecoveryDuration: 180000,\n longRecoveryDuration: 2400000,\n },\n cache: {},\n },\n activity: {\n activities: {},\n archivedActivities: {},\n cache: {},\n },\n};\n\nconst TacticalReducer = (\n state: TacticalState = INITIAL_TACTICAL_STATE,\n action: any,\n) => {\n const updatedState = TacticalActivityReducer(state, action);\n switch (action.type) {\n case LOGGED_OFF:\n case FAILED_TO_RECEIVE_READ_TOKEN:\n return {\n pomodoro: {\n ...INITIAL_TACTICAL_STATE.pomodoro,\n cache: state.pomodoro.cache,\n },\n activity: {\n ...INITIAL_TACTICAL_STATE.activity,\n cache: state.activity.cache,\n },\n };\n case UPDATED_POMODORO_SETTINGS:\n case FOUND_POMODORO_SETTINGS:\n case REGISTERED_POMODORO_SETTINGS:\n return {\n ...updatedState,\n pomodoro: {\n ...state.pomodoro,\n settings: {\n ...state.pomodoro.settings,\n ...action.payload,\n },\n },\n };\n case CACHED_SETTINGS: {\n const {userGUID, cachedSettings} = action.payload;\n updatedState.pomodoro.cache[userGUID] = cachedSettings;\n return {\n ...updatedState,\n pomodoro: {\n ...updatedState.pomodoro,\n },\n };\n }\n case SYNCED_SETTINGS: {\n return {\n ...updatedState,\n pomodoro: {\n ...updatedState.pomodoro,\n cache: {\n ...objectToKeyValueArray(updatedState.pomodoro.cache)\n .filter(keyValues => keyValues.key !== action.payload)\n .reduce(\n (accum: StringDictionary, keyValue) => {\n accum[keyValue.key] = keyValue.value;\n return accum;\n },\n {},\n ),\n },\n },\n };\n }\n default:\n return updatedState;\n }\n};\n\nexport default TacticalReducer;\n","import {BaseEvent, PayloadEvent} from './Event';\nimport {NotificationType} from \"../reducers/MiscellaneousReducer\";\n\nexport const REQUESTED_NOTIFICATION: 'REQUESTED_NOTIFICATION' =\n 'REQUESTED_NOTIFICATION';\nexport const DISMISSED_NOTIFICATION: 'DISMISSED_NOTIFICATION' =\n 'DISMISSED_NOTIFICATION';\nexport const SAVED_REDIRECT: 'SAVED_REDIRECT' = 'SAVED_REDIRECT';\n\nexport const createHideNotificationEvent = (): BaseEvent => ({\n type: DISMISSED_NOTIFICATION,\n});\n\ntype NotificationPayload = {\n message: string;\n type: NotificationType;\n}\nexport const createShowWarningNotificationEvent = (\n message: string,\n): PayloadEvent => ({\n type: REQUESTED_NOTIFICATION,\n payload: {\n message,\n type: NotificationType.WARNING\n },\n});\n\nexport const createShowInfoNotificationEvent = (\n message: string,\n): PayloadEvent => ({\n type: REQUESTED_NOTIFICATION,\n payload: {\n message,\n type: NotificationType.INFO\n },\n});\n\nexport const createSaveRedirect = (\n redirectPath: string,\n): PayloadEvent => ({\n type: SAVED_REDIRECT,\n payload: redirectPath,\n});\n","import {BaseEvent, PayloadEvent} from './Event';\n\nexport const TIME_INCREMENTED: 'TIME_INCREMENTED' = 'TIME_INCREMENTED';\nexport const TIME_DECREMENTED: 'TIME_DECREMENTED' = 'TIME_DECREMENTED';\nexport const TIME_SET: 'TIME_SET' = 'TIME_SET';\nexport const TIME_RESET: 'TIME_RESET' = 'TIME_RESET';\n\nexport const createTimeIncrementEvent = (): BaseEvent => ({\n type: TIME_INCREMENTED,\n});\n\nexport const createTimeDecrementEvent = (): BaseEvent => ({\n type: TIME_DECREMENTED,\n});\n\nexport const createTimeSetEvent = (\n timeToSet: number,\n): PayloadEvent => ({\n type: TIME_SET,\n payload: timeToSet,\n});\n\nexport const createTimeResetEvent = (): BaseEvent => ({\n type: TIME_RESET,\n});\n","import {\n TIME_DECREMENTED,\n TIME_INCREMENTED,\n TIME_RESET,\n TIME_SET,\n} from '../events/TimeEvents';\n\nexport interface TimeState {\n timeElapsed: number;\n}\n\nexport const INITIAL_TIME_STATE: TimeState = {\n timeElapsed: 0,\n};\n\nexport default (state: TimeState = INITIAL_TIME_STATE, action: any) => {\n switch (action.type) {\n case TIME_INCREMENTED:\n return {\n ...state,\n timeElapsed: state.timeElapsed + 1,\n };\n case TIME_DECREMENTED:\n return {\n ...state,\n timeElapsed: state.timeElapsed - 1,\n };\n case TIME_SET:\n return {\n ...state,\n timeElapsed: action.payload,\n };\n case TIME_RESET:\n return INITIAL_TIME_STATE;\n default:\n return state;\n }\n};\n","import {combineReducers} from 'redux';\nimport userReducer, {UserState} from './UserReducer';\nimport securityReducer, {SecurityState} from './SecurityReducer';\nimport configurationReducer, {ConfigurationState} from './ConfigurationReducer';\nimport activityReducer, {ActivityState} from './ActivityReducer';\nimport networkReducer, {NetworkState} from './NetworkReducer';\nimport HistoryReducer, {HistoryState} from './HistoryReducer';\nimport StrategyReducer, {StrategyState} from './StrategyReducer';\nimport TacticalReducer, {\n PomodoroState,\n TacticalActivityState,\n} from './TacticalReducer';\nimport MiscellaneousReducer, {MiscellaneousState} from './MiscellaneousReducer';\nimport {TacticalState} from '../types/TacticalTypes';\nimport {Reducer} from 'react';\nimport {connectRouter, RouterState} from 'connected-react-router';\nimport {History} from 'history';\nimport timeReducer, {TimeState} from './TimeReducer';\n\nexport interface GlobalState {\n security: SecurityState;\n user: UserState;\n configuration: ConfigurationState;\n activity: ActivityState;\n time: TimeState;\n network: NetworkState;\n history: HistoryState;\n strategy: StrategyState;\n tactical: TacticalState;\n misc: MiscellaneousState;\n router: RouterState;\n}\n\nconst rootReducer = (history: History): Reducer =>\n combineReducers({\n security: securityReducer,\n user: userReducer,\n configuration: configurationReducer,\n activity: activityReducer,\n time: timeReducer,\n network: networkReducer,\n history: HistoryReducer,\n strategy: StrategyReducer,\n tactical: TacticalReducer,\n misc: MiscellaneousReducer,\n router: connectRouter(history),\n });\n\nexport const selectSecurityState = (globalState: GlobalState): SecurityState =>\n globalState.security;\n\nexport const selectMiscState = (globalState: GlobalState): MiscellaneousState =>\n globalState.misc;\n\nexport const selectTimeState = (globalState: GlobalState): TimeState =>\n globalState.time;\n\nexport const selectActivityState = (globalState: GlobalState): ActivityState =>\n globalState.activity;\n\nexport const selectNetworkState = (globalState: GlobalState): NetworkState =>\n globalState.network;\n\nexport const selectUserState = (globalState: GlobalState): UserState =>\n globalState.user;\n\nexport const selectConfigurationState = (\n globalState: GlobalState,\n): ConfigurationState => globalState.configuration;\n\nexport const selectHistoryState = (globalState: GlobalState): HistoryState =>\n globalState.history;\n\nexport const selectStrategyState = (globalState: GlobalState): StrategyState =>\n globalState.strategy;\n\nexport const selectTacticalState = (globalState: GlobalState): TacticalState =>\n globalState.tactical;\n\nexport const selectPomodoroState = (globalState: GlobalState): PomodoroState =>\n selectTacticalState(globalState).pomodoro;\n\nexport const selectTacticalActivityState = (\n globalState: GlobalState,\n): TacticalActivityState => selectTacticalState(globalState).activity;\n\nexport default rootReducer;\n","import * as React from 'react';\nimport {useEffect} from 'react';\nimport IconButton from '@material-ui/core/IconButton';\nimport {Cancel, KeyboardArrowDown} from '@material-ui/icons';\nimport {numberObjectToArray} from '../../miscellanous/Tools';\nimport {TacticalActivityIcon} from '../icons/TacticalActivityIcon';\nimport {Grow, makeStyles} from '@material-ui/core';\nimport {GlobalState, selectTacticalActivityState} from '../../reducers';\nimport {TacticalActivity} from '../../types/TacticalTypes';\nimport {useDispatch, useSelector} from 'react-redux';\nimport {createViewedActivitySelectionEvent} from \"../../events/TacticalEvents\";\n\n// @ts-ignore real\nconst useStyles = makeStyles(theme => ({\n extendedIcon: {\n marginRight: theme.spacing(1),\n },\n speedDial: {\n position: 'relative',\n top: theme.spacing(1),\n left: theme.spacing(1),\n margin: theme.spacing(1),\n },\n hubRoot: {\n position: 'absolute',\n maxWidth: '300px',\n top: theme.spacing(7),\n },\n container: {\n background: 'rgba(0,0,0,0.90)',\n position: 'fixed',\n top: '0',\n left: '0',\n width: '100%',\n height: '100%',\n zIndex: '1051',\n overflow: 'auto',\n },\n toolTip: {\n zIndex: '9200',\n margin: 'auto',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n },\n toolTipInner: {\n display: 'inline-block',\n fontSize: '1.5em',\n },\n contents: {\n top: '5%',\n height: '100%',\n position: 'relative',\n },\n icon: {\n fontSize: '4em',\n },\n cancel: {\n marginTop: theme.spacing(5),\n },\n cancelIcon: {\n fontSize: '2.5em',\n color: 'red',\n background: 'rgba(240, 0,0,0.25)',\n borderRadius: '50%',\n },\n bigIcon: {\n fontSize: '175px',\n padding: '25px',\n background: theme.palette.primary.main,\n borderRadius: '50%',\n },\n bigIconTomato: {\n padding: '30px',\n background: theme.palette.primary.main,\n borderRadius: '50%',\n },\n activityIcon: {},\n activityContainer: {\n display: 'flex',\n flexWrap: 'wrap',\n justifyContent: 'space-evenly',\n },\n}));\n\ntype Props = {\n open: boolean;\n onClose: () => void;\n onActivitySelection: (arg1: TacticalActivity) => void;\n onGenericActivitySelection: () => void;\n genericIcon: JSX.Element;\n};\n\nconst mapStateToProps = (state: GlobalState) => {\n const {activities} = selectTacticalActivityState(state);\n return {\n activities,\n };\n};\n\nconst ActivitySelection = (props: Props) => {\n const classes = useStyles();\n const {activities} = useSelector(mapStateToProps);\n\n const dispetch = useDispatch();\n useEffect(() => {\n if (props.open) {\n dispetch(createViewedActivitySelectionEvent());\n }\n }, [dispetch, props.open])\n return (\n \n
\n
\n \n \n \n
\n
\n {numberObjectToArray(activities).map(activity => (\n
\n
\n {activity.name}\n \n
\n props.onActivitySelection(activity)}>\n \n \n
\n ))}\n
\n
\n Generic\n \n
\n \n {props.genericIcon}\n \n
\n
\n
\n );\n};\n\nexport default ActivitySelection;\n","import * as React from 'react';\nimport Tomato from '../../images/Tomato.svg';\nimport ReactSVG from 'react-svg';\nimport {ColorType} from '../../types/StrategyTypes';\nimport {SizeType} from './MountainIcon';\n\ntype Props = {\n backgroundColor?: ColorType;\n lineColor?: ColorType;\n size?: SizeType;\n};\n\nconst defaultSize: SizeType = {\n height: '100px',\n width: '100px',\n};\n\nexport const TomatoIcon = (props: Props) => {\n const {size} = props;\n const usableSize = size || defaultSize;\n return (\n {\n svg.setAttribute(\n 'width',\n String(usableSize.width || defaultSize.width),\n );\n svg.setAttribute(\n 'height',\n String(usableSize.height || defaultSize.height),\n );\n }}\n />\n );\n};\n","import {\n createStartedActivityEvent,\n createStartedNonTimedActivityEvent,\n createStartedTimedActivityEvent,\n} from '../events/ActivityEvents';\nimport {ActivityContent} from '../types/ActivityTypes';\n\nexport const startTimedActivity = (activityContent: ActivityContent) => (\n dispetch: any,\n) => {\n dispetch(createStartedActivityEvent(activityContent)); // to the backend event\n dispetch(createStartedTimedActivityEvent(activityContent)); // internal event\n};\n\nexport const startNonTimedActivity = (activityContent: ActivityContent) => (\n dispetch: any,\n) => {\n dispetch(createStartedActivityEvent(activityContent)); // to the backend event\n dispetch(createStartedNonTimedActivityEvent(activityContent)); // internal event\n};\n","import SpeedDialIcon from '@material-ui/lab/SpeedDialIcon';\nimport SpeedDialAction from '@material-ui/lab/SpeedDialAction';\nimport SpeedDial from '@material-ui/lab/SpeedDial';\nimport React, {useState} from 'react';\nimport StopWatch from '@material-ui/icons/Timer';\nimport uuid from 'uuid/v4';\nimport {useDispatch, useSelector} from 'react-redux';\nimport {GlobalState, selectConfigurationState, selectTacticalState, selectUserState,} from '../../reducers';\nimport {TomatoIcon} from '../icons/TomatoIcon';\nimport ActivitySelection from './ActivitySelection';\nimport makeStyles from '@material-ui/core/styles/makeStyles';\nimport {ActivityTimedType, ActivityType} from '../../types/ActivityTypes';\nimport {startTimedActivity} from '../../actions/ActivityActions';\nimport {NOT_ASKED} from '../../types/ConfigurationTypes';\nimport {createNotificationPermissionReceivedEvent} from '../../events/ConfigurationEvents';\nimport {TacticalActivity} from '../../types/TacticalTypes';\n\n// @ts-ignore real\nconst useStyles = makeStyles(theme => ({\n extendedIcon: {\n marginRight: theme.spacing(1),\n },\n speedDial: {\n top: theme.spacing(1),\n left: theme.spacing(1),\n margin: theme.spacing(1),\n },\n hubRoot: {\n position: 'sticky',\n maxWidth: '300px',\n top: theme.spacing(1),\n zIndex: 100,\n },\n container: {\n background: 'rgba(0,0,0,0.90)',\n position: 'fixed',\n top: '0',\n width: '100%',\n height: '100%',\n zIndex: '9001',\n overflow: 'auto',\n },\n toolTip: {\n zIndex: '9200',\n margin: 'auto',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n },\n toolTipInner: {\n display: 'inline-block',\n fontSize: '1.5em',\n },\n contents: {\n top: '5%',\n height: '100%',\n position: 'relative',\n },\n icon: {\n fontSize: '4em',\n },\n cancel: {\n marginTop: theme.spacing(5),\n },\n cancelIcon: {\n fontSize: '2.5em',\n color: 'red',\n background: 'rgba(240, 0,0,0.25)',\n borderRadius: '50%',\n },\n bigIcon: {\n fontSize: '175px',\n padding: '25px',\n background: theme.palette.primary.main,\n borderRadius: '50%',\n },\n bigIconTomato: {\n padding: '30px',\n background: theme.palette.primary.main,\n borderRadius: '50%',\n },\n activityIcon: {},\n activityContainer: {\n display: 'flex',\n flexWrap: 'wrap',\n justifyContent: 'space-evenly',\n },\n}));\n\nexport const GENERIC_ACTIVITY_NAME = 'GENERIC_ACTIVITY';\n\nconst mapStateToProps = (state: GlobalState) => {\n const {\n pomodoro: {\n settings: {loadDuration},\n },\n } = selectTacticalState(state);\n const {\n miscellaneous: {notificationsAllowed},\n } = selectConfigurationState(state);\n const {\n miscellaneous: {\n onboarding: {TacModDownloaded, TacModNotified},\n },\n } = selectUserState(state);\n return {\n loadDuration,\n notificationsAllowed,\n TacModDownloaded,\n TacModNotified,\n };\n};\n\nexport const buildCommenceActivityContents = (\n supplements: any,\n name: string,\n) => ({\n ...supplements,\n name,\n type: ActivityType.ACTIVE,\n timedType: ActivityTimedType.STOP_WATCH,\n uuid: uuid(),\n workStartedWomboCombo: new Date().getTime(),\n});\ntype ActionType = (arg1: TacticalActivity) => void;\ntype Runnable = () => void;\ntype ActionHack = { action: () => void };\nconst ActivityHub = () => {\n const classes = useStyles();\n const [open, setOpen] = useState(false);\n const [strategyOpen, setStrategyOpen] = useState(false);\n\n const {\n loadDuration,\n notificationsAllowed,\n // TacModDownloaded,\n // TacModNotified,\n } = useSelector(mapStateToProps);\n\n const dispetch = useDispatch();\n const commenceActivity = (name: string, supplements: any) =>\n dispetch(\n startTimedActivity(buildCommenceActivityContents(supplements, name)),\n );\n\n // const [storedAction, setStoredAction] = useState({\n // action: () => {\n // },\n // });\n // const [useTacMod, setUseTacMod] = useState(false);\n //\n // const tacModDismissed = () => {\n // setUseTacMod(false);\n // storedAction.action();\n // };\n\n const activityChosen = (action: {\n icon: any;\n name: string;\n perform: () => void;\n }) => {\n // todo bring back when tacmod is in playstore.\n // if (!(TacModDownloaded || TacModNotified)) {\n // setStoredAction({\n // action: action.perform,\n // });\n // setUseTacMod(true);\n // } else {\n action.perform();\n // }\n };\n\n const commenceTimedActivity = (name: string, supplements: any) => {\n if (notificationsAllowed === NOT_ASKED) {\n // eslint-disable-next-line no-undef\n Notification.requestPermission().then(res =>\n dispetch(createNotificationPermissionReceivedEvent(res)),\n );\n }\n return dispetch(\n startTimedActivity({\n ...supplements,\n name,\n type: ActivityType.ACTIVE,\n timedType: ActivityTimedType.TIMER,\n duration: loadDuration,\n uuid: uuid(),\n }),\n );\n };\n\n const commenceTimedObjectiveActivity = (activity: TacticalActivity) => {\n commenceTimedActivity(activity.name, {activityID: activity.id});\n };\n\n const commenceGenericTimedActivity = () => {\n commenceTimedActivity('GENERIC_TIMED_ACTIVITY', {});\n };\n\n const commenceObjectiveActivity = (activity: TacticalActivity) => {\n commenceActivity(activity.name, {activityID: activity.id});\n };\n\n const commenceGenericActivity = () => {\n commenceActivity(GENERIC_ACTIVITY_NAME, {});\n };\n\n const handleClick = () => setOpen(!open);\n\n const [selectedAction, setSelectedAction] = useState(_ => {\n });\n const [selectedGenericAction, setSelectedGenericAction] = useState(\n () => {\n },\n );\n const invokeGenericAction = () => {\n selectedGenericAction();\n closeStrategy();\n };\n\n const [selectedIcon, setSelectedIcon] = useState(<>);\n const baseAction = (action: any, icon: any, genericAction: any) => {\n setStrategyOpen(!strategyOpen);\n setSelectedAction(() => action);\n setSelectedGenericAction(() => genericAction);\n setSelectedIcon(icon);\n };\n\n const closeStrategy = () => {\n setStrategyOpen(false);\n };\n\n const actions = [\n {\n icon: (\n
\n \n
\n ),\n name: 'Start Timed Task',\n perform: () =>\n baseAction(\n commenceTimedObjectiveActivity,\n
\n \n
,\n commenceGenericTimedActivity,\n ),\n },\n {\n icon: ,\n name: 'Start Task',\n perform: () =>\n baseAction(\n commenceObjectiveActivity,\n ,\n commenceGenericActivity,\n ),\n },\n ];\n\n const [showToolTips, setShowTooltips] = useState(false);\n if (strategyOpen) {\n setTimeout(() => setShowTooltips(true), 250);\n } else if (showToolTips) {\n setShowTooltips(false);\n }\n\n return (\n
\n
\n );\n};\n\nexport default ActivityHub;\n","import React, {FC, useState} from 'react';\nimport Pause from '@material-ui/icons/Pause';\nimport SwapVert from '@material-ui/icons/SwapVert';\nimport {TimeDisplay} from './TimeDisplay';\nimport makeStyles from '@material-ui/core/styles/makeStyles';\nimport ActivitySelection from './ActivitySelection';\nimport StopWatch from '@material-ui/icons/Timer';\nimport {GENERIC_ACTIVITY_NAME} from './ActivityHub';\nimport IconButton from '@material-ui/core/IconButton';\nimport {useSelector} from 'react-redux';\nimport {selectTimeState} from '../../reducers';\nimport {SwapHoriz} from \"@material-ui/icons\";\n\nconst useStyles = makeStyles(theme => ({\n stopwatchContainer: {\n display: 'inline-flex',\n },\n actionButton: {\n marginLeft: theme.spacing(1.5),\n lineHeight: 1,\n marginTop: 'auto',\n },\n swappo: {\n marginRight: theme.spacing(1.5),\n lineHeight: 1,\n marginTop: 'auto',\n },\n bigIcon: {\n fontSize: '175px',\n padding: '25px',\n background: theme.palette.primary.main,\n borderRadius: '50%',\n },\n}));\n\ntype ChangeActivityCallback = (\n name: string,\n stuff: {activityID?: string},\n) => void;\n\ninterface Props {\n onPause?: () => void;\n onResume?: () => void;\n fontSize?: string;\n pivotActivity?: ChangeActivityCallback;\n swapActivity?: ChangeActivityCallback;\n hidePause?: boolean;\n readOnly?: boolean;\n}\n\nexport const PomodoroTimer: FC = ({\n onPause,\n pivotActivity,\n swapActivity,\n hidePause,\n readOnly,\n}) => {\n const pauseTimer = () => {\n onPause && onPause();\n };\n\n const [selectionOpen, setSelectionOpen] = useState(false);\n\n const [changeActivityFunction, setChangeActivityFunction] = useState<{\n changeActivity: ChangeActivityCallback | undefined;\n }>({\n changeActivity: pivotActivity || swapActivity,\n });\n\n const classes = useStyles();\n const closeSelection = () => setSelectionOpen(false);\n const openPivotSelection = () => {\n setChangeActivityFunction({changeActivity: pivotActivity});\n setSelectionOpen(true);\n };\n const openSwappoSelection = () => {\n setChangeActivityFunction({changeActivity: swapActivity});\n setSelectionOpen(true);\n };\n\n const timeElapsed = useSelector(selectTimeState).timeElapsed;\n\n return (\n
\n {!hidePause && !readOnly && (\n \n \n \n )}\n
\n \n
\n
\n {!hidePause && !readOnly && (\n \n \n \n )}\n
\n
\n {!hidePause && !readOnly && (\n \n \n \n )}\n
\n\n {\n closeSelection();\n changeActivityFunction.changeActivity &&\n changeActivityFunction.changeActivity(activity.name, {\n activityID: activity.id,\n });\n }}\n onGenericActivitySelection={() =>\n changeActivityFunction.changeActivity &&\n changeActivityFunction.changeActivity(GENERIC_ACTIVITY_NAME, {})\n }\n genericIcon={}\n />\n
\n );\n};\n","import React, {FC} from 'react';\nimport {TimeDisplay} from './TimeDisplay';\nimport Pause from '@material-ui/icons/Pause';\nimport makeStyles from '@material-ui/core/styles/makeStyles';\nimport IconButton from '@material-ui/core/IconButton';\nimport {useSelector} from 'react-redux';\nimport {selectTimeState} from '../../reducers';\n\nconst useStyles = makeStyles(theme => ({\n stopwatchContainer: {\n display: 'inline-flex',\n },\n actionButton: {\n marginLeft: theme.spacing(1.5),\n lineHeight: 1,\n marginTop: 'auto',\n },\n}));\n\ninterface Props {\n onPause?: () => void;\n onResume?: () => void;\n fontSize?: string;\n readOnly?: boolean;\n}\n\nconst Stopwatch: FC = ({onPause, fontSize, readOnly}) => {\n const pauseTimer = () => {\n onPause && onPause();\n };\n\n const timeElapsed = useSelector(selectTimeState).timeElapsed;\n\n const getPauseButton = () => (\n \n \n \n );\n\n const actualFontSize = fontSize || '1em';\n const classes = useStyles();\n return (\n
\n
\n \n
\n
{onPause && getPauseButton()}
\n
\n );\n};\n\nexport default Stopwatch;\n","import {\n Activity,\n ActivityStrategy,\n getActivityID,\n getActivityName,\n isActivityRecovery,\n RECOVERY,\n} from '../types/ActivityTypes';\nimport {LOGGED_OFF, LOGGED_ON} from '../events/SecurityEvents';\n\nexport const haveSameDefaultName = (\n currentActivity: Activity,\n nextActivity: Activity,\n): boolean => {\n const activityName = getActivityName(currentActivity);\n const haveSameName = activityName === getActivityName(nextActivity);\n return (\n haveSameName &&\n (activityName === RECOVERY || activityName === ActivityStrategy.GENERIC)\n );\n};\n\nexport const haveSameDefinedId = (\n currentActivity: Activity,\n nextActivity: Activity,\n): boolean => {\n const currentActivityIdentifier = getActivityIdentifier(currentActivity);\n const haveSameId =\n currentActivityIdentifier === getActivityIdentifier(nextActivity);\n return haveSameId && !!currentActivityIdentifier;\n};\n\nexport const areDifferent = (\n currentActivity: Activity,\n nextActivity: Activity,\n): boolean => {\n return !(\n haveSameDefinedId(currentActivity, nextActivity) ||\n haveSameDefaultName(currentActivity, nextActivity)\n );\n};\n\nexport const shouldTime = (activity: Activity): boolean => {\n const activityName = getActivityName(activity);\n switch (activityName) {\n case LOGGED_ON:\n case LOGGED_OFF:\n return false;\n default:\n return true;\n }\n};\n\nexport const getActivityIdentifier = (currentActivity: Activity) =>\n isActivityRecovery(currentActivity)\n ? RECOVERY\n : getActivityID(currentActivity);\n","import {\n Activity,\n DEFAULT_ACTIVITY,\n getActivityName,\n} from '../../types/ActivityTypes';\nimport reduceRight from 'lodash/reduceRight';\nimport {\n areDifferent,\n getActivityIdentifier,\n shouldTime,\n} from '../../miscellanous/Projection';\nimport {StringDictionary} from '../../types/BaseTypes';\n\nexport interface ActivityProjection {\n activityName: string;\n activityIdentifier: string;\n start: number;\n stop: number;\n spawn: {\n start: Activity;\n stop: Activity;\n };\n lane?: number;\n}\n\nexport interface TimelineProjection {\n currentActivity: Activity;\n activityBins: StringDictionary;\n}\n\nexport const constructProjection = (\n modifiedFeed: Activity[],\n): TimelineProjection =>\n reduceRight(\n modifiedFeed,\n (accum: TimelineProjection, activity) => {\n if (shouldTime(activity) && !accum.currentActivity.antecedenceTime) {\n accum.currentActivity = activity;\n } else if (\n areDifferent(accum.currentActivity, activity) &&\n shouldTime(activity)\n ) {\n // Different Type: Create workable chunk and start next activity.\n const currentActivity = accum.currentActivity;\n accum.currentActivity = activity;\n\n const activityName = getActivityName(currentActivity);\n const activityIdentifier = getActivityIdentifier(currentActivity);\n if (!accum.activityBins[activityIdentifier]) {\n accum.activityBins[activityIdentifier] = [];\n }\n accum.activityBins[activityIdentifier].push({\n activityName,\n activityIdentifier,\n start: currentActivity.antecedenceTime,\n stop: activity.antecedenceTime,\n spawn: {\n start: currentActivity,\n stop: activity,\n },\n });\n }\n return accum;\n },\n {\n currentActivity: DEFAULT_ACTIVITY,\n activityBins: {},\n },\n );\n","import * as React from 'react';\nimport {FC, useEffect} from 'react';\nimport moment from 'moment';\nimport {select} from 'd3-selection';\nimport {scaleLinear} from 'd3-scale';\nimport {axisTop, brushX, event} from 'd3';\nimport makeStyles from '@material-ui/core/styles/makeStyles';\nimport {getActivityIdentifier} from '../../miscellanous/Projection';\nimport {\n GlobalState,\n selectActivityState,\n selectHistoryState,\n selectTacticalActivityState,\n} from '../../reducers';\nimport {connect, useDispatch} from 'react-redux';\nimport {objectToKeyValueArray} from '../../miscellanous/Tools';\nimport {getMeaningFullName, mapTacticalActivitiesToID} from './PieFlavored';\nimport {createAdjustedHistoryTimeFrame} from '../../events/HistoryEvents';\nimport {blue} from '@material-ui/core/colors';\nimport {NumberDictionary, StringDictionary} from '../../types/BaseTypes';\nimport {\n getActivityBackgroundColor,\n TacticalActivity,\n} from '../../types/TacticalTypes';\nimport {\n activitiesEqual,\n Activity,\n ActivityStrategy,\n DEFAULT_ACTIVITY,\n getActivityID,\n getActivityName,\n RECOVERY,\n} from '../../types/ActivityTypes';\nimport reduceRight from 'lodash/reduceRight';\nimport {constructProjection, TimelineProjection} from './Projections';\n\nconst withStyles = makeStyles(__ => ({\n timeBar: {\n fillOpacity: 1,\n strokeWidth: 6,\n },\n}));\n\nexport const constructColorMappings = (\n tacticalActivities: StringDictionary,\n): StringDictionary => {\n const defaultColors: StringDictionary = {};\n defaultColors[ActivityStrategy.GENERIC] = '#36FF35';\n defaultColors[RECOVERY] = blue[500];\n return {\n ...reduceRight(\n objectToKeyValueArray(tacticalActivities)\n .map(kv => ({key: kv.key, value: getActivityBackgroundColor(kv.value)}))\n .filter(kv => !!kv.value),\n (accum: StringDictionary, idToColor) => {\n accum[idToColor.key] = idToColor.value;\n return accum;\n },\n {},\n ),\n ...defaultColors,\n };\n};\n\nexport const responsivefy = (svg: any) => {\n const resize = () => {\n const targetWidth = parseInt(container.style('width'), 10);\n svg.attr('width', targetWidth);\n svg.attr('height', Math.round(targetWidth / aspect));\n };\n\n const container = select(svg.node().parentNode),\n width = parseInt(svg.style('width'), 10),\n height = parseInt(svg.style('height'), 10),\n aspect = width / height;\n\n svg\n .attr('viewBox', `0 0 ${width} ${height}`)\n .attr('perserveAspectRatio', 'xMinYMid')\n .call(resize);\n\n select(window).on('resize.' + container.attr('id'), resize);\n};\n\nconst NINETY_MINUTES = 5400000;\nconst getTimeUnit = (milliseconds: number) => {\n if (milliseconds / NINETY_MINUTES > 1) {\n return `${(milliseconds / 3600000).toFixed(2)} hours`;\n } else {\n return `${(milliseconds / 60000).toFixed(2)} minutes`;\n }\n};\n\ntype Props = {\n activityFeed: Activity[];\n archivedActivities: StringDictionary;\n bottomActivity: Activity;\n currentActivity: Activity;\n relativeToTime: number;\n tacticalActivities: NumberDictionary;\n relativeFromTime: number;\n};\nconst mapStateToProps = (state: GlobalState): Props => {\n const {\n activityFeed,\n selectedHistoryRange: {to, from},\n capstone: {bottomActivity},\n } = selectHistoryState(state);\n const {activities, archivedActivities} = selectTacticalActivityState(state);\n const {currentActivity} = selectActivityState(state);\n return {\n activityFeed,\n relativeToTime: to,\n relativeFromTime: from,\n tacticalActivities: activities,\n archivedActivities,\n currentActivity,\n bottomActivity,\n };\n};\n\nexport const addCurrentActivity = (\n activityProjection: TimelineProjection,\n relativeToTime: number,\n) => {\n const bins = activityProjection.activityBins;\n const activityIdentifier = getActivityIdentifier(\n activityProjection.currentActivity,\n );\n if (!bins[activityIdentifier]) {\n bins[activityIdentifier] = [];\n }\n const activityName = getActivityName(activityProjection.currentActivity);\n const meow = new Date().valueOf();\n bins[activityIdentifier].push({\n activityName,\n activityIdentifier,\n start: activityProjection.currentActivity.antecedenceTime,\n stop: relativeToTime > meow ? meow : relativeToTime,\n spawn: {\n start: activityProjection.currentActivity,\n stop: {\n ...DEFAULT_ACTIVITY,\n antecedenceTime: meow.valueOf(),\n },\n },\n });\n return bins;\n};\n\nconst TimeLine: FC = ({\n activityFeed,\n relativeToTime,\n relativeFromTime,\n tacticalActivities,\n currentActivity,\n bottomActivity,\n archivedActivities,\n}) => {\n const classes: any = withStyles();\n const dispatch = useDispatch();\n\n const modifiedFeed = [\n ...(currentActivity.antecedenceTime >= relativeFromTime &&\n currentActivity.antecedenceTime <= relativeToTime\n ? [currentActivity]\n : []),\n ...activityFeed,\n ];\n const earliestActivity = modifiedFeed[modifiedFeed.length - 1];\n if (\n !activitiesEqual(earliestActivity, bottomActivity) &&\n bottomActivity &&\n bottomActivity !== DEFAULT_ACTIVITY &&\n (earliestActivity &&\n earliestActivity.antecedenceTime >= bottomActivity.antecedenceTime)\n ) {\n modifiedFeed.push(bottomActivity);\n }\n\n const activityProjection = constructProjection(modifiedFeed);\n\n const bins = addCurrentActivity(activityProjection, relativeToTime);\n\n useEffect(() => {\n if (modifiedFeed.length) {\n const selection = select('#timeBoi');\n\n const binsToArray = objectToKeyValueArray(bins);\n const lanes = binsToArray.map(kV => kV.key);\n\n const laneLength = lanes.length;\n const margin = {\n left: 20,\n right: 15,\n top: 40,\n bottom: 15,\n };\n\n const width = 2500 - margin.left - margin.right;\n const height = 350 - margin.top - margin.bottom;\n\n const timeBegin = relativeFromTime;\n const timeEnd = relativeToTime;\n\n const endingTime = moment.unix(timeEnd / 1000);\n const beginningTime = moment.unix(timeBegin / 1000);\n const timeSpanDuration = moment.duration(endingTime.diff(beginningTime));\n\n const x = scaleLinear()\n .domain([0, timeEnd - timeBegin])\n .range([0, width]);\n const y1 = scaleLinear()\n .domain([0, laneLength + 1])\n .range([0, height - margin.top - margin.bottom]);\n\n selection.select('svg').remove();\n\n const timeSVG = selection\n .append('svg')\n .attr('width', width)\n .attr('height', height)\n .call(responsivefy);\n\n const dayz = Math.round(timeSpanDuration.asDays()) > 2;\n\n const timeLabelAxis = axisTop(x).tickFormat((d, i) => {\n if (i === 0 || i === 12) {\n return '';\n }\n\n const dateBoi = moment.unix((relativeFromTime + d.valueOf()) / 1000);\n if (dayz) {\n return dateBoi.format('MM/DD');\n }\n return dateBoi.format('hh:mm');\n });\n\n timeSVG\n .append('g')\n .attr('transform', `translate(0,${margin.top})`)\n .call(timeLabelAxis)\n .attr('font-size', 'xx-large')\n .attr('color', 'black');\n\n timeSVG\n .append('defs')\n .append('clipPath')\n .attr('id', 'clip')\n .append('rect')\n .attr('width', width)\n .attr('height', height);\n\n const items = binsToArray.flatMap((keyValue, index) => {\n keyValue.value.forEach(activity => {\n activity.lane = index;\n activity.start = activity.start - timeBegin;\n activity.start = activity.start < 0 ? 0 : activity.start;\n activity.stop = activity.stop - timeBegin;\n });\n return keyValue.value;\n });\n\n const mappedTacticalActivities = {\n ...mapTacticalActivitiesToID(tacticalActivities),\n ...archivedActivities,\n };\n const colorToActivity = constructColorMappings(mappedTacticalActivities);\n\n timeSVG\n .append('g')\n .selectAll('.timeBar')\n .data(items)\n .enter()\n .append('rect')\n .attr('transform', `translate(0,${margin.top})`)\n .attr('fill', d => colorToActivity[getActivityID(d.spawn.start)])\n .attr('opacity', 0.7)\n .attr('class', () => classes.timebar)\n .attr('x', d => x(d.start))\n .attr('y', (d: any) => y1(d.lane) + 10)\n .attr('width', d => x(d.stop - d.start))\n .attr('height', () => y1(1))\n .append('title')\n .text(d => {\n const meaningFullName = getMeaningFullName(\n d.activityIdentifier,\n mappedTacticalActivities,\n );\n const millisecondsDuration =\n d.spawn.stop.antecedenceTime - d.spawn.start.antecedenceTime;\n return `${meaningFullName}: ${getTimeUnit(millisecondsDuration)} `;\n });\n\n const brushEnd = (bBoi: any, bBoiSelection: any) => {\n if (!event.sourceEvent || !event.selection) {\n return;\n }\n bBoi.clear(bBoiSelection);\n const [newFrom, newTo] = event.selection\n .map(x.invert)\n .map((n: any) => n + relativeFromTime);\n\n dispatch(\n createAdjustedHistoryTimeFrame({\n from: newFrom,\n to: newTo,\n }),\n );\n };\n\n const bBoi = brushX().extent([[0, 0], [width, height]]);\n const bBoiSelection = timeSVG.append('g');\n bBoiSelection\n .attr('id', 'bboi')\n .attr('class', 'brush')\n .call(bBoi.on('end', () => brushEnd(bBoi, bBoiSelection)));\n }\n }, [\n archivedActivities,\n bins,\n classes.timebar,\n dispatch,\n modifiedFeed,\n relativeFromTime,\n relativeToTime,\n tacticalActivities,\n ]);\n\n return (\n
\n \n
\n );\n};\n\nexport default connect(mapStateToProps)(TimeLine);\n","import {ColorType} from './StrategyTypes';\nimport {EventTypes} from './EventTypes';\nimport {ActivityStrategy, RECOVERY} from './ActivityTypes';\nimport {\n PomodoroState,\n TacticalActivityState,\n} from '../reducers/TacticalReducer';\n\nexport type TacticalState = {\n activity: TacticalActivityState;\n pomodoro: PomodoroState;\n};\n\nexport interface RememberedPomodoro {\n dateCounted: number;\n count: number;\n}\n\nexport interface PomodoroSettings {\n loadDuration: number; //milliseconds\n shortRecoveryDuration: number;\n longRecoveryDuration: number;\n}\n\nexport interface CachedSettings {\n settings: PomodoroSettings;\n}\n\nexport interface PomodoroSettingsRegistryFailure {\n error: any;\n settings: PomodoroSettings;\n}\n\nexport const getActivityBackgroundColor = (\n tacticalActivity: TacticalActivity,\n): string =>\n (tacticalActivity &&\n tacticalActivity.iconCustomization &&\n tacticalActivity.iconCustomization.background &&\n tacticalActivity.iconCustomization.background.hex) ||\n (tacticalActivity.name === RECOVERY && RECOVERY) ||\n ActivityStrategy.GENERIC;\n\nexport interface TacticalActivity {\n id: string;\n name: string;\n rank: number;\n antecedenceTime?: number;\n iconCustomization: {\n background: ColorType;\n line: ColorType;\n };\n categories: string[];\n hidden?: boolean;\n}\n\nexport interface CachedTacticalActivity {\n uploadType: EventTypes;\n activity: TacticalActivity;\n}\n\nexport interface TacticalActivityCacheEvent {\n cachedActivity: CachedTacticalActivity;\n userGUID: string;\n}\n","import React, {FC, useEffect, useState} from 'react';\nimport range from 'lodash/range';\nimport {connect} from 'react-redux';\nimport {max, scaleSequential, select} from 'd3';\nimport Radio from '@material-ui/core/Radio';\nimport RadioGroup from '@material-ui/core/RadioGroup';\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\nimport FormControl from '@material-ui/core/FormControl';\nimport FormLabel from '@material-ui/core/FormLabel';\nimport {\n GlobalState,\n selectActivityState,\n selectHistoryState,\n selectStrategyState,\n selectTacticalActivityState,\n} from '../../reducers';\nimport {\n activitiesEqual,\n Activity,\n DEFAULT_ACTIVITY,\n getActivityID,\n getActivityName,\n RECOVERY,\n} from '../../types/ActivityTypes';\nimport {NumberDictionary, StringDictionary} from '../../types/BaseTypes';\nimport {TacticalActivity} from '../../types/TacticalTypes';\nimport {Objective} from '../../types/StrategyTypes';\nimport {LinearProjection} from './LinearProjection';\nimport moment from 'moment';\nimport {MenuItem, Select} from '@material-ui/core';\nimport {mapTacticalActivitiesToID} from './PieFlavored';\nimport {ActivityProjection, constructProjection} from './Projections';\nimport {addCurrentActivity, constructColorMappings} from './TimeLine';\nimport makeStyles from '@material-ui/core/styles/makeStyles';\nimport {TacticalActivityIcon} from '../icons/TacticalActivityIcon';\nimport Typography from '@material-ui/core/Typography';\nimport {blue} from '@material-ui/core/colors';\nimport {GENERIC_ACTIVITY_NAME} from '../time/ActivityHub';\nimport capitalize from '@material-ui/core/utils/capitalize';\n\nexport const RecoveryActivity: TacticalActivity = {\n id: RECOVERY,\n antecedenceTime: 69,\n categories: [],\n hidden: false,\n iconCustomization: {\n background: {\n hex: blue[500],\n opacity: 1,\n },\n line: {\n opacity: 1,\n hex: '#ffffff',\n },\n },\n name: 'Recovery',\n rank: -1,\n};\n\nconst useStyles = makeStyles(theme => ({\n container: {\n borderTop: 'solid 1px rgba(0,0,0, .15)',\n paddingTop: '2rem',\n },\n legendLabel: {\n flexGrow: 1,\n textAlign: 'right',\n },\n}));\n\ninterface Props {\n activityFeed: Activity[];\n relativeToTime: number;\n relativeFromTime: number;\n tacticalActivities: NumberDictionary;\n bottomActivity: Activity;\n currentActivity: Activity;\n archivedActivities: NumberDictionary;\n objectives: StringDictionary;\n}\n\nexport const breakIntoHeatSteps = (\n linearProjection: LinearProjection,\n stepSize: number,\n) =>\n linearProjection.activityBins.flatMap((projection: ActivityProjection) => {\n const closestFullStep = projection.start - (projection.start % stepSize);\n const closestEndingStep =\n projection.stop - (projection.stop % stepSize) + stepSize;\n const fullSteps = (closestEndingStep - closestFullStep) / stepSize;\n\n // todo: is this right?\n const safeSteps = fullSteps < 0 ? 0: fullSteps\n const fullTimeSteps = Array(Math.floor(safeSteps))\n .fill(0)\n .map((_, index) => ({\n timeStamp: closestFullStep + stepSize * index,\n spawn: projection.spawn,\n value: 1,\n }));\n\n const fullTimeStepsLength = fullTimeSteps.length;\n if (fullTimeStepsLength) {\n fullTimeSteps[0] = {\n ...fullTimeSteps[0],\n value: 1 - (projection.start - closestFullStep) / stepSize,\n };\n const lastFullStep = fullTimeSteps[fullTimeStepsLength - 1];\n fullTimeSteps[fullTimeStepsLength - 1] = {\n ...lastFullStep,\n value:\n lastFullStep.value - (closestEndingStep - projection.stop) / stepSize,\n };\n }\n\n return fullTimeSteps;\n });\n\nconst weekDays = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'],\n weekTimes = [\n '1a',\n '2a',\n '3a',\n '4a',\n '5a',\n '6a',\n '7a',\n '8a',\n '9a',\n '10a',\n '11a',\n '12a',\n '1p',\n '2p',\n '3p',\n '4p',\n '5p',\n '6p',\n '7p',\n '8p',\n '9p',\n '10p',\n '11p',\n '12p',\n ];\n\nconst margin = {top: 50, right: 0, bottom: 100, left: 30},\n width = 800 - margin.left - margin.right,\n gridSize = Math.floor(width / 24),\n minuteRow = Array(60).fill(0).map((_, i)=> ''),\n minuteColumn = Array(24).fill(0).map((_,i)=>'');\n\ntype HourSteppo = {\n spawn: { start: Activity; stop: Activity };\n hour: number;\n day: number;\n value: number;\n};\n\nconst sanitizeName = (activityName: string): string => {\n return activityName === RECOVERY || activityName === GENERIC_ACTIVITY_NAME\n ? capitalize(activityName.toLowerCase())\n : activityName;\n};\n\nconst HeatMap: FC = ({\n activityFeed,\n bottomActivity,\n currentActivity,\n relativeFromTime,\n relativeToTime,\n tacticalActivities,\n archivedActivities,\n }) => {\n const [filteredLinearProjection, setFilteredLinearProjection] = useState([]);\n const [linearProjection, setLinearProjection] = useState([]);\n\n const [currentHeatMapActivity, setCurrentHeatMapActivity] = useState<{\n name: string;\n displayName: string;\n key: string;\n count: number;\n }>({\n name: '',\n displayName: '',\n key: '',\n count: 0,\n });\n\n const [heatMapType, setHeatMapType] = useState('hour');\n\n useEffect(() => {\n const selection = select('#dayHeatBoi');\n selection.select('svg').remove();\n\n const isHour = heatMapType==='hour';\n const rows = isHour ? weekDays : minuteRow;\n const height = (gridSize * (rows.length + 3)) - margin.top - margin.bottom;\n\n const heatBoiSvg = selection\n .append('svg')\n .attr('width', width + margin.left + margin.right)\n .attr('height', height + margin.top + margin.bottom)\n .append('g')\n .attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\n\n heatBoiSvg\n .selectAll('.dayLabel')\n .data(rows)\n .enter()\n .append('text')\n .text(d => d)\n .attr('x', 0)\n .attr('y', (d, i) => i * gridSize)\n .style('text-anchor', 'end')\n .attr('font-size', '1rem')\n .attr('transform', 'translate(-6,' + gridSize / 1.5 + ')')\n .attr('class', (d, i) =>\n i >= 0 && i <= 4\n ? 'dayLabel mono axis axis-workweek'\n : 'dayLabel mono axis',\n );\n\n heatBoiSvg\n .selectAll('.timeLabel')\n .data(isHour ? weekTimes : minuteColumn)\n .enter()\n .append('text')\n .text(d => d)\n .attr('x', (d, i) => i * gridSize)\n .attr('y', 0)\n .style('text-anchor', 'middle')\n .attr('transform', 'translate(' + gridSize / 2 + ', -6)')\n .attr('font-size', '1rem')\n .attr('class', (d, i) =>\n i >= 7 && i <= 16\n ? 'timeLabel mono axis axis-worktime'\n : 'timeLabel mono axis',\n );\n\n const modifiedFeed = [...activityFeed];\n\n const earliestActivity = activityFeed[activityFeed.length - 1];\n if (\n !activitiesEqual(earliestActivity, bottomActivity) &&\n bottomActivity &&\n bottomActivity !== DEFAULT_ACTIVITY &&\n (earliestActivity &&\n earliestActivity.antecedenceTime >= bottomActivity.antecedenceTime)\n ) {\n const antecedenceTime =\n bottomActivity.antecedenceTime < relativeFromTime\n ? relativeFromTime - (relativeFromTime % 86400000)\n : bottomActivity.antecedenceTime;\n const modifiedBottom: Activity = {\n ...bottomActivity,\n antecedenceTime: antecedenceTime,\n };\n modifiedFeed.push(modifiedBottom);\n }\n\n const newestActivity = activityFeed[0];\n if (\n !activitiesEqual(newestActivity, currentActivity) &&\n currentActivity &&\n currentActivity !== DEFAULT_ACTIVITY &&\n (newestActivity &&\n newestActivity.antecedenceTime < currentActivity.antecedenceTime)\n ) {\n const antecedenceTime =\n currentActivity.antecedenceTime > relativeToTime\n ? relativeToTime - (relativeToTime % 86400000)\n : currentActivity.antecedenceTime;\n const modifiedTop: Activity = {\n ...currentActivity,\n antecedenceTime: antecedenceTime,\n };\n modifiedFeed.unshift(modifiedTop);\n }\n\n const projection = constructProjection(modifiedFeed);\n addCurrentActivity(projection, relativeToTime);\n const linearProj: LinearProjection = {\n currentActivity: projection.currentActivity,\n activityBins: Object.values(projection.activityBins).flatMap(a => a),\n };\n const multiplier = isHour ? 3600000 : 60000; // Hello everybody! My name is Multiplier.\n const unfilteredSteppos = breakIntoHeatSteps(linearProj, multiplier);\n const filterdSteppos = unfilteredSteppos.filter(\n steppo =>\n !currentHeatMapActivity ||\n currentHeatMapActivity.name === getActivityName(steppo.spawn.start),\n );\n const timeSteppoMaker = (steppo: {\n timeStamp: number;\n value: number;\n spawn: any;\n }) => {\n const dateTime = moment.unix(steppo.timeStamp / 1000);\n const absTime = (dateTime.hour() * 60) + (dateTime.minutes())\n return {\n day: isHour ? dateTime.day() : Math.floor(absTime / 24),\n hour: isHour ? dateTime.hour() : absTime % 24,\n value: steppo.value,\n spawn: steppo.spawn,\n };\n };\n const unfilteredHourSteppo: HourSteppo[] = unfilteredSteppos.map(\n timeSteppoMaker,\n );\n const filteredHourSteppo: HourSteppo[] = filterdSteppos.map(\n timeSteppoMaker,\n );\n\n setFilteredLinearProjection(filteredLinearProjection);\n setLinearProjection(unfilteredHourSteppo);\n\n const weekProjection = filteredHourSteppo.reduce(\n (accum: any, {day, hour, value}) => {\n if (!accum[day]) {\n accum[day] = {};\n }\n if (!accum[day][hour]) {\n accum[day][hour] = 0;\n }\n accum[day][hour] += value;\n return accum;\n },\n {},\n );\n\n // for the labels and such\n const sillyAdditionThing = isHour ? 1 : 0;\n\n const completeTaskProjection = Object.entries>(\n weekProjection,\n ).flatMap(dayEntry =>\n Object.entries(dayEntry[1]).map(hourEntry => ({\n day: +dayEntry[0] + sillyAdditionThing,\n hour: +hourEntry[0] + sillyAdditionThing,\n value: hourEntry[1],\n })),\n );\n\n const completeGrid = [];\n const numberOfGrids = isHour ? 7 * 24 : 60 * 24;\n for (let i = 0, j = 0; i < numberOfGrids; i++) {\n const actualTimeOnTask = completeTaskProjection[j];\n if(actualTimeOnTask && (((actualTimeOnTask.day - sillyAdditionThing) * 24) +\n actualTimeOnTask.hour - sillyAdditionThing) === i){\n completeGrid.push(actualTimeOnTask);\n j++;\n } else {\n completeGrid.push({\n day: Math.floor(i / 24) + sillyAdditionThing,\n hour: i % 24 + sillyAdditionThing,\n value: 0,\n })\n }\n }\n const steps = completeGrid;\n\n const mappedTacticalActivities: StringDictionary = {\n ...mapTacticalActivitiesToID(tacticalActivities),\n ...archivedActivities,\n [RECOVERY]: RecoveryActivity,\n };\n\n const almostMaxValue = max(steps, s => +s.value) || 1;\n const maxValue = almostMaxValue < 1 ? 1 : almostMaxValue;\n const domain: [number, number] = [0, maxValue];\n const colorMappings = constructColorMappings(mappedTacticalActivities);\n const colorScale = (_: number) => colorMappings[currentHeatMapActivity.key];\n const opacityScale = scaleSequential(n => n + 1e-2).domain(domain);\n\n const hourHeatBoxes = heatBoiSvg\n .selectAll('.hour')\n .data(steps, (d: any) => d.value);\n\n hourHeatBoxes\n .enter()\n .append('rect')\n .attr('x', d => (d.hour - sillyAdditionThing) * gridSize)\n .attr('y', d => (d.day - sillyAdditionThing) * gridSize)\n .attr('rx', 4)\n .attr('ry', 4)\n .attr('class', 'hour bordered')\n .attr('width', gridSize)\n .attr('height', gridSize)\n .on(\"mouseover\", function() {\n select(this).classed(\"hover\", true);\n })\n .on(\"mouseout\", function() {\n select(this).classed(\"hover\", false);\n })\n .attr('stroke', d => d.value === 0 ? '#eeeeee55' : '#00000000')\n .style('fill', d => {\n const opacity = Math.round((opacityScale(d.value) - 0.01) * 255) || 1;\n return `${colorScale(d.value)}${opacity < 16 ? 0 : ''}${opacity.toString(16)}`;\n })\n .append('title')\n .text((d: any) => {\n const duration = moment.duration(d.value * multiplier).humanize()\n const currentTime = moment.unix((((d.day) * 24) + d.hour) * 60).utc();\n const timeOfDay = `Time of day: ${currentTime.format('HH:mm')}`;\n return `${isHour ? '' : timeOfDay}\nDuration: ${!d.value ? 'N/A' : duration}`;\n });\n\n const legend = select('#legend69');\n legend.select('svg').remove();\n const legendRange = range(0, 1.1, 0.1);\n const legendWidth = legendRange.length * gridSize;\n const legendSvg = legend\n .append('svg')\n .attr('width', legendWidth)\n .attr('height', gridSize);\n\n const legendRect = legendSvg.selectAll('.legend').data(legendRange);\n\n legendRect\n .enter()\n .append('g')\n .attr('class', 'legend')\n .append('rect')\n .attr('x', (d, i) => gridSize * i)\n .style('fill', (d, i) => colorScale(i))\n .attr('rx', 4)\n .attr('ry', 4)\n .attr('class', 'hour bordered')\n .attr('width', gridSize)\n .attr('height', gridSize)\n .style('opacity', d => d)\n .style('fill', d => colorScale(d));\n\n legendRect.exit().remove();\n }, [\n activityFeed,\n archivedActivities,\n bottomActivity,\n currentActivity,\n currentHeatMapActivity,\n filteredLinearProjection,\n relativeFromTime,\n relativeToTime,\n tacticalActivities,\n heatMapType,\n ]);\n\n const activityToSteppoCount = linearProjection.reduce(\n (accum: StringDictionary, steppo) => {\n const proj = steppo.spawn.start;\n const activityName = getActivityName(proj);\n const activityID = getActivityID(proj) || activityName;\n if (!accum[activityID]) {\n accum[activityID] = {\n count: 0,\n displayName: sanitizeName(activityName),\n key: activityID,\n };\n }\n const accumElement = accum[activityID];\n accum[activityID] = {\n ...accumElement,\n name: activityName,\n count: accumElement.count + steppo.value,\n };\n return accum;\n },\n {},\n );\n\n const activityOptions = Object.values(activityToSteppoCount).sort(\n (a, b) => b.count - a.count,\n );\n\n useEffect(() => {\n if (\n (!currentHeatMapActivity.name ||\n !activityOptions.find(\n opt => opt.name === currentHeatMapActivity.name,\n )) &&\n activityOptions.length > 0 &&\n activityOptions[0].name\n ) {\n setCurrentHeatMapActivity(activityOptions[0]);\n }\n }, [activityOptions, currentHeatMapActivity]);\n\n const mappedTacticalActivities = mapTacticalActivitiesToID({\n ...tacticalActivities,\n 9001: RecoveryActivity,\n });\n const classes = useStyles();\n const changeChart = (e: any) => {\n setHeatMapType(e.target.value);\n }\n return (\n
\n {!!currentHeatMapActivity.name && (\n
\n \n Activity by: \n \n }\n label=\"Minute\"\n labelPlacement=\"start\"\n />\n }\n label=\"Hour\"\n labelPlacement=\"start\"\n />\n \n \n
\n \n
\n {\n const nextSelection = activityOptions.find(\n option => option.displayName === event.target.value,\n );\n setCurrentHeatMapActivity(nextSelection || activityOptions[0]);\n }}>\n {activityOptions.map(value => {\n return (\n \n {value.displayName}\n \n );\n })}\n \n
\n
\n
\n less\n more\n
\n
\n
\n )}\n
\n
\n );\n};\n\nconst mapStateToProps = (state: GlobalState): Props => {\n const {\n activityFeed,\n selectedHistoryRange: {to, from},\n capstone: {bottomActivity},\n } = selectHistoryState(state);\n const {currentActivity} = selectActivityState(state);\n const {objectives} = selectStrategyState(state);\n const {activities, archivedActivities} = selectTacticalActivityState(state);\n return {\n activityFeed,\n currentActivity,\n relativeToTime: to,\n relativeFromTime: from,\n tacticalActivities: activities,\n archivedActivities,\n bottomActivity,\n objectives,\n };\n};\n\nexport default connect(mapStateToProps)(HeatMap);\n","import * as React from 'react';\nimport {FC, useEffect} from 'react';\nimport {select} from 'd3-selection';\nimport {arc, pie} from 'd3';\nimport {connect} from 'react-redux';\nimport {\n GlobalState,\n selectHistoryState,\n selectStrategyState,\n selectTacticalActivityState,\n selectUserState,\n} from '../../reducers';\nimport {numberObjectToArray, objectToKeyValueArray,} from '../../miscellanous/Tools';\nimport {areDifferent, getActivityIdentifier, shouldTime,} from '../../miscellanous/Projection';\nimport {constructColorMappings} from './TimeLine';\nimport {dictionaryReducer} from '../../reducers/StrategyReducer';\nimport {TacticalActivity} from '../../types/TacticalTypes';\nimport {HasId, NumberDictionary, StringDictionary} from '../../types/BaseTypes';\nimport {activitiesEqual, Activity, DEFAULT_ACTIVITY, getActivityName, RECOVERY,} from '../../types/ActivityTypes';\nimport reduceRight from 'lodash/reduceRight';\nimport ExpansionPanelSummary from '@material-ui/core/ExpansionPanelSummary';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport Typography from '@material-ui/core/Typography';\nimport ExpansionPanelDetails from '@material-ui/core/ExpansionPanelDetails';\nimport ExpansionPanel from '@material-ui/core/ExpansionPanel';\nimport {TacticalActivityIcon} from '../icons/TacticalActivityIcon';\nimport {Objective} from '../../types/StrategyTypes';\nimport moment from 'moment';\nimport {RecoveryActivity} from './HeatMap';\nimport capitalize from \"@material-ui/core/utils/capitalize\";\n\nexport const getMeaningFullName = (\n activityId: string,\n tacticalActivities: StringDictionary,\n) => {\n const tacticalActivity: TacticalActivity = tacticalActivities[activityId];\n return (tacticalActivity && tacticalActivity.name) || activityId;\n};\n\nexport const responsivefy = (svg: any) => {\n const container = select(svg.node().parentNode),\n width = parseInt(svg.style('width'), 10),\n height = parseInt(svg.style('height'), 10),\n aspect = width / height;\n svg.attr('perserveAspectRatio', 'xMinYMid').call(resize);\n\n select(window).on('resize.' + container.attr('id'), resize);\n\n function resize() {\n const targetWidth = parseInt(container.style('width'), 10);\n svg.attr('width', targetWidth);\n const heightBoi = Math.round(targetWidth / aspect);\n svg.attr('height', heightBoi);\n }\n};\n\nexport const mapTacticalActivitiesToID = (\n tacticalActivities: NumberDictionary,\n): StringDictionary =>\n numberObjectToArray(tacticalActivities).reduce(dictionaryReducer, {});\n\ninterface Props {\n activityFeed: Activity[];\n relativeToTime: number;\n relativeFromTime: number;\n tacticalActivities: NumberDictionary;\n bottomActivity: Activity;\n archivedActivities: NumberDictionary;\n objectives: StringDictionary;\n firstName: string;\n}\n\ninterface GroupedActivity {\n activityName: string;\n activityIdentifier: string;\n duration: number;\n spawn: Activity;\n}\n\ninterface ProjectionReduction {\n trackedTime: number;\n currentActivity: Activity;\n activityBins: StringDictionary;\n}\n\nfunction addCurrentActivityToProjection(\n activityProjection: ProjectionReduction,\n relativeToTime: number,\n) {\n const bins = activityProjection.activityBins;\n const activityIdentifier = getActivityIdentifier(\n activityProjection.currentActivity,\n );\n if (!bins[activityIdentifier]) {\n bins[activityIdentifier] = [];\n }\n\n const activityName = getActivityName(activityProjection.currentActivity);\n const meow = new Date().getTime();\n const capTime = meow < relativeToTime ? meow : relativeToTime;\n const duration = capTime - activityProjection.trackedTime;\n bins[activityIdentifier].push({\n activityName,\n activityIdentifier,\n duration,\n spawn: activityProjection.currentActivity,\n });\n return bins;\n}\n\nfunction createActivity(mappedTacticalActivities: StringDictionary) {\n return (data: any) => {\n const activity = mappedTacticalActivities[data.name];\n return (\n
\n
\n \n
\n \n {getMeaningFullName(data.name, mappedTacticalActivities)}:{' '}\n {(data.value / 3600000).toFixed(3)} hours\n or about {moment.duration(data.value).humanize()}\n \n
\n );\n };\n}\n\nconst PieFlavored: FC = ({\n activityFeed,\n relativeToTime,\n relativeFromTime,\n tacticalActivities,\n bottomActivity,\n archivedActivities,\n firstName,\n }) => {\n const activityProjection: ProjectionReduction = reduceRight(\n activityFeed,\n (accum: ProjectionReduction, activity: Activity) => {\n if (accum.trackedTime < 0) {\n accum.trackedTime =\n activity.antecedenceTime < relativeFromTime\n ? relativeFromTime\n : activity.antecedenceTime;\n }\n\n if (shouldTime(activity) && !accum.currentActivity.antecedenceTime) {\n accum.currentActivity = activity;\n } else if (\n areDifferent(accum.currentActivity, activity) &&\n shouldTime(activity)\n ) {\n // Different Type: Create workable chunk and start next activity.\n const currentActivity = accum.currentActivity;\n accum.currentActivity = activity;\n const adjustedAntecedenceTime =\n activity.antecedenceTime < relativeFromTime\n ? relativeFromTime\n : activity.antecedenceTime;\n const duration = adjustedAntecedenceTime - accum.trackedTime;\n accum.trackedTime = activity.antecedenceTime;\n const activityName: string = getActivityName(currentActivity);\n const activityIdentifier = getActivityIdentifier(currentActivity);\n if (!accum.activityBins[activityIdentifier]) {\n accum.activityBins[activityIdentifier] = [];\n }\n accum.activityBins[activityIdentifier].push({\n activityName,\n activityIdentifier,\n duration,\n spawn: currentActivity,\n });\n }\n return accum;\n },\n {\n trackedTime: -1,\n currentActivity: DEFAULT_ACTIVITY,\n activityBins: {},\n },\n );\n\n const bins = addCurrentActivityToProjection(\n activityProjection,\n relativeToTime,\n );\n\n const bottomCapActivity: Activity = bottomActivity;\n const earliestActivity: Activity = activityFeed[activityFeed.length - 1];\n if (\n !activitiesEqual(earliestActivity, bottomCapActivity) &&\n earliestActivity &&\n (earliestActivity &&\n earliestActivity.antecedenceTime >= bottomActivity.antecedenceTime)\n ) {\n const bottomActivityIdentifier = getActivityIdentifier(bottomCapActivity);\n if (!bins[bottomActivityIdentifier]) {\n bins[bottomActivityIdentifier] = [];\n }\n const bottomCapActivityName = getActivityName(bottomCapActivity);\n const bottomTime =\n bottomCapActivity.antecedenceTime < relativeFromTime\n ? relativeFromTime\n : bottomCapActivity.antecedenceTime;\n const bottomDuration = earliestActivity.antecedenceTime - bottomTime;\n bins[bottomActivityIdentifier].push({\n activityName: bottomCapActivityName,\n activityIdentifier: bottomActivityIdentifier,\n duration: bottomDuration,\n spawn: bottomActivity,\n });\n }\n\n const pieData = reduceRight(\n objectToKeyValueArray(bins),\n (accum: { name: string; value: number }[], keyValue) => {\n accum.push({\n name: keyValue.key,\n value: keyValue.value.reduce(\n (kvAccum, binBoi) => kvAccum + binBoi.duration,\n 0,\n ),\n });\n return accum;\n },\n [],\n );\n\n const totalTime = pieData.reduceRight((accum, b) => accum + b.value, 0);\n const mappedTacticalActivities: StringDictionary = {\n ...mapTacticalActivitiesToID(tacticalActivities),\n ...archivedActivities,\n [RECOVERY]: RecoveryActivity,\n };\n\n useEffect(() => {\n if (activityFeed.length > 0) {\n const selection = select('#pieBoi');\n const width = 300;\n const height = 300;\n\n selection.select('svg').remove();\n\n const pieSVG = selection\n .append('svg')\n // @ts-ignore real\n .attr('viewBox', [-width / 2, -height / 2, width, height])\n .call(responsivefy)\n .append('g');\n\n const pieFlavored = pie()\n .padAngle(0.005)\n .sort(null)\n // @ts-ignore real\n .value(d => d.value);\n\n // @ts-ignore real\n const arcs = pieFlavored(pieData);\n\n const radius = Math.min(width, height) / 2;\n const arcThing = arc()\n .innerRadius(0)\n .outerRadius(radius - 1);\n\n const idToColor = constructColorMappings(mappedTacticalActivities);\n\n pieSVG\n .selectAll('path')\n .data(arcs)\n .join('path')\n .attr('fill', (d: any) => idToColor[d.data.name])\n .attr('opacity', 0.7)\n .attr('d', (d: any) => arcThing(d))\n .append('title')\n .text(\n (d: any) =>\n `${getMeaningFullName(d.data.name, mappedTacticalActivities)}: ${(\n (d.data.value / totalTime) *\n 100\n ).toFixed(2)}% or ${moment.duration(d.data.value).humanize()}`,\n );\n }\n });\n\n const orderedPieData = [...pieData].sort((a, b) => b.value - a.value);\n\n return (\n
\n
\n
\n
\n \n {capitalize(firstName)}'s Top 5 Activities\n \n
\n
\n {orderedPieData.slice(0, 5).map(createActivity(mappedTacticalActivities))}\n
\n
\n \n
Hi!
\n
\n
\n \n }\n aria-controls=\"panel1a-content\"\n id=\"panel1a-header\">\n
\n Full Activity Breakdown\n
\n \n \n \n {orderedPieData.map(createActivity(mappedTacticalActivities))}\n
\n \n \n
\n );\n};\n\nconst mapStateToProps = (state: GlobalState): Props => {\n const {\n activityFeed,\n selectedHistoryRange: {to, from},\n capstone: {bottomActivity},\n } = selectHistoryState(state);\n const {objectives} = selectStrategyState(state);\n const {activities, archivedActivities} = selectTacticalActivityState(state);\n const {\n information: {firstName},\n } = selectUserState(state);\n\n return {\n activityFeed,\n relativeToTime: to,\n relativeFromTime: from,\n tacticalActivities: activities,\n archivedActivities,\n bottomActivity,\n objectives,\n firstName,\n };\n};\nexport default connect(mapStateToProps)(PieFlavored);\n","import React, {Dispatch} from 'react';\nimport makeStyles from '@material-ui/core/styles/makeStyles';\nimport {useDispatch, useSelector} from 'react-redux';\nimport Slide from '@material-ui/core/Slide';\nimport Close from '@material-ui/icons/Close';\nimport uuid from 'uuid/v4';\nimport {PomodoroTimer} from './PomodoroTimer';\nimport Stopwatch from './Stopwatch';\nimport {blue, green} from '@material-ui/core/colors';\nimport {\n GlobalState,\n selectActivityState, selectSecurityState,\n selectTacticalState,\n} from '../../reducers';\nimport {TacticalActivityIcon} from '../icons/TacticalActivityIcon';\nimport {TomatoIcon} from '../icons/TomatoIcon';\nimport {mapTacticalActivitiesToID} from '../history/PieFlavored';\nimport {buildCommenceActivityContents} from './ActivityHub';\nimport {\n startNonTimedActivity,\n startTimedActivity,\n} from '../../actions/ActivityActions';\nimport omit from 'lodash/omit';\nimport {\n Activity,\n ActivityTimedType,\n ActivityType,\n getActivityID,\n isActivityRecovery,\n isPausedActivity,\n RECOVERY,\n} from '../../types/ActivityTypes';\nimport {Typography} from \"@material-ui/core\";\n\nconst useStyles = makeStyles(theme => ({\n pomoCount: {\n display: 'flex',\n marginRight: '0.5rem',\n },\n timer: {\n position: 'fixed',\n bottom: 0,\n width: '100%',\n display: 'flex',\n paddingTop: theme.spacing(0.5),\n paddingBottom: theme.spacing(0.5),\n zIndex: 69,\n background: green[500],\n },\n recovery: {\n background: blue[500],\n },\n close: {\n display: 'inline-flex',\n position: 'relative',\n cursor: 'pointer',\n paddingRight: theme.spacing(1),\n },\n activityIcon: {\n lineHeight: 1,\n marginLeft: theme.spacing(1),\n },\n}));\n\nexport const resumeActivity = (\n dispetch: Dispatch,\n previousActivity: Activity,\n currentActivity: Activity,\n) => {\n dispetch(\n startTimedActivity({\n ...previousActivity.content,\n ...(previousActivity.content.duration\n ? {\n duration: Math.max(\n previousActivity.content.duration +\n (previousActivity.antecedenceTime -\n currentActivity.antecedenceTime),\n 0,\n ),\n }\n : {}),\n ...(previousActivity.content.workStartedWomboCombo\n ? {\n workStartedWomboCombo: Math.max(\n new Date().valueOf() -\n (currentActivity.antecedenceTime -\n previousActivity.content.workStartedWomboCombo),\n 0,\n ),\n }\n : {}),\n uuid: uuid(),\n }),\n );\n};\n\nconst mapStateToProps = (state: GlobalState) => {\n const {\n currentActivity,\n previousActivity,\n shouldTime,\n completedPomodoro: {count},\n } = selectActivityState(state);\n const {\n pomodoro: {settings},\n activity: {activities},\n } = selectTacticalState(state);\n const {\n readOnly\n } = selectSecurityState(state);\n return {\n shouldTime,\n currentActivity,\n previousActivity,\n pomodoroSettings: settings,\n activities,\n numberOfCompletedPomodoro: count,\n readOnly,\n };\n};\n\nconst ActivityTimeBar = () => {\n const classes = useStyles();\n const {\n shouldTime,\n currentActivity,\n activities,\n numberOfCompletedPomodoro,\n previousActivity,\n pomodoroSettings,\n readOnly,\n } = useSelector(mapStateToProps);\n\n const {\n content: {timedType, name},\n } = currentActivity;\n\n const dispetch: Dispatch = useDispatch();\n const stopActivity = () => {\n dispetch(\n startNonTimedActivity({\n name: RECOVERY,\n type: ActivityType.ACTIVE,\n timedType: ActivityTimedType.NONE,\n uuid: uuid(),\n }),\n );\n };\n\n const pivotActivity = (pivotName: string, supplements: any) => {\n const activityContent = buildCommenceActivityContents(\n supplements,\n pivotName,\n );\n return dispetch(\n startTimedActivity({\n ...activityContent,\n paused: true,\n }),\n );\n };\n\n const startPausedRecovery = () => {\n dispetch(\n startTimedActivity({\n name: RECOVERY,\n type: ActivityType.ACTIVE,\n timedType: ActivityTimedType.STOP_WATCH,\n paused: true,\n uuid: uuid(),\n }),\n );\n };\n\n const swapActivity = (activityName: string, supplements: any) => {\n const meow = new Date().valueOf();\n const duration =\n currentActivity.content.duration || pomodoroSettings.loadDuration;\n dispetch(\n startTimedActivity({\n ...supplements,\n name: activityName,\n type: ActivityType.ACTIVE,\n timedType: ActivityTimedType.TIMER,\n duration: duration - (meow - currentActivity.antecedenceTime),\n uuid: uuid(),\n }),\n );\n };\n\n const resumePreviousActivity = () => {\n dispetch(\n startTimedActivity({\n ...omit(previousActivity.content, ['autoStart']),\n ...(previousActivity.content.duration\n ? {\n duration: pomodoroSettings.loadDuration,\n }\n : {}),\n uuid: uuid(),\n }),\n );\n };\n\n const isTimer = timedType === ActivityTimedType.TIMER;\n\n const isRecovery = isActivityRecovery(currentActivity);\n const getTimerBarClasses = () => {\n const timerBarClasses = [classes.timer];\n if (isRecovery) {\n timerBarClasses.push(classes.recovery);\n }\n return timerBarClasses.join(' ');\n };\n\n const mappedTacticalActivities = mapTacticalActivitiesToID(activities);\n const tacticalActivity =\n mappedTacticalActivities[getActivityID(currentActivity)];\n\n const isTimeBarActivity = shouldTime && !isPausedActivity(currentActivity);\n return isTimeBarActivity ? (\n \n
\n {tacticalActivity && (\n <>\n
\n \n
\n {\n readOnly && (\n \n {tacticalActivity.name}\n \n )\n }\n \n )}\n {!tacticalActivity && isTimer && !isRecovery && (\n \n )}\n
\n {isTimer ? (\n \n ) : (\n \n )}\n
\n {isTimer && name !== RECOVERY && (\n
\n
{numberOfCompletedPomodoro}:
\n \n
\n )}\n {\n !readOnly ?\n (\n
\n \n
\n ) :\n (<>)\n }\n\n
\n
\n ) : null;\n};\n\nexport default ActivityTimeBar;\n","import {connect} from 'react-redux';\nimport React, {FC} from 'react';\nimport Zoom from '@material-ui/core/Zoom';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport CloudOff from '@material-ui/icons/CloudOff';\nimport {makeStyles} from '@material-ui/core';\nimport {GlobalState, selectNetworkState} from '../../reducers';\n\nconst useStyles = makeStyles(theme => ({\n offline: {\n // @ts-ignore real\n color: theme.palette.primary.alertColor,\n },\n}));\n\ntype Props = {\n isOnline: boolean;\n hasInternet: boolean;\n};\n\nconst OfflineMode: FC = ({isOnline, hasInternet}) => {\n const classes = useStyles();\n return (\n \n \n \n \n \n );\n};\nconst mapStateToProps = (state: GlobalState) => {\n const {isOnline, hasInternet} = selectNetworkState(state);\n return {\n isOnline,\n hasInternet,\n };\n};\nexport default connect(mapStateToProps)(OfflineMode);\n","import React, {useEffect, useState} from 'react';\nimport GetApp from '@material-ui/icons/GetApp';\nimport IconButton from '@material-ui/core/IconButton';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport {makeStyles} from '@material-ui/core';\nimport Zoom from '@material-ui/core/Zoom';\n\nconst useStyles = makeStyles(theme => ({\n download: {\n // @ts-ignore real\n color: theme.palette.primary.alertColor,\n opacity: 0.95,\n },\n}));\n\nconst isStandalone = () =>\n window.matchMedia('(display-mode: standalone)').matches;\n\nconst InstallApplication = () => {\n const classes = useStyles();\n const [componentDidMount] = useState('didMount');\n const [installPrompt, setInstallPromptState] = useState(\n // @ts-ignore real\n window.sogosInstallPrompt,\n );\n const [askedToInstall, setAskedToInstall] = useState(false);\n useEffect(() => {\n window.addEventListener('beforeinstallprompt', event =>\n setInstallPromptState(event),\n );\n }, [componentDidMount]);\n\n const installApplication = () => {\n installPrompt.prompt();\n installPrompt.userChoice.then((choice: any) => {\n if (choice.outcome === 'accepted') {\n console.log('User accepted the A2HS prompt', choice);\n } else {\n console.log('User dismissed the A2HS prompt', choice);\n }\n setAskedToInstall(true);\n });\n };\n\n const hasInstallPrompt = !!installPrompt;\n const firstTimeAsking = !askedToInstall;\n const notInstalledAlready = !isStandalone();\n return (\n \n \n \n \n \n \n \n );\n};\n\nexport default InstallApplication;\n","import React, {useEffect, useState} from 'react';\nimport SystemUpdate from '@material-ui/icons/SystemUpdate';\nimport IconButton from '@material-ui/core/IconButton';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport {makeStyles} from '@material-ui/core';\nimport Zoom from '@material-ui/core/Zoom';\n\nconst useStyles = makeStyles(theme => ({\n download: {\n // @ts-ignore real\n color: theme.palette.primary.alertColor,\n opacity: 0.95,\n },\n}));\n\nconst UpdateApplication = () => {\n const classes = useStyles();\n const [componentDidMount] = useState('didMount');\n const [registration, setRegistrationState] = useState(null);\n const [didUpdate, setDidUpdate] = useState(false);\n useEffect(() => {\n window.addEventListener('sogosUpdateAvailable', event =>\n // @ts-ignore real\n setRegistrationState(event.detail),\n );\n }, [componentDidMount]);\n\n const installApplication = () => {\n registration && registration.waiting.postMessage('skipWaiting');\n setDidUpdate(true);\n };\n\n const hasRegistration = !!registration;\n const hasUpdated = !didUpdate;\n return (\n \n \n \n \n \n \n \n );\n};\n\nexport default UpdateApplication;\n","import * as React from 'react';\nimport {MountainIcon, SizeType} from './MountainIcon';\nimport {Objective} from '../../types/StrategyTypes';\n\ntype GoalProps = {\n objective?: Objective | null;\n size?: SizeType;\n};\nexport const GoalIcon = ({objective, size}: GoalProps) => {\n const iconCustomization = (objective || {}).iconCustomization;\n const skyColor = (iconCustomization && iconCustomization.background) || {\n hex: '#86a4f3',\n opacity: 1,\n };\n return (\n
\n \n
\n );\n};\n","import React, {FC, useState} from 'react';\nimport Drawer from '@material-ui/core/Drawer';\nimport List from '@material-ui/core/List';\nimport ListItem from '@material-ui/core/ListItem';\nimport ListItemText from '@material-ui/core/ListItemText';\nimport IconButton from '@material-ui/core/IconButton';\nimport {Link} from 'react-router-dom';\nimport {makeStyles} from '@material-ui/core';\nimport MenuIcon from '@material-ui/icons/Menu';\nimport ListItemIcon from '@material-ui/core/ListItemIcon';\nimport MailIcon from '@material-ui/icons/Mail';\nimport SettingsIcon from '@material-ui/icons/Settings';\nimport QuestionIcon from '@material-ui/icons/QuestionAnswer';\nimport HomeIcon from '@material-ui/icons/Home';\nimport {GlobalState, selectUserState} from '../../reducers';\nimport {useSelector} from 'react-redux';\nimport HistoryIcon from '@material-ui/icons/History';\nimport {SlideProps} from '@material-ui/core/Slide';\nimport {ActivityIcon} from \"../icons/ActivityIcon\";\nimport {GoalIcon} from \"../icons/GoalIcon\";\n\nconst useStyles = makeStyles(theme => ({\n list: {\n width: 250,\n },\n drawer: {\n backgroundColor: theme.palette.secondary.main,\n color: theme.palette.secondary.contrastText,\n position: 'fixed',\n height: '100%',\n width: '200px',\n },\n fullList: {\n width: 'auto',\n },\n menuButton: {},\n grow: {\n flexGrow: 1,\n },\n}));\n\ntype Props = {};\n\ninterface Topic {\n title: string;\n path: string;\n icon: JSX.Element;\n href?: string;\n}\n\nconst mapStateToProps = (state: GlobalState) => {\n const {\n information: {guid},\n } = selectUserState(state);\n return {\n guid,\n };\n};\n\nconst MenuNavigation: FC = () => {\n const {guid} = useSelector(mapStateToProps);\n const topics: Topic[] = [\n {\n title: 'Goals',\n path: '/strategy/objectives/',\n icon: ,\n },\n {\n title: 'Activities',\n path: '/tactical/activities/',\n icon: ,\n },\n {\n title: 'History',\n path: `/${guid}/history/`,\n icon: ,\n },\n {\n title: 'Settings',\n path: '/settings/',\n icon: ,\n }, {\n title: 'About',\n path: '/about',\n icon: ,\n },\n ];\n const classes = useStyles();\n const [drawerOpen, setDrawerOpen] = useState(false);\n const toggleDrawer = (open: boolean) => () => {\n setDrawerOpen(open);\n };\n\n const getListItem = (index: number, topic: Topic) => {\n return (\n \n {topic.icon || }\n \n \n );\n };\n\n const menuTopics = [\n {\n title: 'Home',\n path: '/',\n icon: ,\n },\n ...topics,\n ];\n const fullList = (\n
\n \n {menuTopics.map((topic, index) =>\n topic.path ? (\n \n {getListItem(index, topic)}\n \n ) : (\n \n {getListItem(index, topic)}\n \n ),\n )}\n \n
\n );\n const slideProps: Partial = {\n // @ts-ignore real\n className: classes.drawer,\n };\n return (\n
\n \n \n \n \n \n {fullList}\n
\n \n \n );\n};\n\nexport default MenuNavigation;\n","import {connect, DispatchProp} from 'react-redux';\nimport React, {FC} from 'react';\nimport Zoom from '@material-ui/core/Zoom';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport Sync from '@material-ui/icons/Sync';\nimport {makeStyles} from '@material-ui/core';\nimport {GlobalState, selectNetworkState, selectUserState} from '../../reducers';\nimport IconButton from '@material-ui/core/IconButton';\nimport {createRequestedSyncEvent} from '../../events/UserEvents';\n\nconst useStyles = makeStyles(theme => ({\n offline: {\n // @ts-ignore real\n color: theme.palette.primary.alertColor,\n },\n}));\n\ntype Props = DispatchProp & {\n isOnline: boolean;\n hasItemsCached: boolean;\n};\n\nconst ManualSync: FC = ({\n isOnline,\n hasItemsCached,\n dispatch: dispetch,\n}) => {\n const classes = useStyles();\n const shouldDisplay = isOnline && hasItemsCached;\n return shouldDisplay ? (\n dispetch(createRequestedSyncEvent())}>\n \n \n \n \n \n \n ) : null;\n};\nconst mapStateToProps = (state: GlobalState) => {\n const {isOnline} = selectNetworkState(state);\n const {\n miscellaneous: {hasItemsCached},\n } = selectUserState(state);\n return {\n isOnline,\n hasItemsCached,\n };\n};\nexport default connect(mapStateToProps)(ManualSync);\n","import React, {FC, MouseEventHandler} from 'react';\nimport {makeStyles} from '@material-ui/core/styles';\nimport AppBar from '@material-ui/core/AppBar';\nimport Toolbar from '@material-ui/core/Toolbar';\nimport Typography from '@material-ui/core/Typography';\nimport IconButton from '@material-ui/core/IconButton';\nimport MoreVertIcon from '@material-ui/icons/MoreVert';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport Menu from '@material-ui/core/Menu';\nimport {connect, DispatchProp} from 'react-redux';\nimport OfflineMode from './OfflineMode';\nimport InstallApplication from './InstallApplication';\nimport UpdateApplication from './UpdateApplication';\nimport {Link} from 'react-router-dom';\nimport MenuNavigation from './MenuNavigation';\nimport ManualSync from './ManualSync';\nimport {requestLogoff} from '../../events/SecurityEvents';\n\nconst useStyles = makeStyles(theme => ({\n root: {\n flexGrow: 1,\n },\n menuButton: {\n marginRight: theme.spacing(2),\n },\n title: {\n flexGrow: 1,\n },\n link: {\n textDecoration: 'none',\n color: 'inherit',\n },\n}));\n\ntype Props = DispatchProp & {};\n\nconst MenuAppBar: FC = ({dispatch: dispetch}) => {\n const classes = useStyles();\n const [anchorEl, setAnchorEl] = React.useState(null);\n const open = Boolean(anchorEl);\n\n const handleMenu: MouseEventHandler = event => {\n setAnchorEl(event.currentTarget);\n };\n\n const handleClose = () => {\n setAnchorEl(null);\n };\n\n const logUserOut = (): void => {\n dispetch(requestLogoff());\n };\n\n return (\n
\n \n \n \n \n \n \n \n \n
\n \n \n \n \n {\n handleClose();\n }}>\n \n Settings\n \n \n {\n handleClose();\n logUserOut();\n }}>\n Logout\n \n \n
\n
\n
\n
\n );\n};\n\nexport default connect()(MenuAppBar);\n","import {connect, DispatchProp} from 'react-redux';\nimport React from 'react';\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogContentText from '@material-ui/core/DialogContentText';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport Slide from '@material-ui/core/Slide';\nimport Button from '@material-ui/core/Button';\nimport {GlobalState} from '../../reducers';\nimport {TransitionProps} from '@material-ui/core/transitions';\nimport {requestLogoff} from \"../../events/SecurityEvents\";\n\nconst Transition: React.ComponentType = React.forwardRef(\n function Transition(props, ref) {\n // @ts-ignore\n return ;\n },\n);\ntype Props = DispatchProp & {\n isExpired: boolean;\n};\nconst SessionExpired = ({isExpired, dispatch: dispetch}: Props) => {\n const goToLogin = (): void => {\n dispetch(requestLogoff())\n };\n return (\n \n \n {'Session Expired!'}\n \n \n \n Hey! Your session is expired. No big deal, just log in again, please.\n \n \n \n \n \n \n );\n};\n\nconst mapStateToProps = (state: GlobalState) => {\n const {\n security: {isExpired},\n } = state;\n return {\n isExpired,\n };\n};\nexport default connect(mapStateToProps)(SessionExpired);\n","import * as React from 'react';\nimport {useDispatch, useSelector} from 'react-redux';\nimport makeStyles from '@material-ui/core/styles/makeStyles';\nimport PlayCircleFilled from '@material-ui/icons/PlayCircleFilled';\nimport Stop from '@material-ui/icons/Stop';\nimport {\n GlobalState,\n selectActivityState,\n selectTacticalActivityState,\n} from '../../reducers';\nimport Stopwatch from './Stopwatch';\nimport {resumeActivity} from './ActivityTimeBar';\nimport uuid from 'uuid/v4';\nimport IconButton from '@material-ui/core/IconButton';\nimport {green} from '@material-ui/core/colors';\nimport {numberObjectToArray} from '../../miscellanous/Tools';\nimport {dictionaryReducer} from '../../reducers/StrategyReducer';\nimport {TacticalActivityIcon} from '../icons/TacticalActivityIcon';\nimport {GENERIC_ACTIVITY_NAME} from './ActivityHub';\nimport {TacticalActivity} from '../../types/TacticalTypes';\nimport {\n ActivityTimedType,\n ActivityType,\n getActivityID,\n getActivityName,\n isPausedActivity,\n RECOVERY,\n} from '../../types/ActivityTypes';\nimport {startNonTimedActivity} from '../../actions/ActivityActions';\nimport {StringDictionary} from '../../types/BaseTypes';\n\nconst useStyles = makeStyles(theme => ({\n container: {\n background: 'rgba(0,0,0,0.9)',\n position: 'fixed',\n top: '0',\n width: '100%',\n zIndex: 10000,\n height: '100%',\n },\n contents: {\n top: '30%',\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n },\n stopWatch: {\n margin: 'auto',\n },\n icon: {\n fontSize: '5em',\n color: green[500],\n },\n cancel: {},\n cancelIcon: {\n fontSize: '1.25em',\n color: 'red',\n background: 'rgba(240, 0,0,0.25)',\n borderRadius: '50%',\n padding: theme.spacing(0.5),\n },\n pivotContainer: {\n marginTop: theme.spacing(1),\n },\n pivotLabel: {\n display: 'flex',\n marginBottom: theme.spacing(1),\n justifyContent: 'center',\n fontSize: '1.5em',\n },\n}));\n\nconst mapStateToProps = (state: GlobalState) => {\n const {currentActivity, previousActivity, shouldTime} = selectActivityState(\n state,\n );\n const {activities} = selectTacticalActivityState(state);\n return {\n shouldTime,\n currentActivity,\n previousActivity,\n activities,\n };\n};\n\nconst PausedPomodoro = () => {\n const classes: any = useStyles();\n const {\n shouldTime,\n currentActivity,\n previousActivity,\n activities,\n } = useSelector(mapStateToProps);\n const {\n content: {timedType},\n } = currentActivity;\n\n const mappedTacticalActivities: StringDictionary<\n TacticalActivity\n > = numberObjectToArray(activities).reduce(dictionaryReducer, {});\n const tacticalActivity =\n mappedTacticalActivities[getActivityID(currentActivity)];\n\n const dispetch = useDispatch();\n const stopActivity = () => {\n dispetch(\n startNonTimedActivity({\n name: RECOVERY,\n type: ActivityType.ACTIVE,\n timedType: ActivityTimedType.NONE,\n uuid: uuid(),\n }),\n );\n };\n\n const resumePreviousActivity = () => {\n resumeActivity(dispetch, previousActivity, currentActivity);\n };\n\n const isPausedPomodoro =\n shouldTime &&\n isPausedActivity(currentActivity) &&\n timedType === ActivityTimedType.STOP_WATCH;\n return isPausedPomodoro ? (\n
\n
\n
\n
\n \n
\n
\n \n \n \n \n \n \n
\n {(tacticalActivity ||\n getActivityName(currentActivity) === GENERIC_ACTIVITY_NAME) && (\n
\n
\n
\n Pivoted to: {getActivityName(currentActivity).replace(/_/, ' ')}{' '}\n
\n
\n {tacticalActivity && (\n \n )}\n
\n )}\n
\n
\n ) : null;\n};\n\nexport default PausedPomodoro;\n","import * as React from 'react';\nimport {FC} from 'react';\nimport {connect, DispatchProp} from 'react-redux';\nimport makeStyles from '@material-ui/core/styles/makeStyles';\nimport {SnackbarContent} from '@material-ui/core';\nimport WarningIcon from '@material-ui/icons/Warning';\nimport InfoIcon from '@material-ui/icons/Info';\nimport CloseIcon from '@material-ui/icons/Close';\nimport IconButton from '@material-ui/core/IconButton';\nimport {amber} from '@material-ui/core/colors';\nimport Snackbar from '@material-ui/core/Snackbar';\nimport {GlobalState, selectMiscState} from '../../reducers';\nimport {createHideNotificationEvent} from '../../events/MiscEvents';\nimport green from \"@material-ui/core/colors/green\";\nimport {NotificationType} from '../../reducers/MiscellaneousReducer';\n\nconst useStyles = makeStyles(theme => ({\n container: {},\n snackBarWarn: {\n backgroundColor: amber[700],\n },\n snackBaInfo: {\n backgroundColor: green[700],\n },\n icon: {\n opacity: 0.9,\n marginRight: theme.spacing(1),\n },\n message: {\n display: 'flex',\n alignItems: 'center',\n },\n}));\n\ntype Props = DispatchProp & {\n shown: boolean;\n message: string;\n type: NotificationType;\n};\n\nconst SnackBoi: FC = ({message, shown, type, dispatch}) => {\n const classes = useStyles();\n const onClose = () => {\n dispatch(createHideNotificationEvent());\n };\n\n return (\n
\n \n \n {\n type === NotificationType.INFO ?\n ():\n ()\n }\n {message}\n \n }\n action={[\n \n \n ,\n ]}\n />\n \n
\n );\n};\n\nconst mapStateToProps = (state: GlobalState) => {\n const {\n notification: {message, shown, type},\n } = selectMiscState(state);\n return {\n message,\n shown,\n type,\n };\n};\n\nexport default connect(mapStateToProps)(SnackBoi);\n","import React, {FC} from 'react';\nimport confetti from 'canvas-confetti';\nimport {Dialog} from '@material-ui/core';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogContentText from '@material-ui/core/DialogContentText';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport Button from '@material-ui/core/Button';\nimport {GlobalState, selectUserState} from '../../reducers';\nimport {connect, useDispatch} from 'react-redux';\nimport {createThankedForDownloadingTacModEvent} from \"../../events/ActivityEvents\";\n\nfunction getConfetti(x: number, y: number) {\n return confetti({\n particleCount: 100,\n spread: 360,\n origin: {\n x,\n y,\n },\n });\n}\n\ninterface Props {\n name?: string;\n tacModDownloaded?: boolean;\n tacModThanked?: boolean;\n}\n\nconst TacModThankYou: FC = ({name, tacModDownloaded, tacModThanked}) => {\n const dispatch = useDispatch();\n const boom = () => {\n dispatch(createThankedForDownloadingTacModEvent());\n getConfetti(0.6, 0.2);\n setTimeout(() => {\n getConfetti(0.2, 0.6);\n setTimeout(() => getConfetti(0.8, 0.8), 500);\n }, 500);\n };\n\n const yourName = name ? `${name}, thank you` : 'Hey You! Thanks';\n const myName =\n yourName.toLowerCase().indexOf('alex') > -1 ? 'another Alex' : 'Alex';\n\n return (\n \n Thank you so much!\n \n \n {yourName} for taking the time to download TacMod. It means a lot to\n me. I wanted to take the time tell you that you are awesome! -{myName}\n \n \n \n \n \n \n );\n};\n\nconst mapStateToProps = (state: GlobalState): Props => {\n const {\n information: {firstName},\n miscellaneous: {\n onboarding: {TacModThanked, TacModDownloaded},\n },\n } = selectUserState(state);\n return {\n name: firstName,\n tacModDownloaded: TacModDownloaded,\n tacModThanked: TacModThanked,\n };\n};\n\nexport default connect(mapStateToProps)(TacModThankYou);\n","import React, {FC} from 'react';\n// @ts-ignore\nimport {AutoRotatingCarousel, Slide} from 'material-auto-rotating-carousel';\nimport {cyan, green, orange, purple} from '@material-ui/core/colors';\nimport Confetti from '../../images/confetti.png';\nimport {connect, useDispatch} from 'react-redux';\nimport {createWelcomedUserEvent} from '../../events/ActivityEvents';\nimport {GlobalState, selectUserState} from '../../reducers';\nimport {SOGoS} from '../icons/SOGoS';\nimport QuestionIcon from '@material-ui/icons/ContactSupport';\nimport HistoryIcon from '@material-ui/icons/History';\nimport {GoalIcon} from '../icons/GoalIcon';\nimport {ActivityIcon} from '../icons/ActivityIcon';\n\ninterface Props {\n name?: string;\n email?: string;\n welcomed?: boolean;\n}\n\nconst Onboarding: FC = ({email, name, welcomed}) => {\n const dispatch = useDispatch();\n const dismissWelcome = () => {\n dispatch(createWelcomedUserEvent());\n };\n\n return (\n \n }\n mediaBackgroundStyle={{backgroundColor: '#454545', whiteSpace: 'pre'}}\n style={{backgroundColor: '#333333'}}\n title={`Welcome${name ? ' ' + name : ''}!`}\n subtitle=\"Let's figure out what SOGoS can do for you!\"\n />\n }\n mediaBackgroundStyle={{backgroundColor: orange[400]}}\n style={{backgroundColor: orange[600]}}\n title=\"What are you doing with your time?\"\n subtitle=\"Are you spending time on things that bring you the most value?\n Are you unsure what to do? Do you want to do too much?\"\n />\n }\n mediaBackgroundStyle={{backgroundColor: '#728eda'}}\n style={{backgroundColor: '#5f7dcb'}}\n title=\"Figure out what is important!\"\n subtitle=\"\n Find goals that are difficult to accomplish.\n Dig deep and shoot for the moon. Don't sandbag yourself, strive for\n greatness!\n \"\n />\n }\n mediaBackgroundStyle={{backgroundColor: green[400]}}\n style={{backgroundColor: green[600]}}\n title=\"Take Action!\"\n subtitle=\"Goals are just wishful thoughts and happy daydreams without execution.\n Define the activities that will get you to the top of your mountains.\"\n />\n }\n mediaBackgroundStyle={{backgroundColor: purple[400]}}\n style={{backgroundColor: purple[600]}}\n title=\"Retrospect\"\n subtitle=\"Use the data of your past to drive what you do today.\n Figure out where you can optimize your efforts.\n Most importantly, learn when you should be taking it easy.\n \"\n />\n }\n mediaBackgroundStyle={{backgroundColor: cyan[400]}}\n style={{backgroundColor: cyan[600]}}\n title=\"That's it!\"\n subtitle=\"\n Short and to the point.\n Go forth and do awesome things!\n \"\n />\n \n );\n};\n\nconst mapStateToProps = (state: GlobalState): Props => {\n const {\n information: {firstName, email},\n miscellaneous: {\n onboarding: {welcomed},\n },\n } = selectUserState(state);\n return {\n name: firstName,\n email,\n welcomed,\n };\n};\n\nexport default connect(mapStateToProps)(Onboarding);\n","import React, {FC} from 'react';\nimport MenuAppBar from './MenuAppBar';\nimport SessionExpired from '../auth/SessionExpired';\nimport Activity from '../time/ActivityHub';\nimport makeStyles from '@material-ui/core/styles/makeStyles';\nimport PausedPomodoro from '../time/PausedPomodoro';\nimport SnackBoi from './SnackBoi';\nimport {Container} from '@material-ui/core';\nimport TacModThankYou from \"./TacModThankYou\";\nimport Onboarding from \"./Onboarding\";\n\nconst useStyles = makeStyles(theme => ({\n container: {\n minHeight: '100%',\n marginBottom: theme.spacing(9),\n },\n content: {\n marginTop: -theme.spacing(5),\n },\n}));\n\nconst LoggedInLayout: FC = ({children, ...otherProperties}) => {\n const classes = useStyles();\n return (\n
\n \n \n \n \n \n {children}\n \n \n \n \n
\n );\n};\n\nexport default LoggedInLayout;\n","import * as React from 'react';\nimport History from '../../images/History.svg';\nimport ReactSVG from 'react-svg';\nimport {ColorType} from '../../types/StrategyTypes';\nimport {SizeType} from './MountainIcon';\n\ntype Props = {\n backgroundColor?: ColorType;\n lineColor?: ColorType;\n size?: SizeType;\n};\n\nconst defaultSize: SizeType = {\n height: '100px',\n width: '100px',\n};\n\nexport const HistoryIcon = (props: Props) => {\n const {size} = props;\n const usableSize = size || defaultSize;\n return (\n
\n {\n svg.setAttribute(\n 'width',\n String(usableSize.width || defaultSize.width),\n );\n svg.setAttribute(\n 'height',\n String(usableSize.height || defaultSize.height),\n );\n }}\n />\n
\n );\n};\n","import React from 'react';\nimport {connect} from 'react-redux';\nimport LoggedInLayout from './components/LoggedInLayout';\nimport makeStyles from '@material-ui/core/styles/makeStyles';\nimport Container from '@material-ui/core/Container';\nimport {GlobalState, selectUserState} from '../reducers';\nimport {Card, Typography} from '@material-ui/core';\nimport {SOGoS} from './icons/SOGoS';\nimport Grid from '@material-ui/core/Grid';\nimport CardActionArea from '@material-ui/core/CardActionArea';\nimport {RouteComponentProps, withRouter} from 'react-router-dom';\nimport SettingsIcon from '@material-ui/icons/Settings';\nimport CardContent from '@material-ui/core/CardContent';\nimport {History} from 'history';\nimport {HistoryIcon} from './icons/HistoryIcon';\nimport {GoalIcon} from './icons/GoalIcon';\nimport {ActivityIcon} from './icons/ActivityIcon';\n\nconst useStyles = makeStyles(theme => ({\n content: {\n flexGrow: 1,\n },\n headerContent: {\n borderRadius: theme.spacing(1),\n backgroundColor: theme.palette.background.paper,\n padding: theme.spacing(6, 0, 6),\n marginBottom: theme.spacing(1),\n },\n placeIcon: {\n padding: theme.spacing(2),\n },\n gridItem: {\n padding: theme.spacing(1),\n width: theme.spacing(40),\n },\n}));\n\nconst placesToGo = [\n {\n name: 'Goal Setting',\n description: 'Establish your endgame objectives.',\n icon: ,\n navigator: (history: History, _: string) => () =>\n history.push('./strategy/objectives/'),\n },\n {\n name: 'Activity Definition',\n description: 'Catalog activities needed to reach your goals.',\n icon: ,\n navigator: (history: History, _: string) => () =>\n history.push('./tactical/activities/'),\n },\n {\n name: 'History',\n description: 'Take a look at how you spent your time.',\n icon: ,\n navigator: (history: History, guid: string) => () =>\n history.push(`./${guid}/history/`),\n },\n {\n name: 'Settings',\n description: 'Tailor the experience to your abilities.',\n icon: ,\n navigator: (history: History, _: string) => () =>\n history.push('./settings/'),\n },\n];\ntype Props = RouteComponentProps & {\n fullName: string;\n guid: string;\n};\nconst Dashboard = ({fullName, guid, history}: Props) => {\n const classes = useStyles();\n\n return (\n \n
\n \n \n SOGoS\n \n \n Strategic Orchestration and Governance System\n \n \n Welcome{fullName ? ` ${fullName}` : ''}!\n \n \n \n
\n
\n \n \n \n {placesToGo.map(placeToGo => (\n \n \n \n
{placeToGo.icon}
\n \n \n {placeToGo.name}\n \n \n {placeToGo.description}\n \n \n \n
\n
\n ))}\n
\n
\n \n
\n
\n );\n};\n\nconst mapStateToProps = (state: GlobalState) => {\n const {\n information: {fullName, guid},\n } = selectUserState(state);\n return {\n fullName,\n guid,\n };\n};\n\nexport default connect(mapStateToProps)(withRouter(Dashboard));\n","import {Typography} from '@material-ui/core';\nimport ErrorIcon from '@material-ui/icons/ErrorOutline';\nimport Banner from './Banner';\nimport React from 'react';\n\nconst OutOfSync = () => (\n \n \n \n \n \n Your datetime settings appear to be off. In order to use SOGoS, please\n correct the issue and refresh the browser.\n \n \n);\n\nexport default OutOfSync;\n","import {SecurityState} from '../reducers/SecurityReducer';\nimport {nowInSeconds} from '@openid/appauth';\n\nexport const shouldCheckForAuthorizationGrant = (\n securityState: SecurityState,\n) => {\n return !isAccessTokenValid(securityState);\n};\n\nexport const canRefreshToken = (securityState: SecurityState) => {\n return !isAccessTokenValid(securityState);\n};\n\n/**\n * Checks to see if the access token or refresh token is about expire.\n * This is because the access token is probably still good because of the\n * polling, this way the user can have sessions longer than the refresh token.\n *\n * @param securityState\n * @returns if the access token or refresh token need to be replaced.\n */\nexport const canRefreshEitherTokens = (securityState: SecurityState) => {\n return (\n (!isAccessTokenValid(securityState) &&\n securityState &&\n securityState.refreshToken) ||\n !isRefreshTokenValid(securityState)\n );\n};\n\nexport const isAccessTokenValid = (securityState: SecurityState) => {\n return (\n securityState &&\n securityState.accessTokenInformation &&\n securityState.accessTokenInformation.expiresAt - 5 >= nowInSeconds()\n );\n};\n\nexport const isRefreshTokenValid = (securityState: SecurityState) => {\n return (\n securityState &&\n securityState.refreshTokenInformation &&\n securityState.refreshTokenInformation.expiresAt - 900 >= nowInSeconds()\n );\n};\n","import {\n AuthorizationServiceConfiguration,\n BaseTokenRequestHandler,\n TokenRequest,\n TokenRequestHandler,\n TokenResponse,\n} from '@openid/appauth';\nimport {\n createTokenFailureEvent,\n createTokenReceptionEvent,\n} from '../../events/SecurityEvents';\nimport {call, put} from 'redux-saga/effects';\nimport {OAuthConfig} from '../../types/ConfigurationTypes';\n\nconst tokenHandler: TokenRequestHandler = new BaseTokenRequestHandler();\n\nexport const requestToken = (\n oauthConfig: AuthorizationServiceConfiguration,\n tokenRequest: TokenRequest,\n): Promise =>\n tokenHandler.performTokenRequest(oauthConfig, tokenRequest); //Because Stateful function ._.\n\nexport function* fetchTokenSaga(\n oauthConfig: OAuthConfig,\n tokenRequest: TokenRequest,\n responseModifier: (any: any) => any,\n) {\n try {\n // @ts-ignore real\n const tokenResponse = yield call(requestToken, oauthConfig, tokenRequest);\n yield put(createTokenReceptionEvent(responseModifier(tokenResponse)));\n } catch (error) {\n yield put(\n createTokenFailureEvent({\n tokenRequest,\n error: error.message,\n }),\n );\n }\n}\n\n/**\n * Attempts to fetch token from Authorization Server.\n *\n * And will include the new refresh token as part of state.\n * @param oauthConfig\n * @param tokenRequest\n * @returns\n */\nexport function* fetchTokenWithRefreshSaga(\n oauthConfig: OAuthConfig,\n tokenRequest: TokenRequest,\n) {\n yield call(fetchTokenSaga, oauthConfig, tokenRequest, identityFunction);\n}\n\nexport const identityFunction = (tokenResponse: T): T => tokenResponse;\n\n/**\n * Attempts to fetch token from Authorization Server.\n *\n * And will ***NOT*** include the new refresh token as part of state.\n * @param oauthConfig\n * @param tokenRequest\n * @returns\n */\nexport function* fetchTokenWithoutSessionRefreshSaga(\n oauthConfig: OAuthConfig,\n tokenRequest: TokenRequest,\n) {\n yield call(fetchTokenSaga, oauthConfig, tokenRequest, refreshTokenDeleter);\n}\n\nexport const refreshTokenDeleter = (tokenResponse: {[x: string]: any}) => {\n delete tokenResponse.refreshToken;\n return tokenResponse;\n};\n","import {all, call, fork, put, race, select, take} from 'redux-saga/effects';\nimport {eventChannel} from 'redux-saga';\nimport {\n createFoundInternetEvent,\n createFoundWifiEvent,\n createLostInternetEvent,\n createLostWifiEvent,\n FOUND_WIFI,\n} from '../events/NetworkEvents';\nimport {selectNetworkState} from '../reducers';\nimport {\n FAILED_RECEPTION_INITIAL_CONFIGURATION,\n RECEIVED_PARTIAL_INITIAL_CONFIGURATION,\n} from '../events/ConfigurationEvents';\n\nexport const createOnlineChannel = () => createNetworkChannel('online');\nexport const createOfflineChannel = () => createNetworkChannel('offline');\n\nexport const createNetworkChannel = (event: string) => {\n return eventChannel(statusObserver => {\n const statusHandler = (status: any) => statusObserver(status);\n window.addEventListener(event, statusHandler);\n return () => window.removeEventListener(event, statusHandler);\n });\n};\n\nfunction* onlineSaga() {\n const onlineEventChannel = yield call(createOnlineChannel);\n try {\n while (true) {\n yield take(onlineEventChannel);\n yield put(createFoundWifiEvent());\n }\n } catch (e) {\n console.log('shit broke in online saga', e);\n }\n}\n\nfunction* offlineSaga(): any {\n const onlineEventChannel = yield call(createOfflineChannel);\n try {\n while (true) {\n yield take(onlineEventChannel);\n yield put(createLostWifiEvent());\n }\n } catch (e) {\n yield fork(offlineSaga);\n }\n}\n\nexport function* isOnline() {\n const {isOnline: iO} = yield select(selectNetworkState);\n return iO;\n}\n\nexport function* waitForWifi() {\n const {isOnline: iO} = yield select(selectNetworkState);\n if (!iO) {\n yield take(FOUND_WIFI);\n }\n}\n\nfunction* initialNetworkStateSaga() {\n if (navigator.onLine) {\n yield put(createFoundWifiEvent());\n } else {\n yield put(createLostWifiEvent());\n }\n}\n\nfunction* initialInternetStateSaga() {\n const hasInternet = yield checkInternet();\n if (hasInternet) {\n yield put(createFoundInternetEvent());\n } else {\n yield put(createLostInternetEvent());\n }\n}\n\nfunction* checkInternet() {\n const {worked} = yield race({\n worked: take(RECEIVED_PARTIAL_INITIAL_CONFIGURATION),\n didNot: take(FAILED_RECEPTION_INITIAL_CONFIGURATION),\n });\n\n return !!worked;\n}\n\nfunction* listenToNetworkEvents() {\n yield fork(initialNetworkStateSaga);\n yield fork(initialInternetStateSaga);\n yield fork(onlineSaga);\n yield fork(offlineSaga);\n}\n\nexport default function* rootSaga() {\n yield all([listenToNetworkEvents()]);\n}\n","import {SecurityState} from '../../reducers/SecurityReducer';\nimport {GRANT_TYPE_REFRESH_TOKEN, TokenRequest} from '@openid/appauth';\nimport {createExpiredSessionEvent, FAILED_TO_RECEIVE_TOKEN, RECEIVED_TOKENS,} from '../../events/SecurityEvents';\nimport {call, fork, put, race, take} from 'redux-saga/effects';\nimport {createRequestForInitialConfigurations, FOUND_INITIAL_CONFIGURATION,} from '../../events/ConfigurationEvents';\nimport {OAuthConfig} from '../../types/ConfigurationTypes';\nimport {fetchTokenWithoutSessionRefreshSaga, fetchTokenWithRefreshSaga,} from './TokenSagas';\nimport {waitForWifi} from '../NetworkSagas';\n\nexport function* refreshTokenSaga(\n oauthConfig: OAuthConfig,\n securityState: SecurityState,\n fetchTokenSaga: (c: OAuthConfig, t: TokenRequest) => any,\n) {\n yield call(waitForWifi);\n const refreshTokenRequest: TokenRequest = yield call(\n refreshTokenRequestSaga,\n securityState,\n );\n yield fork(fetchTokenSaga, oauthConfig, refreshTokenRequest);\n const {failureResponse} = yield race({\n successResponse: take(RECEIVED_TOKENS),\n failureResponse: take(FAILED_TO_RECEIVE_TOKEN),\n });\n\n if (failureResponse) {\n yield put(createExpiredSessionEvent()); // credentials are not good, just ask logon again please\n }\n}\n\nexport function* refreshTokenWithoutReplacementSaga(\n oauthConfig: OAuthConfig,\n securityState: SecurityState,\n) {\n yield call(\n refreshTokenSaga,\n oauthConfig,\n securityState,\n fetchTokenWithoutSessionRefreshSaga,\n );\n}\n\nexport function* refreshTokenWithReplacementSaga(\n oauthConfig: OAuthConfig,\n securityState: SecurityState,\n) {\n yield call(\n refreshTokenSaga,\n oauthConfig,\n securityState,\n fetchTokenWithRefreshSaga,\n );\n}\n\nexport function* refreshTokenRequestSaga(securityState: SecurityState) {\n yield put(createRequestForInitialConfigurations());\n const {payload: initialConfigurations} = yield take(\n FOUND_INITIAL_CONFIGURATION,\n );\n return new TokenRequest({\n client_id: initialConfigurations.clientID,\n redirect_uri: initialConfigurations.callbackURI,\n grant_type: GRANT_TYPE_REFRESH_TOKEN,\n refresh_token: securityState.refreshToken\n });\n}\n","export type ReceivedReadToken = {\n readToken: string,\n userIdentifier: string\n};\n\nexport interface TokenInformation {\n expiresAt: number; //epoch second\n expiresHuman: string;\n issuedAt: number; //epoch second\n}\n\nexport class SessionExpiredException extends Error {}\n","import {put, take} from 'redux-saga/effects';\nimport {\n createRequestForInitialConfigurations,\n FOUND_INITIAL_CONFIGURATION,\n RECEIVED_OAUTH_CONFIGURATION,\n requestOAuthConfigurations,\n} from '../../events/ConfigurationEvents';\n\nexport function* oauthConfigurationSaga() {\n yield put(requestOAuthConfigurations()); // ask for oauth configurations\n const {payload: oauthConfig} = yield take(RECEIVED_OAUTH_CONFIGURATION); // yay configurations!\n return oauthConfig;\n}\n\nexport function* initialConfigurationSaga() {\n yield put(createRequestForInitialConfigurations());\n const {payload: initialConfigurations} = yield take(\n FOUND_INITIAL_CONFIGURATION,\n );\n return initialConfigurations;\n}\n","import {call, fork, race, select, take} from 'redux-saga/effects';\nimport {\n FAILED_TO_RECEIVE_TOKEN,\n RECEIVED_TOKENS,\n} from '../../events/SecurityEvents';\nimport {canRefreshToken} from '../../security/OAuth';\nimport {\n refreshTokenWithoutReplacementSaga,\n refreshTokenWithReplacementSaga,\n} from './RefreshTokenSagas';\nimport {SessionExpiredException} from '../../types/SecurityTypes';\nimport {SecurityState} from '../../reducers/SecurityReducer';\nimport {selectSecurityState} from '../../reducers';\nimport {oauthConfigurationSaga} from '../configuration/ConfigurationConvienenceSagas';\n\nexport function* accessTokenWithSessionExtensionSaga() {\n return yield call(\n accessTokenSagas,\n getOrRefreshAccessTokenWithSessionExtension,\n );\n}\n\nexport function* accessTokenWithoutSessionExtensionSaga() {\n return yield call(\n accessTokenSagas,\n getOrRefreshAccessTokenWithoutSessionExtension,\n );\n}\n\nexport function* accessTokenSagas(getOrRefreshAccessTokenSaga: () => any) {\n const accessToken = yield call(getOrRefreshAccessTokenSaga);\n if (accessToken) {\n return accessToken;\n } else {\n throw new SessionExpiredException();\n }\n}\n\nexport function* getOrRefreshAccessTokenWithSessionExtension() {\n return yield call(\n getOrRefreshAccessToken,\n refreshTokenWithReplacementSaga,\n canRefreshToken,\n );\n}\n\nexport function* getOrRefreshAccessTokenWithoutSessionExtension() {\n return yield call(\n getOrRefreshAccessToken,\n refreshTokenWithoutReplacementSaga,\n canRefreshToken,\n );\n}\n\nexport function* getOrRefreshAccessToken(\n refreshTokenSaga: (arg0: any, arg2: any) => any,\n shouldTokenRefresh: (arg0: SecurityState) => boolean,\n) {\n const security: SecurityState = yield select(selectSecurityState);\n if (shouldTokenRefresh(security)) {\n const oauthConfiguration = yield call(oauthConfigurationSaga);\n yield fork(refreshTokenSaga, oauthConfiguration, security);\n return yield call(awaitToken);\n } else {\n return security.accessToken;\n }\n}\n\nexport function* awaitToken() {\n const {tokenReception} = yield race({\n tokenReception: take(RECEIVED_TOKENS),\n tokenFailure: take(FAILED_TO_RECEIVE_TOKEN),\n });\n const {payload} = tokenReception || {};\n const {accessToken} = payload || {};\n return accessToken;\n}\n","import {call, delay, fork, put, race, select, take} from 'redux-saga/effects';\nimport {performOpenGet} from \"../APISagas\";\nimport {\n createFailedToReceiveReadToken,\n createReceivedReadToken,\n FAILED_TO_RECEIVE_READ_TOKEN,\n RECEIVED_READ_TOKEN\n} from \"../../events/SecurityEvents\";\nimport {createReceivedPartialUserEvent} from \"../../events/UserEvents\";\nimport {PayloadEvent} from \"../../events/Event\";\nimport {SecurityState} from \"../../reducers/SecurityReducer\";\nimport {selectSecurityState} from \"../../reducers\";\nimport {createHideTimerEvent, createShowTimerEvent} from \"../../events/ActivityEvents\";\n\nexport function* readOnlyLocationSaga({payload: locationStuff}: PayloadEvent) {\n const {readOnly}: SecurityState = yield select(selectSecurityState);\n if(readOnly) {\n if(locationStuff.location.pathname.startsWith('/dashboard')) {\n yield put(createShowTimerEvent());\n } else {\n yield put(createHideTimerEvent());\n }\n }\n}\n\nexport function* readOnlySaga() {\n const pathname = window.location.pathname\n const bridgeCode = pathname.substring('/dashboard/'.length)\n yield fork(attemptToGetReadOnlyToken, bridgeCode);\n\n const {\n hasReadToken,\n } = yield race({\n hasReadToken: take(RECEIVED_READ_TOKEN),\n notHasReadToken: take(FAILED_TO_RECEIVE_READ_TOKEN),\n });\n\n if (hasReadToken) {\n yield put(createReceivedPartialUserEvent(hasReadToken.payload.userIdentifier))\n }\n}\n\nexport function* attemptToGetReadOnlyToken(bridgeCode: string, attempt: number = 1): Generator {\n try {\n const readOnlyTokenPayload: any = yield call(\n performOpenGet,\n `/user/${bridgeCode}/view/token`\n )\n yield put(createReceivedReadToken({\n userIdentifier: readOnlyTokenPayload.data.userIdentifier,\n readToken: readOnlyTokenPayload.data.readToken\n }))\n } catch (e) {\n if ((!e.message || e.message.indexOf('403') < 0) && attempt < 5) {\n yield delay(2000);\n yield call(attemptToGetReadOnlyToken, bridgeCode, attempt + 1)\n } else {\n yield put(createFailedToReceiveReadToken(bridgeCode))\n }\n }\n}\n","import {SecurityState} from \"../../reducers/SecurityReducer\";\nimport {fork, select, take} from 'redux-saga/effects';\nimport {selectSecurityState} from \"../../reducers\";\nimport {nowInSeconds} from \"@openid/appauth\";\nimport {readOnlySaga} from \"./ReadOnlySaga\";\nimport {RECEIVED_READ_TOKEN} from \"../../events/SecurityEvents\";\n\nexport const isReadTokenValid = (securityState: SecurityState) => {\n return (\n securityState &&\n securityState.readTokenInformation &&\n securityState.readTokenInformation.expiresAt - 5 >= nowInSeconds()\n );\n};\n\nconst shouldRefreshReadToken = (securityState: SecurityState) =>\n !isReadTokenValid(securityState);\n\nexport function* readTokenFetchSaga(){\n const securityState: SecurityState = yield select(selectSecurityState);\n if(shouldRefreshReadToken(securityState)) {\n yield fork(readOnlySaga);\n const readTokenPayload: any = take(RECEIVED_READ_TOKEN);\n return readTokenPayload.payload.readToken;\n }\n\n return securityState.readToken;\n}\n\n","import {call, delay, race, select, take} from 'redux-saga/effects';\nimport {buffers, END, eventChannel} from 'redux-saga';\nimport oboe from 'oboe';\nimport axios from 'axios';\nimport {accessTokenWithSessionExtensionSaga} from './security/AccessTokenSagas';\nimport {selectConfigurationState, selectSecurityState} from '../reducers';\nimport {ConfigurationState} from '../reducers/ConfigurationReducer';\nimport {UserResponse} from '../types/UserTypes';\nimport {PayloadEvent} from '../events/Event';\nimport {RECEIVED_PARTIAL_USER, RECEIVED_USER} from '../events/UserEvents';\nimport {RECEIVED_PARTIAL_INITIAL_CONFIGURATION} from '../events/ConfigurationEvents';\nimport {InitialConfig} from '../types/ConfigurationTypes';\nimport {SecurityState, SharedStatus} from \"../reducers/SecurityReducer\";\nimport {readTokenFetchSaga} from \"./security/ReadTokenSagas\";\n\nconst SHITS_BROKE_YO: string = \"SHIT'S BROKE YO\";\n\ntype ChannelParameters = { url: string; method: string; headers: any; body: any };\nexport const createStreamChannel = ({\n url,\n method,\n headers,\n body,\n }: ChannelParameters) => {\n return eventChannel(statusObserver => {\n const requestStream = oboe({\n url,\n method,\n headers,\n body,\n cached: false,\n withCredentials: true,\n })\n .done((jsonThingo: any) => {\n statusObserver(jsonThingo);\n })\n .fail((error: any) => {\n console.log('Error streaming', error);\n statusObserver(SHITS_BROKE_YO);\n statusObserver(END);\n })\n .on('end', () => {\n statusObserver(END);\n });\n return () => requestStream.abort();\n }, buffers.expanding(100));\n};\n\nexport function* performStreamedGet(url: String, options = {headers: {}}) {\n const headers = yield call(\n createHeaders,\n accessTokenWithSessionExtensionSaga,\n options,\n );\n const fullURL = yield call(constructURL, url);\n const streamChannel = yield call(createStreamChannel, {\n url: fullURL,\n method: 'GET',\n headers,\n body: '',\n });\n const aggregate = [];\n let error;\n try {\n while (true) {\n const itemChunk = yield take(streamChannel);\n if (itemChunk !== SHITS_BROKE_YO) {\n aggregate.unshift(itemChunk);\n } else {\n error = itemChunk;\n }\n }\n } finally {\n if (!error) {\n return aggregate; //dis dumb\n } else {\n throw new Error('yeet');\n }\n }\n}\n\nfunction* getAuthorizationStuff() {\n const {\n user: {\n information: {guid},\n },\n security: {verificationKey, readOnly},\n } = yield select();\n if (guid && verificationKey) {\n return {guid, verificationKey};\n } else if (guid && readOnly) {\n return {guid}\n }\n\n const {userEvent, timeout} = yield race({\n userEvent: race({\n fullUser: take(RECEIVED_USER),\n partialUser: take(RECEIVED_PARTIAL_USER),\n }),\n timeout: delay(5000),\n });\n\n if (timeout) {\n return {\n guid: '',\n verificationKey: '',\n };\n }\n\n if(userEvent.partialUser) {\n return {\n guid: userEvent.partialUser.payload\n }\n } else {\n const {\n payload: {\n information: {guid: userGuid},\n security: {verificationKey: vK},\n },\n }: PayloadEvent = userEvent.fullUser;\n return {guid: userGuid, verificationKey: vK};\n }\n}\n\nexport function* getVerificationStuff(include: boolean = true) {\n if (include) {\n const {guid, verificationKey} = yield call(getAuthorizationStuff);\n return {\n ...(guid ? {'User-Identifier': guid} : {}),\n ...(verificationKey ? {Verification: verificationKey} : {}),\n };\n }\n\n return {};\n}\n\nexport function* createHeaders(\n accessTokenSaga: () => any,\n options = {headers: {}},\n includeVerification = true,\n) {\n const verificationStuff = yield call(\n getVerificationStuff,\n includeVerification,\n );\n const baseHeaders = {\n ...options.headers,\n ...verificationStuff,\n }\n\n const {readOnly, hasShared, isLoggedIn}: SecurityState = yield select(selectSecurityState);\n if (readOnly) {\n const readToken = yield call(readTokenFetchSaga);\n return {\n ...baseHeaders,\n 'Read-Token': readToken\n }\n } else if(hasShared !== SharedStatus.NOT_SHARED || isLoggedIn) {\n const accessToken = yield call(accessTokenSaga);\n return {\n ...baseHeaders,\n Authorization: `Bearer ${accessToken}`,\n };\n }\n}\n\nexport function* getConfig() {\n const {\n initial: {apiURL},\n }: ConfigurationState = yield select(selectConfigurationState);\n if (!apiURL) {\n const {\n payload: {apiURL: apiUrl},\n }: PayloadEvent = yield take(\n RECEIVED_PARTIAL_INITIAL_CONFIGURATION,\n );\n return apiUrl;\n }\n return apiURL;\n}\n\nexport function* constructURL(url: String) {\n const apiURL = yield call(getConfig);\n return `${apiURL}${url}`;\n}\n\nexport function* performGetWithToken(\n url: string,\n options: any,\n accessTokenSaga: () => any,\n includeVerification: boolean = true,\n) {\n const headers = yield call(\n createHeaders,\n accessTokenSaga,\n options,\n includeVerification,\n );\n const fullURL = yield call(constructURL, url);\n return yield call(axios.get, fullURL, {\n ...options,\n headers,\n });\n}\n\nexport function* performGet(url: string, options = {headers: {}}) {\n return yield call(\n performGetWithToken,\n url,\n options,\n accessTokenWithSessionExtensionSaga,\n );\n}\n\nexport function* performGetWithoutVerification(\n url: string,\n options = {headers: {}},\n) {\n return yield call(\n performGetWithToken,\n url,\n options,\n accessTokenWithSessionExtensionSaga,\n false,\n );\n}\n\nexport function* performGetWithoutSessionExtension(\n url: string,\n options = {headers: {}},\n) {\n return yield call(\n performGetWithToken,\n url,\n options,\n accessTokenWithSessionExtensionSaga,\n );\n}\n\nexport function* performOpenGet(url: string, options = {headers: {}}) {\n const fullURL = yield call(constructURL, url);\n return yield call(axios.get, fullURL, options);\n}\n\nexport function* performFullOpenGet(fullURL: string, options: any = {headers: {}}) {\n return yield call(axios.get, fullURL, options);\n}\n\nexport function* performPost(url: string, data: any, options = {headers: {}}) {\n const headers = yield call(\n createHeaders,\n accessTokenWithSessionExtensionSaga,\n options,\n );\n const fullURL = yield call(constructURL, url);\n return yield call(axios.post, fullURL, data, {\n ...options,\n headers,\n });\n}\n\nexport function* performPut(url: string, data: any, options = {headers: {}}) {\n const headers = yield call(\n createHeaders,\n accessTokenWithSessionExtensionSaga,\n options,\n );\n const fullURL = yield call(constructURL, url);\n return yield call(axios.put, fullURL, data, {\n ...options,\n headers,\n });\n}\n\nexport function* performDelete(\n url: string,\n data: any,\n options = {headers: {}},\n) {\n const headers = yield call(\n createHeaders,\n accessTokenWithSessionExtensionSaga,\n options,\n );\n const fullURL = yield call(constructURL, url);\n return yield call(axios.delete, fullURL, {\n ...options,\n headers,\n data,\n });\n}\n","import {call, put} from 'redux-saga/effects';\nimport {createInitializedPomodoroEvent} from '../../events/ActivityEvents';\nimport {performGet} from '../APISagas';\nimport moment from 'moment';\n\nexport const ONE_DAY = 24 * 60 * 60 * 1000;\n\nexport function* pomodoroActivityInitializationSaga() {\n const meow = new Date().valueOf();\n const count = yield call(getCount);\n yield put(\n createInitializedPomodoroEvent({\n count,\n dateCounted: meow,\n }),\n );\n}\n\nexport function* getCount() {\n const meow = moment();\n try {\n const {data} = yield call(performGet, `/activity/pomodoro/current/count?from=${\n meow.startOf('day').unix()\n }000&to=${meow.endOf('day').unix()}000`);\n return data ? data.count : 0;\n } catch (e) {\n return 0\n }\n}\n","import React, {FC, useState} from 'react';\nimport ExpansionPanel from \"@material-ui/core/ExpansionPanel\";\nimport ExpansionPanelSummary from \"@material-ui/core/ExpansionPanelSummary\";\nimport ExpandMoreIcon from \"@material-ui/icons/ExpandMore\";\nimport Typography from \"@material-ui/core/Typography\";\nimport capitalize from \"@material-ui/core/utils/capitalize\";\nimport ExpansionPanelDetails from \"@material-ui/core/ExpansionPanelDetails\";\nimport Container from \"@material-ui/core/Container\";\nimport InputLabel from \"@material-ui/core/InputLabel\";\nimport {DateRangePicker, FocusedInputShape} from \"react-dates\";\nimport moment, {Moment} from \"moment\";\nimport {Activity, getActivityName} from \"../../types/ActivityTypes\";\nimport TimeLine from \"./TimeLine\";\nimport PieFlavored from \"./PieFlavored\";\nimport Loader from \"react-loader-spinner\";\nimport {PRIMARY_THEME_COLOR} from \"../App\";\nimport {connect, DispatchProp, useSelector} from \"react-redux\";\nimport {GlobalState, selectHistoryState, selectUserState} from \"../../reducers\";\nimport {createAdjustedHistoryTimeFrame} from \"../../events/HistoryEvents\";\nimport {ONE_DAY} from \"../../sagas/activity/PomodoroActivitySagas\";\nimport makeStyles from \"@material-ui/core/styles/makeStyles\";\nimport {SOGoS} from \"../icons/SOGoS\";\nimport {Paper} from \"@material-ui/core\";\nimport DailyHeatMap from \"./HeatMap\";\n\ninterface Props {\n selectedTo: number;\n selectedFrom: number;\n bottomActivity?: Activity;\n loading: boolean;\n}\n\nconst drawerWidth = 240;\nconst useStyles = makeStyles(theme => ({\n heading: {\n fontSize: theme.typography.pxToRem(15),\n fontWeight: theme.typography.fontWeightRegular,\n },\n root: {\n display: 'flex',\n },\n toolbar: {\n paddingRight: 24, // keep right padding when drawer closed\n },\n toolbarIcon: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'flex-end',\n padding: '0 8px',\n ...theme.mixins.toolbar,\n },\n appBar: {\n zIndex: theme.zIndex.drawer + 1,\n transition: theme.transitions.create(['width', 'margin'], {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.leavingScreen,\n }),\n },\n appBarShift: {\n marginLeft: drawerWidth,\n width: `calc(100% - ${drawerWidth}px)`,\n transition: theme.transitions.create(['width', 'margin'], {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.enteringScreen,\n }),\n },\n menuButton: {\n marginRight: 36,\n },\n menuButtonHidden: {\n display: 'none',\n },\n title: {\n flexGrow: 1,\n },\n content: {\n flexGrow: 1,\n overflow: 'auto',\n },\n container: {},\n paper: {\n display: 'flex',\n overflow: 'auto',\n flexDirection: 'column',\n color: theme.palette.text.primary,\n backgroundColor: theme.palette.background.paper,\n borderRadius: theme.spacing(0.5),\n },\n fixedHeight: {\n marginTop: theme.spacing(1),\n minHeight: 240,\n maxHeight: 500,\n },\n placeIcon: {\n padding: theme.spacing(2),\n color: theme.palette.common.black,\n },\n form: {\n display: 'flex',\n flexDirection: 'column',\n alignContent: 'center',\n margin: 'auto',\n padding: theme.spacing(3),\n },\n headerContent: {\n borderRadius: theme.spacing(1),\n backgroundColor: theme.palette.background.paper,\n padding: theme.spacing(6, 0, 6),\n marginBottom: theme.spacing(1),\n },\n}));\n\nexport const LoadingIndicator = () => (\n \n \n \n
\n \n
\n
\n)\n\nconst HistoryDashboardComponents: FC = (\n {\n dispatch,\n selectedTo,\n selectedFrom,\n bottomActivity,\n loading,\n children,\n }\n) => {\n const classes = useStyles();\n\n const meow = moment.unix(selectedTo / 1000);\n const meowMinusSeven = moment.unix(selectedFrom / 1000);\n const timeSpan = moment.duration(meow.diff(meowMinusSeven));\n\n const [focusedInput, setFocusedInput] = useState(\n null,\n );\n\n const submitTimeFrame = (from: Moment, to: Moment) => {\n const fromUnix = from.valueOf();\n const toUnix = to.valueOf() + ONE_DAY - 1000;\n dispatch(\n createAdjustedHistoryTimeFrame({\n from: new Date(fromUnix).valueOf(),\n to: new Date(toUnix).valueOf(),\n }),\n );\n };\n\n const {\n information: {firstName},\n } = useSelector(selectUserState);\n\n return (\n
\n {!!bottomActivity && !!getActivityName(bottomActivity) ? (\n \n {children}\n {\n loading && (\n \n )\n }\n \n }\n aria-controls=\"panel1a-content\"\n id=\"panel1a-header\">\n
\n \n {capitalize(timeSpan.humanize())} in {firstName}'s past.\n \n
\n \n \n \n
\n Active Time Range\n moment().isSameOrBefore(date, 'day')}\n endDateId=\"jerry\"\n onDatesChange={({startDate, endDate}) =>\n submitTimeFrame(startDate || moment(), endDate || moment())\n }\n focusedInput={focusedInput}\n onFocusChange={setFocusedInput}\n />\n
\n
\n
\n
\n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n
\n ) : (\n \n )}\n
\n );\n};\n\nconst mapStateToProps = (state: GlobalState): Props => {\n const {\n selectedHistoryRange: {from, to},\n loading,\n } = selectHistoryState(state);\n const {\n capstone: {bottomActivity},\n } = selectHistoryState(state);\n return {\n selectedFrom: from,\n selectedTo: to,\n bottomActivity,\n loading,\n };\n};\n\n\nexport default connect(mapStateToProps)(HistoryDashboardComponents);\n","import * as React from 'react';\nimport {useSelector} from 'react-redux';\nimport makeStyles from '@material-ui/core/styles/makeStyles';\nimport {GlobalState, selectActivityState, selectTacticalActivityState,} from '../../reducers';\nimport Stopwatch from './Stopwatch';\nimport {blue, green} from '@material-ui/core/colors';\nimport {numberObjectToArray} from '../../miscellanous/Tools';\nimport {dictionaryReducer} from '../../reducers/StrategyReducer';\nimport {TacticalActivityIcon} from '../icons/TacticalActivityIcon';\nimport {TacticalActivity} from '../../types/TacticalTypes';\nimport {ActivityTimedType, getActivityID, isActivityRecovery, isPausedActivity,} from '../../types/ActivityTypes';\nimport {StringDictionary} from '../../types/BaseTypes';\nimport Slide from \"@material-ui/core/Slide\";\nimport {Typography} from \"@material-ui/core\";\n\nconst useStyles = makeStyles(theme => ({\n pomoCount: {\n display: 'flex',\n },\n timer: {\n position: 'fixed',\n bottom: 0,\n width: '100%',\n display: 'flex',\n paddingTop: theme.spacing(0.5),\n paddingBottom: theme.spacing(0.5),\n zIndex: 69,\n background: green[500],\n },\n recovery: {\n background: blue[500],\n },\n close: {\n display: 'inline-flex',\n position: 'relative',\n cursor: 'pointer',\n paddingRight: theme.spacing(1),\n },\n activityIcon: {\n lineHeight: 1,\n marginLeft: theme.spacing(1),\n },\n}));\n\nconst mapStateToProps = (state: GlobalState) => {\n const {currentActivity, previousActivity, shouldTime} = selectActivityState(\n state,\n );\n const {activities} = selectTacticalActivityState(state);\n return {\n shouldTime,\n currentActivity,\n previousActivity,\n activities,\n };\n};\n\nconst SharedPausedPomodoro = () => {\n const classes: any = useStyles();\n const {\n shouldTime,\n currentActivity,\n activities,\n } = useSelector(mapStateToProps);\n const {\n content: {timedType},\n } = currentActivity;\n\n const mappedTacticalActivities: StringDictionary = numberObjectToArray(activities).reduce(dictionaryReducer, {});\n const tacticalActivity =\n mappedTacticalActivities[getActivityID(currentActivity)];\n\n const isRecovery = isActivityRecovery(currentActivity);\n const getTimerBarClasses = () => {\n const timerBarClasses = [classes.timer];\n if (isRecovery) {\n timerBarClasses.push(classes.recovery);\n }\n return timerBarClasses.join(' ');\n };\n\n\n const isPausedPomodoro =\n shouldTime &&\n isPausedActivity(currentActivity) &&\n timedType === ActivityTimedType.STOP_WATCH;\n\n return isPausedPomodoro ? (\n \n
\n {tacticalActivity && (<>\n
\n \n
\n \n {tacticalActivity.name}\n \n \n )}\n
\n \n
\n
\n
\n ) : null;\n};\n\nexport default SharedPausedPomodoro;\n","import React, {FC} from 'react';\nimport HistoryDashboardComponents from \"./HistoryDashboardComponents\";\nimport {connect, useDispatch} from \"react-redux\";\nimport {GlobalState, selectActivityState, selectSecurityState, selectUserState} from \"../../reducers\";\nimport SharedPausedPomodoro from \"../time/SharedPausedPomodoro\";\nimport makeStyles from \"@material-ui/core/styles/makeStyles\";\nimport {SOGoS} from \"../icons/SOGoS\";\nimport {Avatar} from \"@material-ui/core\";\nimport Typography from \"@material-ui/core/Typography\";\nimport {grey} from \"@material-ui/core/colors\";\nimport Container from \"@material-ui/core/Container\";\nimport {HistoryIcon} from \"../icons/HistoryIcon\";\nimport PersonIcon from \"@material-ui/icons/Person\";\nimport MailIcon from \"@material-ui/icons/Mail\";\nimport Badge from \"@material-ui/core/Badge\";\nimport withStyles from \"@material-ui/core/styles/withStyles\";\nimport Banner from \"../components/Banner\";\nimport {push} from \"connected-react-router\";\n\ninterface Props {\n hasShared?: boolean;\n fullName?: string;\n firstName?: string;\n lastName?: string;\n localAvatar?: string;\n email?: string;\n shouldTime?: boolean;\n}\n\nconst StyledBadge = withStyles(theme => ({\n badge: {\n backgroundColor: '#44b700',\n color: '#44b700',\n boxShadow: `0 0 0 2px ${theme.palette.background.paper}`,\n '&::after': {\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n borderRadius: '50%',\n animation: '$ripple 1.2s infinite ease-in-out',\n border: '1px solid currentColor',\n content: '\"\"',\n },\n },\n '@keyframes ripple': {\n '0%': {\n transform: 'scale(.8)',\n opacity: 1,\n },\n '100%': {\n transform: 'scale(2.4)',\n opacity: 0,\n },\n },\n}))(Badge);\n\nconst useStyles = makeStyles(theme => ({\n container: {\n margin: '1.5rem',\n marginBottom: '5rem',\n },\n avatar: {\n width: 96,\n height: 96,\n }\n}));\n\nexport const SOGoSSharedLogo = () => {\n const dispatch = useDispatch();\n const goHome = () => {\n dispatch(push('/login'))\n }\n return (
\n \n
\n \n SOGoS\n \n \n Strategic Orchestration and Governance System\n \n
\n
);\n}\n\nconst SharedHistoryDashboardComponents: FC = ({\n hasShared,\n fullName,\n firstName,\n lastName,\n localAvatar,\n email,\n shouldTime,\n }) => {\n const classes = useStyles();\n\n const userName = fullName ||\n `${firstName}${lastName ? ' ' + lastName : ''}`\n\n return hasShared === undefined || hasShared ? (\n
\n
\n \n \n {localAvatar &&\n
\n
\n \n {userName}\n \n \n {email}\n \n
\n \n \n \n
\n }\n
\n \n
\n \n Activity Dashboard\n \n \n \n \n \n \n {userName} wanted to show you what what they care about the most.\n \n \n Below is how they have spent their time towards accomplishing their goals.\n \n \n
\n
\n \n
\n ) : \n \n This user has elected to not share their Activity Dashboard at this time.\n \n ;\n};\n\nconst mapStateToProps = (state: GlobalState): Props => {\n const {\n readToken,\n isLoggedIn\n } = selectSecurityState(state);\n const {\n shouldTime\n } = selectActivityState(state);\n const {\n information: {\n fullName,\n firstName,\n lastName,\n email,\n localAvatar,\n }\n } = selectUserState(state)\n return {\n hasShared: !!readToken || isLoggedIn,\n fullName,\n firstName,\n lastName,\n email,\n localAvatar,\n shouldTime,\n }\n}\n\nexport default connect(mapStateToProps)(SharedHistoryDashboardComponents);\n","import React, {FC} from 'react';\nimport {connect} from \"react-redux\";\nimport {Link, Typography} from \"@material-ui/core\";\nimport Container from \"@material-ui/core/Container\";\nimport makeStyles from \"@material-ui/core/styles/makeStyles\";\nimport {SOGoSSharedLogo} from \"./history/SharedHistoryDashboardComponents\";\nimport QuestionIcon from \"@material-ui/icons/ContactSupport\";\nimport {GoalIcon} from \"./icons/GoalIcon\";\nimport {ActivityIcon} from \"./icons/ActivityIcon\";\nimport HistoryIcon from \"@material-ui/icons/History\";\nimport Card from \"@material-ui/core/Card\";\nimport CardContent from \"@material-ui/core/CardContent\";\nimport CardMedia from \"@material-ui/core/CardMedia\";\nimport {green, orange, purple} from \"@material-ui/core/colors\";\nimport {SOGoS} from \"./icons/SOGoS\";\nimport {themeStyles} from \"./auth/LoggedOut\";\n\ninterface Props {\n\n}\n\n// @ts-ignore real\nconst useStyles = makeStyles(theme => ({\n headerContent: {\n borderRadius: theme.spacing(1),\n backgroundColor: theme.palette.background.paper,\n padding: theme.spacing(6, 0, 6),\n marginBottom: theme.spacing(1),\n },\n ...themeStyles,\n}));\n\nconst About: FC = () => {\n const {headerContent} = useStyles();\n\n return (\n
\n \n \n \n \n
\n \n \n \n
\n \n
\n
\n \n \n What's in it for you?\n \n \n Let us answer that question by asking more\n questions!         \n \n \n
\n \n \n
\n \n
\n
\n \n \n What are you doing with your time?\n \n \n
    \n
  • Are you spending it on things that bring you the most value?
  • \n
  • Are you unsure what to do?
  • \n
  • Do you want to do too many things?
  • \n
\n \n
\n
\n \n \n
\n \n
\n
\n \n \n Figure out what is important!\n \n \n Find goals that are difficult to accomplish.\n Dig deep and shoot for the moon. Don't sandbag yourself, strive for\n greatness!\n \n \n
\n \n \n
\n \n
\n
\n \n \n Take Action!\n \n \n Goals are just wishful thoughts and happy daydreams without execution.\n Define the activities that will get you to the top of your mountains.\n \n \n
\n \n \n
\n \n
\n
\n \n \n Retrospect on activities of the past.\n \n \n Use the data of your past to drive what you do today.\n Figure out where you can optimize your efforts.\n Most importantly, learn when you should be taking it easy.\n \n \n
\n
\n \n SOGos has fulfilled its purpose and has been sunset.\n \n \n For more information follow this link.\n \n
\n \n
\n
\n
\n \n \n );\n};\n\nexport default connect()(About);\n","import React from 'react';\nimport 'react-loader-spinner/dist/loader/css/react-spinner-loader.css';\nimport './App.css';\nimport {useSelector} from 'react-redux';\nimport LoggedOut from './auth/LoggedOut';\nimport {ThemeProvider} from '@material-ui/styles';\nimport {createMuiTheme, responsiveFontSizes} from '@material-ui/core/styles';\nimport {blue} from '@material-ui/core/colors';\nimport {Route, Switch} from 'react-router-dom';\nimport PrivateRoute from './auth/PrivateRoute';\nimport makeStyles from '@material-ui/core/styles/makeStyles';\nimport ActivityTimer from './time/ActivityTimeBar';\nimport Dashboard from './Dashboard';\nimport 'react-dates/initialize';\nimport 'react-dates/lib/css/_datepicker.css';\nimport {GlobalState, selectSecurityState} from '../reducers';\nimport {SecurityState} from '../reducers/SecurityReducer';\nimport OutOfSync from './components/OutOfSync';\nimport Banner from './components/Banner';\nimport About from \"./About\";\nimport Typography from \"@material-ui/core/Typography\";\n\nexport const PRIMARY_THEME_COLOR = '#f9c048';\nconst theme = responsiveFontSizes(\n createMuiTheme({\n palette: {\n primary: {\n main: PRIMARY_THEME_COLOR,\n //@ts-ignore real\n alertColor: '#f9ff75',\n },\n secondary: blue,\n },\n }),\n);\n\nconst useStyles = makeStyles(_ => ({\n content: {\n height: '100%',\n },\n '@global': {\n '*::-webkit-scrollbar': {\n width: '0.4em',\n },\n '*::-webkit-scrollbar-track': {\n '-webkit-box-shadow': 'inset 0 0 6px rgba(0,0,0,0.00)',\n },\n '*::-webkit-scrollbar-thumb': {\n backgroundColor: PRIMARY_THEME_COLOR,\n outline: '1px solid slategrey',\n },\n },\n}));\n\nconst mapStateToProps = (globalState: GlobalState) => {\n const {isInitialized, isOutOfSync}: SecurityState = selectSecurityState(\n globalState,\n );\n return {\n isInitialized,\n isOutOfSync,\n };\n};\n\nconst App = () => {\n const classes = useStyles();\n const {isOutOfSync} = useSelector(mapStateToProps);\n\n const getComponent = () => {\n if (isOutOfSync) {\n return ;\n } else {\n return (\n
\n
\n \n \n \n \n (\n \n \n The page you are looking for does not exist, sorry!\n \n \n )}/>\n \n \n
\n
\n );\n }\n };\n\n return {getComponent()};\n};\n\nexport default App;\n","// This optional code is used to register a service worker.\n// register() is not called by default.\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 subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\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\ntype Config = {\n onSuccess?: (registration: ServiceWorkerRegistration) => void;\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\n};\n\nexport function register(config?: Config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n // eslint-disable-next-line no-undef\n const publicUrl = new URL(\n (process as {env: {[key: string]: string}}).env.PUBLIC_URL,\n window.location.href,\n );\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/facebook/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. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\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://bit.ly/CRA-PWA',\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl: string, config?: Config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.',\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\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 // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl: string, config?: Config) {\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 const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.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, config);\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 {put, select, take} from 'redux-saga/effects';\nimport {shouldCheckForAuthorizationGrant} from '../../security/OAuth';\nimport {\n CHECKED_AUTH,\n createSecurityInitializedEvent,\n requestAuthorizationGrantCheck,\n} from '../../events/SecurityEvents';\nimport {OAuthConfig} from '../../types/ConfigurationTypes';\n\nfunction* oauthInitializationSaga(oauthConfig: OAuthConfig) {\n const {security} = yield select();\n if (shouldCheckForAuthorizationGrant(security)) {\n yield put(requestAuthorizationGrantCheck(oauthConfig)); // ask to check if there is an authorization grant.\n yield take(CHECKED_AUTH); // wait until checked\n }\n yield put(createSecurityInitializedEvent());\n}\n\nexport default oauthInitializationSaga;\n","import {\n AuthorizationError,\n AuthorizationRequest,\n AuthorizationResponse,\n BasicQueryStringUtils,\n RedirectRequestHandler,\n} from '@openid/appauth';\nimport {OAuthConfig} from '../types/ConfigurationTypes';\n\nconst AUTHORIZATION_REQUEST_HANDLE_KEY =\n 'appauth_current_authorization_request';\n\nconst authorizationServiceConfigurationKey = (handle: string) =>\n `${handle}_appauth_authorization_service_configuration`;\n\nconst authorizationRequestKey = (handle: string) =>\n `${handle}_appauth_authorization_request`;\n\nconst queryStringBitch = new BasicQueryStringUtils();\n\nconst getResponse = (\n error: any,\n queryParams: any,\n): AuthorizationResponse | null => {\n if (error) {\n return null;\n } else {\n return new AuthorizationResponse({\n code: queryParams.code,\n state: queryParams.state,\n });\n }\n};\n\nconst getError = (error: any, queryParams: any): AuthorizationError | null => {\n if (error) {\n return new AuthorizationError({\n error: error,\n error_description: queryParams.error_description,\n error_uri: queryParams.error_uri,\n state: queryParams.state,\n });\n } else {\n return null;\n }\n};\n\nconst cleanUpURI = () => {\n const uri = window.location.toString();\n const queryParamStart = uri.indexOf('?');\n if (queryParamStart) {\n const clean_uri = uri.substring(0, queryParamStart);\n window.history.replaceState({}, document.title, clean_uri);\n }\n};\n\nconst completeRequest = (storageBackend: any, handle: any) =>\n storageBackend\n .getItem(authorizationRequestKey(handle))\n .then((authorizationRequest: any) => JSON.parse(authorizationRequest))\n .then(\n (authorizationRequest: any) =>\n new AuthorizationRequest(authorizationRequest),\n )\n .then((authorizationRequest: any) => {\n const location = window.location;\n const queryParams = queryStringBitch.parse(location, false); //all that work to change this stupid line......Thanks Obama.\n const error: string | undefined = queryParams.error;\n const shouldNotify = queryParams.state === authorizationRequest.state;\n if (shouldNotify) {\n return Promise.all([\n storageBackend.removeItem(AUTHORIZATION_REQUEST_HANDLE_KEY),\n storageBackend.removeItem(authorizationRequestKey(handle)),\n storageBackend.removeItem(\n authorizationServiceConfigurationKey(handle),\n ),\n ]).then(() => ({\n request: authorizationRequest,\n response: getResponse(error, queryParams),\n error: getError(error, queryParams),\n }));\n } else {\n return Promise.resolve(null);\n }\n });\n\nexport const completeAuthorizationRequest = (\n authorizationHandler: RedirectRequestHandler,\n) =>\n authorizationHandler.storageBackend\n .getItem(AUTHORIZATION_REQUEST_HANDLE_KEY)\n .then(handle =>\n handle\n ? completeRequest(authorizationHandler.storageBackend, handle)\n : null,\n )\n .then(result => {\n cleanUpURI();\n return result;\n });\n\nexport const createOauthConfigurationObject = (oauthConfig: OAuthConfig) => ({\n ...oauthConfig,\n toJson: () => JSON.stringify(oauthConfig),\n});\n","import {\n AuthorizationNotifier,\n AuthorizationRequest,\n AuthorizationRequestHandler,\n AuthorizationRequestResponse,\n GRANT_TYPE_AUTHORIZATION_CODE,\n RedirectRequestHandler,\n TokenRequest,\n} from '@openid/appauth';\nimport {push} from 'connected-react-router';\nimport {NodeCrypto} from '@openid/appauth/built/node_support/';\nimport {\n createCheckedAuthorizationEvent, createLoggedOffEvent,\n createLoggedOnAction,\n FAILED_TO_RECEIVE_TOKEN,\n RECEIVED_TOKENS,\n} from '../../events/SecurityEvents';\nimport {call, fork, put, race, select, take} from 'redux-saga/effects';\nimport {completeAuthorizationRequest} from '../../security/StupidShit';\nimport {\n createRequestForInitialConfigurations,\n FOUND_INITIAL_CONFIGURATION,\n} from '../../events/ConfigurationEvents';\nimport {fetchTokenWithRefreshSaga} from './TokenSagas';\nimport {oauthConfigurationSaga} from '../configuration/ConfigurationConvienenceSagas';\nimport {OAuthConfig} from '../../types/ConfigurationTypes';\nimport {createSaveRedirect} from '../../events/MiscEvents';\nimport {MiscellaneousState} from '../../reducers/MiscellaneousReducer';\nimport {selectMiscState, selectSecurityState} from '../../reducers';\nimport {SecurityState} from \"../../reducers/SecurityReducer\";\n\nexport function* authorizationGrantSaga() {\n yield call(performAuthorizationGrantFlowSaga, false);\n yield put(createCheckedAuthorizationEvent());\n}\n\nexport function* requestedLoginSaga() {\n yield put(createLoggedOffEvent()); // wipe state\n yield call(loginSaga)\n}\n\nexport function* loginSaga() {\n yield call(performAuthorizationGrantFlowSaga, true);\n}\n\nexport function constructAuthorizationRequestHandler(): Promise<\n AuthorizationRequestHandler\n> {\n const notifier = new AuthorizationNotifier();\n const authorizationHandler = new RedirectRequestHandler();\n return Promise.resolve(\n authorizationHandler.setAuthorizationNotifier(notifier),\n );\n}\n\nexport function performAuthorizationRequest(\n authorizationHandler: AuthorizationRequestHandler,\n oauthConfig: OAuthConfig,\n authorizationRequest: AuthorizationRequest,\n): Promise {\n return Promise.resolve(\n authorizationHandler.performAuthorizationRequest(\n // @ts-ignore real\n oauthConfig,\n authorizationRequest,\n ),\n );\n}\n\n// Thanks shitty library API design\nexport function* performAuthorizationGrantFlowSaga(\n shouldRequestLogon: boolean,\n) {\n const oauthConfig = yield call(oauthConfigurationSaga);\n const authorizationHandler: AuthorizationRequestHandler = yield call(\n constructAuthorizationRequestHandler,\n );\n const authorizationResult: AuthorizationRequestResponse =\n // @ts-ignore real\n yield call(completeAuthorizationRequest, authorizationHandler);\n if (authorizationResult) {\n const {request, response} = authorizationResult;\n const tokenRequest = yield call(\n // @ts-ignore real\n constructAuthorizationCodeGrantRequest,\n request,\n response,\n );\n yield call(\n exchangeAuthorizationGrantForAccessToken,\n tokenRequest,\n oauthConfig,\n );\n } else if (shouldRequestLogon) {\n const scope = 'openid profile email';\n yield put(createRequestForInitialConfigurations());\n const {payload: initialConfigurations} = yield take(\n FOUND_INITIAL_CONFIGURATION,\n );\n const { identityProvider}: SecurityState = yield select(selectSecurityState);\n const resolvedIdp = identityProvider || ''\n yield put(createSaveRedirect(window.location.pathname));\n const authorizationRequest = new AuthorizationRequest(\n {\n client_id: initialConfigurations.clientID,\n redirect_uri: initialConfigurations.callbackURI,\n scope,\n response_type: AuthorizationRequest.RESPONSE_TYPE_CODE,\n extras: {\n identity_provider: resolvedIdp,\n }\n },\n new NodeCrypto(),\n );\n yield call(\n performAuthorizationRequest,\n authorizationHandler,\n oauthConfig,\n authorizationRequest,\n );\n }\n}\n\nexport function* constructAuthorizationCodeGrantRequest(\n request: {internal: {code_verifier: any}},\n response: {code: any},\n) {\n const code = response.code;\n const codeVerifier = request.internal && request.internal.code_verifier;\n yield put(createRequestForInitialConfigurations());\n const {payload: initialConfigurations} = yield take(\n FOUND_INITIAL_CONFIGURATION,\n );\n return new TokenRequest({\n client_id: initialConfigurations.clientID,\n redirect_uri: initialConfigurations.callbackURI,\n grant_type: GRANT_TYPE_AUTHORIZATION_CODE,\n code,\n extras: {\n code_verifier: codeVerifier,\n },\n });\n}\n\nexport function* exchangeAuthorizationGrantForAccessToken(\n tokenRequest: TokenRequest,\n oauthConfig: any,\n) {\n yield fork(fetchTokenWithRefreshSaga, oauthConfig, tokenRequest);\n const {tokenReception} = yield race({\n tokenReception: take(RECEIVED_TOKENS),\n tokenFailure: take(FAILED_TO_RECEIVE_TOKEN),\n });\n\n if (tokenReception) {\n const {redirectPath}: MiscellaneousState = yield select(selectMiscState);\n yield put(push(redirectPath));\n yield put(createLoggedOnAction());\n }\n}\n","export function* activityLogoutSaga() {\n}\n","import {call, put, select, delay, fork} from 'redux-saga/effects';\nimport {InitialConfig, OAuthConfig} from '../../types/ConfigurationTypes';\nimport {\n initialConfigurationSaga,\n oauthConfigurationSaga,\n} from '../configuration/ConfigurationConvienenceSagas';\nimport {createLoggedOffEvent} from '../../events/SecurityEvents';\nimport {activityLogoutSaga} from '../activity/LogoutActivitySaga';\nimport {SecurityState} from \"../../reducers/SecurityReducer\";\nimport {selectSecurityState} from \"../../reducers\";\n\nexport function* constructRedirectURI() {\n const {endSessionEndpoint}: OAuthConfig = yield call(oauthConfigurationSaga);\n const initialConfig = yield call(initialConfigurationSaga);\n const {idToken}: SecurityState = yield select(selectSecurityState)\n return `${endSessionEndpoint}?${getRedirectParameter(initialConfig, idToken || '')}`;\n}\n\nconst getIdTokenIfNecessary = (initialConfig: InitialConfig, idToken: string): string => {\n if (isOkta(initialConfig)) {\n return `id_token_hint=${idToken}&`;\n } else {\n return '';\n }\n};\n\nconst getClientIfNecessary = (initialConfig: InitialConfig): string => {\n if (isCognito(initialConfig)) {\n return `client_id=${initialConfig.clientID}&`;\n } else {\n return '';\n }\n};\n\nconst getRedirectParameter = (initialConfig: InitialConfig, idToken: string): string => {\n const queryParameter = getQueryParameter(initialConfig);\n return `${getClientIfNecessary(initialConfig)}${getIdTokenIfNecessary(initialConfig, idToken)}${queryParameter}=${\n encodeURI(initialConfig.callbackURI||'')\n }`;\n};\n\nconst getQueryParameter = (initialConfig: InitialConfig): string => {\n if (isKeycloak(initialConfig)) {\n return 'redirect_uri';\n } else if(isOkta(initialConfig)){\n return 'post_logout_redirect_uri';\n } else{\n return 'logout_uri';\n }\n};\n\nconst isKeycloak = (initialConfiguration: InitialConfig): boolean => {\n return initialConfiguration && initialConfiguration.provider === 'KEYCLOAK';\n};\n\nconst isOkta = (initialConfiguration: InitialConfig): boolean => {\n return initialConfiguration && initialConfiguration.provider === 'OKTA';\n};\n\nconst isCognito = (initialConfiguration: InitialConfig): boolean => {\n return initialConfiguration && initialConfiguration.provider === 'COGNITO';\n};\n\nexport function* logoffPreFlightSaga() {\n // do stuff\n yield call(activityLogoutSaga);\n yield put(createLoggedOffEvent()); // wipe state\n}\n\nexport function pushRedirect(href: string) {\n document.location.href = href;\n return Promise.resolve();\n}\n\n/**\n * How do I wait for redux persist?\n * Don't want it storing state.\n * So i just wait....\n */\nexport function* redirecto(){\n yield delay(100);\n const href = yield call(constructRedirectURI);\n yield call(pushRedirect, href);\n}\nexport default function* logoutSaga() {\n yield call(logoffPreFlightSaga);\n yield fork(redirecto);\n}\n","import {all, call, delay, fork, takeEvery} from 'redux-saga/effects';\nimport {INITIALIZED_APPLICATION} from '../events/ApplicationLifecycleEvents';\nimport oauthInitializationSaga from './security/SecurityInitializationSaga';\nimport {\n FORCED_LOGIN,\n REQUESTED_AUTH_CHECK,\n REQUESTED_LOGOFF,\n REQUESTED_LOGON,\n REQUESTED_READ_ONLY_MODE,\n} from '../events/SecurityEvents';\nimport {authorizationGrantSaga, loginSaga, requestedLoginSaga,} from './security/AuthorizationFlowSagas';\nimport logoutSaga from './security/LogoutSaga';\nimport {oauthConfigurationSaga} from './configuration/ConfigurationConvienenceSagas';\nimport {readOnlyLocationSaga, readOnlySaga} from \"./security/ReadOnlySaga\";\n\nfunction* securityRequestSaga() {\n const oauthConfig = yield oauthConfigurationSaga();\n yield oauthInitializationSaga(oauthConfig); // Log user in or refresh tokens\n}\n\nfunction* listenToStartupEvent() {\n yield takeEvery(INITIALIZED_APPLICATION, securityRequestSaga);\n}\n\nfunction* listenToAppLifecycleEvents() {\n yield fork(listenToStartupEvent);\n}\n\nfunction* listenToLoginEvents() {\n yield takeEvery(REQUESTED_LOGON, requestedLoginSaga);\n yield takeEvery(REQUESTED_LOGOFF, logoutSaga);\n}\n\n// Wait for all other decoupled events\n// to complete before sending user off\n// to the authorization server.\nfunction* waitBeforeLoggingIn() {\n yield delay(2000);\n yield call(loginSaga);\n}\n\nfunction* listenToSecurityEvents() {\n yield takeEvery(REQUESTED_AUTH_CHECK, authorizationGrantSaga);\n yield takeEvery(FORCED_LOGIN, waitBeforeLoggingIn);\n yield takeEvery(REQUESTED_READ_ONLY_MODE, readOnlySaga);\n yield takeEvery('@@router/LOCATION_CHANGE', readOnlyLocationSaga);\n}\n\nexport default function* rootSaga() {\n yield all([\n listenToAppLifecycleEvents(),\n listenToLoginEvents(),\n listenToSecurityEvents(),\n ]);\n}\n","import {call, put, select, take} from 'redux-saga/effects';\nimport {\n createReceivedOAuthConfigurations,\n RECEIVED_REMOTE_OAUTH_CONFIGURATION,\n} from '../../events/ConfigurationEvents';\nimport {createOauthConfigurationObject} from '../../security/StupidShit';\nimport {selectConfigurationState} from '../../reducers';\n\nexport function* securityRequestSaga() {\n const oauthConfig = yield call(fetchOAuthConfiguration);\n yield put(createReceivedOAuthConfigurations(oauthConfig));\n}\n\nexport function* fetchOAuthConfiguration() {\n const {oauth} = yield select(selectConfigurationState);\n if (!oauth.authorizationEndpoint) {\n const {payload} = yield take(RECEIVED_REMOTE_OAUTH_CONFIGURATION);\n return payload;\n } else {\n return createOauthConfigurationObject(oauth);\n }\n}\n","import {performFullOpenGet, performOpenGet} from '../APISagas';\nimport {\n createFailedToGetInitialConfigurationsEvent,\n createFoundInitialConfigurationsEvent,\n createReceivedInitialConfigurationsEvent,\n createReceivedPartialInitialConfigurationsEvent,\n RECEIVED_INITIAL_CONFIGURATION,\n} from '../../events/ConfigurationEvents';\nimport {call, put, select, take} from 'redux-saga/effects';\nimport {selectConfigurationState} from '../../reducers';\nimport {waitForWifi} from '../NetworkSagas';\nimport {createOutOfSyncEvent} from '../../events/ApplicationLifecycleEvents';\n\n/**\n * Gets the configurations from the backend to know what authorization server to talk to.\n */\nexport function* initialConfigurationSaga() {\n try {\n yield call(waitForWifi);\n const {data: configData} = yield call(\n performFullOpenGet,\n '/config/initial.json',\n );\n const {\n data: {currentTime},\n } = yield call(performFullOpenGet, `${configData.apiURL}/time?_=${new Date().valueOf().toString(32)}`);\n const meow = new Date().valueOf();\n if (meow - currentTime > 10000) {\n yield put(createOutOfSyncEvent());\n } else {\n yield put(createReceivedPartialInitialConfigurationsEvent(configData));\n const {data} = yield call(performOpenGet, '/configurations');\n yield put(\n createReceivedInitialConfigurationsEvent({\n ...data,\n callbackURI: `${window.location.protocol}//${\n window.location.hostname\n }${window.location.port ? ':' + window.location.port : ''}`,\n }),\n );\n }\n } catch (e) {\n yield put(createFailedToGetInitialConfigurationsEvent(e));\n }\n}\n\nexport function* initialConfigurationFetchSaga() {\n const {initial} = yield select(selectConfigurationState);\n if (!initial.callbackURI) {\n const {payload: backendConfigurations} = yield take(\n RECEIVED_INITIAL_CONFIGURATION,\n );\n return backendConfigurations;\n }\n return initial;\n}\n\nexport function* initialConfigurationResponseSaga() {\n const initialConfigurations = yield call(initialConfigurationFetchSaga);\n yield put(createFoundInitialConfigurationsEvent(initialConfigurations));\n}\n","import {call, put} from 'redux-saga/effects';\nimport {createReceivedRemoteOAuthConfigurations} from '../../events/ConfigurationEvents';\nimport {initialConfigurationFetchSaga} from './InitialConfigurationSagas';\nimport {InitialConfig, OAuthConfig} from '../../types/ConfigurationTypes';\n\nexport function* authorizationServiceConfigurationSaga() {\n const initialConfigurations: InitialConfig = yield call(\n initialConfigurationFetchSaga,\n );\n const oAuthConfigs: OAuthConfig = {\n revocationEndpoint: initialConfigurations.logoutEndpoint,\n authorizationEndpoint: initialConfigurations.authorizationEndpoint,\n endSessionEndpoint: initialConfigurations.logoutEndpoint,\n tokenEndpoint: initialConfigurations.tokenEndpoint,\n userInfoEndpoint: initialConfigurations.userInfoEndpoint,\n };\n yield put(createReceivedRemoteOAuthConfigurations(oAuthConfigs));\n}\n","import {all, fork, takeEvery} from 'redux-saga/effects';\nimport {\n REQUESTED_INITIAL_CONFIGURATION,\n REQUESTED_OAUTH_CONFIGURATION,\n} from '../events/ConfigurationEvents';\nimport {INITIALIZED_APPLICATION} from '../events/ApplicationLifecycleEvents';\nimport {securityRequestSaga} from './configuration/OAuthConfigurationSagas';\nimport {authorizationServiceConfigurationSaga} from './configuration/ConfigurationSetupSagas';\nimport {\n initialConfigurationResponseSaga,\n initialConfigurationSaga,\n} from './configuration/InitialConfigurationSagas';\n\nfunction* listenToApplicationEvents() {\n yield takeEvery(INITIALIZED_APPLICATION, initialConfigurationSaga);\n}\n\nfunction* listenToConfigurationRequestEvents() {\n yield takeEvery(REQUESTED_OAUTH_CONFIGURATION, securityRequestSaga);\n yield takeEvery(\n REQUESTED_INITIAL_CONFIGURATION,\n initialConfigurationResponseSaga,\n );\n}\n\nexport default function* rootSaga() {\n yield all([\n listenToApplicationEvents(),\n fork(authorizationServiceConfigurationSaga),\n listenToConfigurationRequestEvents(),\n ]);\n}\n","export enum EventTypes {\n CREATED = 'CREATED',\n COMPLETED = 'COMPLETED',\n UPDATED = 'UPDATED',\n DELETED = 'DELETED',\n}\n","import {performPost} from '../APISagas';\nimport {\n createCachedActivityEvent,\n createFailureToRegisterStartEvent,\n createRegisteredStartEvent,\n} from '../../events/ActivityEvents';\nimport {call, put, select} from 'redux-saga/effects';\nimport {isOnline} from '../NetworkSagas';\nimport {selectSecurityState, selectUserState} from '../../reducers';\nimport {Activity} from '../../types/ActivityTypes';\nimport {createCachedDataEvent} from '../../events/UserEvents';\nimport {PayloadEvent} from '../../events/Event';\nimport {EventTypes} from '../../types/EventTypes';\nimport {SecurityState} from \"../../reducers/SecurityReducer\";\n\nexport function* registerActivitySaga(action: PayloadEvent) {\n const {readOnly}: SecurityState = yield select(selectSecurityState);\n if (!readOnly) {\n const {payload: activity} = action;\n const onlineStatus = yield call(isOnline);\n if (onlineStatus) {\n yield call(activityUploadSaga, activity);\n } else {\n yield call(activityCacheSaga, activity);\n }\n }\n}\n\nexport const ACTIVITY_URL = '/activity';\n\nexport function isNotUnAuthorized(error: any) {\n return !error.message || error.message.indexOf('403') < 0;\n}\n\nexport function* activityUploadSaga(activity: Activity) {\n try {\n yield call(performPost, ACTIVITY_URL, activity);\n yield put(createRegisteredStartEvent(activity));\n } catch (error) {\n yield put(\n createFailureToRegisterStartEvent({\n error,\n activity,\n }),\n );\n if (isNotUnAuthorized(error)) {\n yield call(activityCacheSaga, activity);\n }\n }\n}\n\nexport function* activityCacheSaga(activity: Activity) {\n const {\n information: {guid},\n } = yield select(selectUserState);\n yield put(\n createCachedActivityEvent({\n cachedActivity: {\n activity,\n uploadType: EventTypes.CREATED,\n },\n userGUID: guid,\n }),\n );\n yield put(createCachedDataEvent());\n}\n","import {all, call, delay, put, select, takeEvery} from 'redux-saga/effects';\nimport md5 from 'md5';\nimport axios from 'axios';\nimport {INITIALIZED_SECURITY} from '../events/SecurityEvents';\nimport {performDelete, performGet, performGetWithoutVerification, performPost} from './APISagas';\nimport {\n createDownloadedAvatarEvent,\n createFailedToGetUserEvent,\n createFailedToUploadAvatarEvent,\n createReceivedUserEvent,\n createReceivedUserProfileEvent,\n createSyncedSharedDashboardUpdateEvent,\n createUploadedAvatarEvent,\n RECEIVED_PARTIAL_USER,\n RECEIVED_USER,\n RECEIVED_USER_PROFILE,\n SELECTED_AVATAR,\n UPDATED_SHARED_DASHBOARD,\n} from '../events/UserEvents';\nimport {selectSecurityState, selectUserState} from '../reducers';\nimport {PayloadEvent} from \"../events/Event\";\nimport {createShowWarningNotificationEvent} from \"../events/MiscEvents\";\nimport {UserState} from \"../reducers/UserReducer\";\nimport omit from 'lodash/omit';\nimport {isNotUnAuthorized} from \"./activity/RegisterActivitySaga\";\nimport {User, UserResponse} from \"../types/UserTypes\";\n\nexport function* findUserSaga() {\n const {isLoggedIn} = yield select(selectSecurityState);\n if (isLoggedIn) {\n yield call(requestUserSaga);\n }\n}\n\nexport function* requestUserSaga() {\n try {\n const {data: user} = yield call(performGetWithoutVerification, '/user');\n yield put(createReceivedUserEvent(user)); // found waldo.\n } catch (e) {\n yield put(createFailedToGetUserEvent(e));\n }\n}\n\nexport function* userProfileSaga(_: any, attempts: number = 0): Generator {\n try {\n const {\n information: {\n guid\n }\n }: any = yield select(selectUserState);\n const {data: profileInformation}: any = yield call(\n performGet, `/user/${guid}/profile`\n )\n yield put(createReceivedUserProfileEvent(profileInformation));\n } catch (e) {\n if (attempts < 10) {\n yield delay(2000);\n yield call(userProfileSaga, {}, attempts + 1)\n } else {\n // error!\n }\n }\n}\n\nexport function* sharedDashboardSaga({\n payload: hasShared\n }: PayloadEvent) {\n try {\n const method = hasShared ? performPost : performDelete;\n const {information}: UserState = yield select(selectUserState);\n yield call(method, '/user/share/dashboard/read', omit(information, ['guid', 'localAvatar']))\n yield put(createSyncedSharedDashboardUpdateEvent(hasShared))\n yield call(requestUserSaga);\n } catch (e) {\n yield put(\n createShowWarningNotificationEvent(\n `Unable to ${hasShared ? '' : 'un'}share your dashboard! Try again later, please.`,\n ),\n )\n }\n}\n\nexport function* presignedAvatarUrlSaga(contentLength: number) {\n const {data} = yield call(performPost, '/user/profile/avatar/create', {contentLength})\n return data;\n}\n\n\nexport function* uploadAvatarSaga(\n avatarBlobUrl: string,\n) {\n const thing = yield call(axios.get, avatarBlobUrl, {\n responseType: 'blob',\n })\n const presignedUrl = yield call(presignedAvatarUrlSaga, parseInt(thing.headers['content-length']));\n yield call(axios.put, presignedUrl, thing.data, {\n headers: omit(thing.headers, ['content-length']),\n })\n yield call(performPost, '/user/profile/avatar/uploaded', {})\n}\n\nexport function* userAvatarUploadSaga({\n payload\n }: PayloadEvent) {\n try {\n yield call(uploadAvatarSaga, payload);\n yield put(createUploadedAvatarEvent(payload));\n yield put(createDownloadedAvatarEvent(payload));\n } catch (e) {\n if (isNotUnAuthorized(e)) {\n yield put(createShowWarningNotificationEvent(\"Unable to upload your avatar! Try again later please!\"));\n yield put(createFailedToUploadAvatarEvent(payload))\n }\n }\n}\n\nfunction buildGravatarURL(payload: UserResponse & User) {\n const resolvedEmail = (payload.information && payload.information.email) || payload.email;\n const hashedEmail = md5(resolvedEmail.trim().toLowerCase());\n return `https://www.gravatar.com/avatar/${hashedEmail}.jpg?s=256`;\n}\n\nfunction* userAvatarDownloadSaga({\n payload\n }: PayloadEvent) {\n const gravatar = buildGravatarURL(payload);\n const avatar = (payload.information &&\n payload.information.avatar) || payload.avatar || gravatar;\n if (avatar) {\n try {\n yield call(attemptToDownloadAvatar, avatar)\n return\n } catch (e) {}\n try{\n yield call(attemptToDownloadAvatar, gravatar)\n } catch (e) {\n\n }\n }\n}\n\nfunction * attemptToDownloadAvatar(avatarUrl: string) {\n const thing = yield call(axios.get, avatarUrl, {\n responseType: 'blob',\n })\n const blobbo: Blob = thing.data;\n if (blobbo.size > 0) {\n const localAvatar = URL.createObjectURL(blobbo);\n yield put(createDownloadedAvatarEvent(localAvatar))\n }\n}\n\nfunction* listenToSecurityEvents() {\n yield takeEvery(INITIALIZED_SECURITY, findUserSaga);\n yield takeEvery(UPDATED_SHARED_DASHBOARD, sharedDashboardSaga);\n yield takeEvery(RECEIVED_PARTIAL_USER, userProfileSaga);\n yield takeEvery(SELECTED_AVATAR, userAvatarUploadSaga);\n yield takeEvery(RECEIVED_USER, userAvatarDownloadSaga);\n yield takeEvery(RECEIVED_USER_PROFILE, userAvatarDownloadSaga);\n}\n\nexport default function* rootSaga() {\n yield all([listenToSecurityEvents()]);\n}\n","import {LOGGED_ON} from '../../events/SecurityEvents';\nimport {RECEIVED_USER} from '../../events/UserEvents';\nimport {createStartedActivityEvent} from '../../events/ActivityEvents';\nimport uuid from 'uuid/v4';\nimport {all, call, take} from 'redux-saga/effects';\nimport {registerActivitySaga} from './RegisterActivitySaga';\nimport {ActivityTimedType, ActivityType} from '../../types/ActivityTypes';\n\nexport const LOGGED_ON_ACTIVITY_NAME = 'LOGGED_ON';\n\nexport function* activityLogonSaga() {\n yield all([take(LOGGED_ON), take(RECEIVED_USER)]);\n yield call(\n registerActivitySaga,\n createStartedActivityEvent({\n name: LOGGED_ON_ACTIVITY_NAME,\n uuid: uuid(),\n timedType: ActivityTimedType.NONE,\n type: ActivityType.PASSIVE,\n }),\n );\n}\n","import {performGetWithoutSessionExtension} from '../APISagas';\nimport {\n createFoundPreviousActivityActivityEvent,\n createInitializedCurrentActivityEvent,\n createResumedStartedNonTimedActivityEvent,\n createResumedStartedTimedActivityEvent,\n} from '../../events/ActivityEvents';\nimport {call, delay, put, race, select, take} from 'redux-saga/effects';\nimport {RECEIVED_PARTIAL_USER, RECEIVED_USER} from '../../events/UserEvents';\nimport {selectActivityState, selectNetworkState, selectSecurityState,} from '../../reducers';\nimport {FOUND_WIFI} from '../../events/NetworkEvents';\nimport {isOnline} from '../NetworkSagas';\nimport {\n activitiesEqual,\n Activity,\n ActivityTimedType,\n ActivityType,\n getActivityType,\n getTimedType,\n} from '../../types/ActivityTypes';\nimport {INITIALIZED_SECURITY} from '../../events/SecurityEvents';\n\nexport const isTimedActivity = (activity: Activity) =>\n getActivityType(activity) === ActivityType.ACTIVE &&\n getTimedType(activity) !== ActivityTimedType.NONE;\n\nexport function* handleNewActivity(activity: Activity) {\n const isTimed = isTimedActivity(activity);\n if (isTimed) {\n yield put(createResumedStartedTimedActivityEvent(activity));\n } else if (activity) {\n yield put(createResumedStartedNonTimedActivityEvent(activity));\n }\n}\n\nexport const CURRENT_ACTIVITY_URL = '/activity/current';\nexport const PREVIOUS_ACTIVITY_URL = '/activity/previous';\n\nexport function* updateCurrentActivity(attempt: number = 10): any {\n try {\n const {data: activity} = yield call(\n performGetWithoutSessionExtension,\n CURRENT_ACTIVITY_URL,\n );\n const {currentActivity} = yield select(selectActivityState);\n if (!activitiesEqual(currentActivity, activity)) {\n yield call(handleNewActivity, activity);\n return {currentActivity, wasNew: true};\n }\n return {currentActivity, wasNew: false};\n } catch (error) {\n yield call(handleError, attempt);\n }\n}\n\nexport function* updatePreviousActivity(attempt: number = 10) {\n try {\n const {data: activity} = yield call(\n performGetWithoutSessionExtension,\n PREVIOUS_ACTIVITY_URL,\n );\n yield put(createFoundPreviousActivityActivityEvent(activity));\n } catch (error) {\n if (error.response.status !== 404) {\n yield call(handleError, attempt, updatePreviousActivity);\n }\n }\n}\n\nexport function* handleError(\n attempt: number,\n functionToRetry = updateCurrentActivity,\n) {\n const hasNetwork = yield call(isOnline);\n if (hasNetwork) {\n yield delay(Math.pow(2, attempt) + Math.floor(Math.random() * 1000));\n yield call(functionToRetry, attempt < 13 ? attempt + 1 : 10);\n }\n}\n\nexport const CURRENT_ACTIVITY_POLL_RATE = 5000;\n\nexport function* delayWork() {\n const globalState = yield select();\n const {isOnline: onlineStatus} = selectNetworkState(globalState);\n const {isExpired} = selectSecurityState(globalState);\n if (isExpired) {\n yield take(INITIALIZED_SECURITY); // only going to happen after login, effective permablock\n } else if (onlineStatus) {\n yield delay(CURRENT_ACTIVITY_POLL_RATE);\n } else {\n yield take(FOUND_WIFI);\n }\n}\n\nexport function* currentActivitySaga() {\n const {partialUser} = yield race({\n fullUser: take(RECEIVED_USER),\n partialUser: take(RECEIVED_PARTIAL_USER),\n });\n\n yield call(updatePreviousActivity);\n const {currentActivity, wasNew} = yield call(updateCurrentActivity);\n if (!wasNew) {\n yield put(createInitializedCurrentActivityEvent(currentActivity));\n }\n\n let isReadOnly = !!partialUser;\n if(isReadOnly) {\n do {\n yield call(updateCurrentActivity);\n yield call(delayWork);\n const {readOnly} = yield select(selectSecurityState)\n isReadOnly = readOnly;\n } while (isReadOnly)\n }\n}\n","import {call, put, select} from 'redux-saga/effects';\nimport {performPost} from '../APISagas';\nimport {createSyncedActivitiesEvent} from '../../events/ActivityEvents';\nimport {selectActivityState, selectUserState} from '../../reducers';\nimport {createSyncedDataEvent} from '../../events/UserEvents';\nimport {createShowWarningNotificationEvent} from '../../events/MiscEvents';\n\nexport const BULK_UPLOAD_URL = '/activity/bulk';\nexport function* activitySyncSaga() {\n const globalState = yield select();\n const {\n information: {guid},\n } = selectUserState(globalState);\n const {cache} = selectActivityState(globalState);\n if (guid && cache && cache[guid]) {\n try {\n yield call(performPost, BULK_UPLOAD_URL, cache[guid]);\n yield put(createSyncedActivitiesEvent(guid));\n yield put(createSyncedDataEvent());\n } catch (e) {\n yield put(\n createShowWarningNotificationEvent(\n 'Unable to sync activity data! Try again later, please.',\n ),\n );\n }\n }\n}\n","import {\n Activity,\n getActivityContent,\n getActivityName,\n isActivityRecovery,\n} from '../../types/ActivityTypes';\nimport {PayloadEvent} from '../../events/Event';\n\n// eslint-disable-next-line no-undef\nconst audio = new Audio('/notification.mp3');\n\nexport function activityNotificationSaga({payload}: PayloadEvent) {\n // eslint-disable-next-line no-undef\n Notification.requestPermission().then(_ => {\n if ('Notification' in window && getActivityContent(payload).autoStart) {\n if (isActivityRecovery(payload)) {\n // eslint-disable-next-line no-undef,no-new\n new Notification('Take a Break!', {\n icon: '/images/sogos_512.png',\n });\n } else {\n // eslint-disable-next-line no-undef,no-new\n new Notification(`Get Back to ${getActivityName(payload)}!`, {\n icon: '/images/sogos_512.png',\n });\n }\n audio.play().then(__ => {});\n try {\n window.navigator.vibrate([200, 100, 200]);\n } catch (__) {}\n }\n });\n}\n","import {all, fork, takeEvery} from 'redux-saga/effects';\nimport {STARTED_ACTIVITY, STARTED_TIMED_ACTIVITY,} from '../events/ActivityEvents';\nimport {activityLogonSaga} from './activity/LogonActivitySaga';\nimport {currentActivitySaga} from './activity/CurrentActivitySaga';\nimport {registerActivitySaga} from './activity/RegisterActivitySaga';\nimport {FOUND_WIFI} from '../events/NetworkEvents';\nimport {activitySyncSaga} from './activity/ActivitySyncSaga';\nimport {activityNotificationSaga} from './activity/ActivityNotificationSaga';\nimport {REQUESTED_SYNC} from '../events/UserEvents';\nimport {pomodoroActivityInitializationSaga} from './activity/PomodoroActivitySagas';\nimport {VIEWED_ACTIVITY_SELECTION} from \"../events/TacticalEvents\";\n\nfunction* listenToActivityEvents() {\n yield takeEvery(STARTED_ACTIVITY, registerActivitySaga);\n yield takeEvery(FOUND_WIFI, activitySyncSaga);\n yield takeEvery(REQUESTED_SYNC, activitySyncSaga);\n yield takeEvery(STARTED_TIMED_ACTIVITY, activityNotificationSaga);\n yield fork(activityLogonSaga);\n yield fork(currentActivitySaga);\n yield fork(pomodoroActivityInitializationSaga);\n yield takeEvery(VIEWED_ACTIVITY_SELECTION, pomodoroActivityInitializationSaga);\n}\n\nexport default function* rootSaga() {\n yield all([listenToActivityEvents()]);\n}\n","import {call, put, select} from 'redux-saga/effects';\nimport {performStreamedGet} from '../APISagas';\nimport {\n createAdjustedHistoryTimeFrame,\n createInitializedHistoryEvent,\n createUpdatedFullFeedEvent,\n createUpdatedHistorySelectionEvent,\n} from '../../events/HistoryEvents';\nimport {createShowWarningNotificationEvent} from '../../events/MiscEvents';\nimport {selectHistoryState, selectUserState} from '../../reducers';\nimport {HistoryState} from '../../reducers/HistoryReducer';\nimport {reverseBinarySearch} from '../../miscellanous/Tools';\nimport {UserState} from '../../reducers/UserReducer';\nimport {Activity, getActivityContent} from '../../types/ActivityTypes';\nimport {PayloadEvent} from '../../events/Event';\nimport {DateRange} from '../../types/HistoryTypes';\nimport {shouldTime} from \"../../miscellanous/Projection\";\nimport {createRequestedReadOnlyMode} from \"../../events/SecurityEvents\";\n\nexport const createHistoryAPIURL = (guid: string, from: number, to: number) =>\n `/history/${guid}/feed?from=${from}&to=${to}`;\n\nconst ONE_MINUTE = 60000;\nconst meow = new Date(new Date().valueOf() + 2 * ONE_MINUTE);\nconst SEVEN_DAYS = 604800000;\nconst meowMinusSeven = new Date(meow.getTime() - SEVEN_DAYS);\n\nexport function* archiveFetchSaga(\n guid: string,\n fromDate: number,\n toDate: number,\n) {\n try {\n const data: Activity[] = yield call(\n performStreamedGet,\n createHistoryAPIURL(guid, fromDate, toDate),\n );\n return data.sort((a, b) => b.antecedenceTime - a.antecedenceTime);\n } catch (e) {\n yield put(\n createShowWarningNotificationEvent(\n 'Unable to get activity history! Try again later, please.',\n ),\n );\n return [];\n }\n}\n\nexport function* historyInitializationSaga(guid: string) {\n const fromDate = meowMinusSeven.valueOf() - 1;\n const toDate = meow.valueOf() + 1;\n const initialHistoryFeed = yield call(\n archiveFetchSaga,\n guid,\n fromDate,\n toDate,\n );\n yield put(\n createInitializedHistoryEvent({\n selection: {\n activities: initialHistoryFeed,\n between: {\n from: meowMinusSeven.valueOf(),\n to: meow.valueOf(),\n },\n },\n full: {\n activities: initialHistoryFeed,\n between: {\n from: fromDate,\n to: toDate,\n },\n },\n }),\n );\n}\n\nexport function* historyObservationSaga() {\n //todo: update history when viewed again?\n}\n\nexport function* sharedHistoryObservationSaga() {\n yield put(createRequestedReadOnlyMode());\n // todo: wait for \"user\" to be dispetched\n}\n\nexport function* historyAdjustmentSaga({\n payload: {from, to},\n}: PayloadEvent) {\n const fullHistoryFeed = yield call(getOrUpdateFullFeed, to, from);\n yield call(updateSelection, fullHistoryFeed, to, from);\n}\n\nexport function* getOrUpdateFullFeed(to: number, from: number) {\n const historyState: HistoryState = yield select(selectHistoryState);\n const fullHistoryRange = historyState.fullHistoryRange;\n if (from > fullHistoryRange.from && to < fullHistoryRange.to) {\n return historyState.fullFeed;\n } else {\n return yield call(updateFullFeed, to, from);\n }\n}\n\nexport function* updateFullFeed(to: number, from: number) {\n const historyState: HistoryState = yield select(selectHistoryState);\n const userState: UserState = yield select(selectUserState);\n const fullHistoryRange = historyState.fullHistoryRange;\n if (from < fullHistoryRange.from && to <= fullHistoryRange.to) {\n const olderHistory = yield call(\n archiveFetchSaga,\n userState.information.guid,\n from,\n fullHistoryRange.from,\n );\n const updatedHistory = historyState.fullFeed.concat(olderHistory);\n yield put(\n createUpdatedFullFeedEvent({\n activities: updatedHistory,\n between: {\n from,\n to: fullHistoryRange.to,\n },\n }),\n );\n return updatedHistory;\n } else if (from >= fullHistoryRange.from && to > fullHistoryRange.to) {\n const newerHistory = yield call(\n archiveFetchSaga,\n userState.information.guid,\n fullHistoryRange.to,\n to,\n );\n const updatedHistory = newerHistory.concat(historyState.fullFeed);\n yield put(\n createUpdatedFullFeedEvent({\n activities: updatedHistory,\n between: {\n from: fullHistoryRange.from,\n to,\n },\n }),\n );\n return updatedHistory;\n } else {\n const olderHistory = yield call(\n archiveFetchSaga,\n userState.information.guid,\n from,\n fullHistoryRange.from,\n );\n const newerHistory = yield call(\n archiveFetchSaga,\n userState.information.guid,\n fullHistoryRange.to,\n to,\n );\n const updatedHistory = newerHistory\n .concat(historyState.fullFeed)\n .concat(olderHistory);\n yield put(\n createUpdatedFullFeedEvent({\n activities: updatedHistory,\n between: {\n from,\n to,\n },\n }),\n );\n return updatedHistory;\n }\n}\n\nexport function* updateSelection(\n fullFeed: Activity[],\n to: number,\n from: number,\n) {\n const fromRaw = reverseBinarySearch(\n fullFeed,\n (activity: Activity) => activity.antecedenceTime - from,\n );\n const newFrom = fromRaw < 0 ? Math.abs(fromRaw + 1) : fromRaw;\n const safeFrom = newFrom >= fullFeed.length ? fullFeed.length : newFrom;\n const toRaw = reverseBinarySearch(\n fullFeed,\n (activity: Activity) => activity.antecedenceTime - to,\n );\n const newTo = toRaw < 0 ? Math.abs(toRaw + 1) : toRaw;\n yield put(\n createUpdatedHistorySelectionEvent({\n between: {\n from,\n to,\n },\n activities: fullFeed.slice(newTo, safeFrom)\n .filter(shouldTime),\n }),\n );\n}\n\nexport function* firstActivityAdjustmentSaga() {\n const {\n capstone: {bottomActivity},\n }: HistoryState = yield select(selectHistoryState);\n if (getActivityContent(bottomActivity).veryFirstActivity) {\n const rightMeow = new Date().valueOf();\n const timeToMoveBack = rightMeow - bottomActivity.antecedenceTime;\n yield put(\n createAdjustedHistoryTimeFrame({\n from: bottomActivity.antecedenceTime - timeToMoveBack,\n to: rightMeow,\n }),\n );\n }\n}\n","import {call, put, select, take} from 'redux-saga/effects';\nimport {DateRange, HistoryState} from '../../reducers/HistoryReducer';\nimport {selectHistoryState, selectUserState} from '../../reducers';\nimport {\n createFoundAfterCapstoneEvent,\n createFoundBeforeCapstoneEvent,\n createUpdatedCapstonesEvent,\n UPDATED_FULL_FEED,\n} from '../../events/HistoryEvents';\nimport {Activity} from '../../types/ActivityTypes';\nimport {reverseBinarySearch} from '../../miscellanous/Tools';\nimport {UserState} from '../../reducers/UserReducer';\nimport {performGet} from '../APISagas';\nimport {isTimedActivity} from '../activity/CurrentActivitySaga';\nimport {shouldTime} from '../../miscellanous/Projection';\n\nexport type FullRangeAndFeed = {\n activities: Activity[];\n timeRange: DateRange;\n};\n\nexport function* capstoneHistorySaga(\n selectedDateRange: DateRange,\n fullRangeAndFeed: FullRangeAndFeed,\n) {\n const firstBefore: Activity = yield call(\n getFirstBefore,\n selectedDateRange.from,\n fullRangeAndFeed,\n );\n const historyState: HistoryState = yield select(selectHistoryState);\n const maybeAfter: Activity = yield call(getFirstAfter, selectedDateRange.to, {\n activities: historyState.fullFeed,\n timeRange: historyState.fullHistoryRange,\n });\n const firstAfter: Activity = maybeAfter || firstBefore;\n yield put(\n createUpdatedCapstonesEvent({\n beforeCapstone: firstBefore,\n afterCapstone: firstAfter,\n }),\n );\n}\n\nconst getBeforeIndex = (index: number) => {\n if (index > -1) {\n return index + 1;\n } else {\n return Math.abs(index + 1);\n }\n};\n\nconst getAfterIndex = (index: number) => {\n if (index > -1) {\n return index - 1;\n } else {\n return Math.abs(index) - 2;\n }\n};\n\nexport function* getFirstBefore(\n selectedFromDate: number,\n {activities, timeRange: {from}}: FullRangeAndFeed,\n) {\n const activityIndex = reverseBinarySearch(\n activities,\n (activity: Activity) => activity.antecedenceTime - selectedFromDate,\n );\n const updatedActivityIndex = getBeforeIndex(activityIndex);\n\n if (updatedActivityIndex < activities.length - 1) {\n // We might have the oldest timed event in cache.\n const oldestActivity = findOldestTimedActivityInCache(\n updatedActivityIndex,\n activities,\n );\n if (oldestActivity) {\n return oldestActivity;\n }\n }\n\n // check the API see if it remembers anything\n const {data} = yield call(findFirstActivityBeforeTime, from);\n if (data) {\n yield put(createFoundBeforeCapstoneEvent(data));\n return yield findOldestTimedActivity(data);\n }\n\n // we have the oldest item in cache\n return activities[activities.length - 1];\n}\n\nexport const findOldestTimedActivityInCache = (\n activityIndex: number,\n activities: Activity[],\n): Activity | undefined => {\n if (activityIndex >= activities.length) {\n return undefined;\n } else {\n const oldActivity = activities[activityIndex];\n if (shouldTime(oldActivity)) {\n return oldActivity;\n } else {\n return findOldestTimedActivityInCache(activityIndex + 1, activities);\n }\n }\n};\n\nexport function* findOldestTimedActivity(activity: Activity) {\n if (shouldTime(activity)) {\n return activity;\n } else {\n let currentOldie = activity;\n while (!shouldTime(currentOldie)) {\n const {data} = yield call(\n findFirstActivityBeforeTime,\n currentOldie.antecedenceTime,\n );\n if (data) {\n yield put(createFoundBeforeCapstoneEvent(data));\n currentOldie = data;\n if (isTimedActivity(data)) {\n break;\n }\n } else {\n break;\n }\n }\n return currentOldie;\n }\n}\n\nexport function* getFirstAfter(\n selectedToRange: number,\n {activities, timeRange: {to}}: FullRangeAndFeed,\n) {\n const activityIndex = reverseBinarySearch(\n activities,\n (activity: Activity) => activity.antecedenceTime - selectedToRange,\n );\n const updatedActivityIndex = getAfterIndex(activityIndex);\n if (updatedActivityIndex < 0) {\n const {data} = yield call(findFirstActivityAfterTime, to);\n if (data) {\n yield put(createFoundAfterCapstoneEvent(data));\n return data;\n }\n }\n const safeAfter = updatedActivityIndex < 0 ? 0 : updatedActivityIndex;\n return activities[safeAfter];\n}\n\nexport const constructActivityBeforeURL = (guid: string) =>\n `/history/${guid}/first/before`;\n\nexport const constructActivityAfterURL = (guid: string) =>\n `/history/${guid}/first/after`;\n\nexport function* findFirstActivityBeforeTime(relativeTime: number) {\n return yield call(\n findCapstoneActivity,\n relativeTime,\n constructActivityBeforeURL,\n );\n}\n\nexport function* findFirstActivityAfterTime(relativeTime: number) {\n return yield call(\n findCapstoneActivity,\n relativeTime,\n constructActivityAfterURL,\n );\n}\n\nexport function* findCapstoneActivity(\n relativeTime: number,\n urlBuilder: (arg0: string) => string,\n) {\n const {\n information: {guid},\n }: UserState = yield select(selectUserState);\n const beforeURL = urlBuilder(guid);\n try {\n return yield call(performGet, `${beforeURL}?relativeTime=${relativeTime}`);\n } catch (e) {\n return {};\n }\n}\n\nexport function* getFullHistory(timeRange: DateRange) {\n const historyState: HistoryState = yield select(selectHistoryState);\n const {fullHistoryRange} = historyState;\n if (\n fullHistoryRange.to < timeRange.to ||\n fullHistoryRange.from > timeRange.from\n ) {\n const {payload} = yield take(UPDATED_FULL_FEED);\n return {\n timeRange: payload.between,\n activities: payload.activities,\n };\n } else {\n return {\n activities: historyState.fullFeed,\n timeRange: historyState.fullHistoryRange,\n };\n }\n}\n","import {call, put, select} from '@redux-saga/core/effects';\nimport {Activity} from '../../types/ActivityTypes';\nimport {selectHistoryState} from '../../reducers';\nimport {HistoryState} from '../../reducers/HistoryReducer';\nimport {createUpdatedFullFeedEvent} from '../../events/HistoryEvents';\nimport {PayloadEvent} from '../../events/Event';\n\nexport function* apiBeforeCapstoneSaga({\n payload: activity,\n}: PayloadEvent) {\n const historyState: HistoryState = yield select(selectHistoryState);\n yield put(\n createUpdatedFullFeedEvent({\n activities: [...historyState.fullFeed, activity],\n between: {\n to: historyState.fullHistoryRange.to,\n from: activity.antecedenceTime,\n },\n }),\n );\n}\n\nexport function* addActivityAfter(activity: Activity) {\n const historyState: HistoryState = yield select(selectHistoryState);\n yield put(\n createUpdatedFullFeedEvent({\n activities: [activity, ...historyState.fullFeed],\n between: {\n from: historyState.fullHistoryRange.from,\n to: activity.antecedenceTime,\n },\n }),\n );\n}\n\nexport function* apiAfterCapstoneSaga({\n payload: activity,\n}: PayloadEvent) {\n yield call(addActivityAfter, activity);\n}\n\nexport function* currentActivityHistorySaga({payload}: PayloadEvent) {\n yield call(addActivityAfter, payload);\n}\n","import {race, all, call, fork, take, takeEvery} from 'redux-saga/effects';\nimport {\n ActivityUpdatePayload,\n ADJUSTED_HISTORY,\n FOUND_AFTER_CAPSTONE,\n FOUND_BEFORE_CAPSTONE,\n INITIALIZED_HISTORY,\n UPDATED_CAPSTONES,\n VIEWED_HISTORY, VIEWED_SHARED_HISTORY,\n} from '../events/HistoryEvents';\nimport {RECEIVED_PARTIAL_USER, RECEIVED_USER} from '../events/UserEvents';\nimport {\n firstActivityAdjustmentSaga,\n historyAdjustmentSaga,\n historyInitializationSaga,\n historyObservationSaga, sharedHistoryObservationSaga,\n} from './history/ActivityHistorySagas';\nimport {\n capstoneHistorySaga,\n FullRangeAndFeed,\n getFullHistory,\n} from './history/CapstoneHistorySaga';\nimport {DateRange} from '../reducers/HistoryReducer';\nimport {STARTED_ACTIVITY} from '../events/ActivityEvents';\nimport {\n apiAfterCapstoneSaga,\n apiBeforeCapstoneSaga,\n currentActivityHistorySaga,\n} from './history/SingularActivityHistorySagas';\nimport {PayloadEvent} from '../events/Event';\n\nexport function* initializeActivityFeedSaga() {\n const {foundUser} = yield all({\n askedForHistory: race({\n privateHistory: take(VIEWED_HISTORY),\n publicHistory: take(VIEWED_SHARED_HISTORY),\n }),\n foundUser: race({\n fullUser: take(RECEIVED_USER),\n partialUser: take(RECEIVED_PARTIAL_USER),\n }),\n });\n\n const userIdentifier = foundUser.fullUser ?\n foundUser.fullUser.payload.information.guid :\n foundUser.partialUser.payload;\n\n yield fork(historyInitializationSaga, userIdentifier);\n yield takeEvery(VIEWED_HISTORY, historyObservationSaga);\n yield takeEvery(ADJUSTED_HISTORY, historyAdjustmentSaga);\n}\n\nexport function* historyFeedAdjustmentSaga() {\n yield all({\n askedForHistory: take(UPDATED_CAPSTONES)\n });\n yield call(firstActivityAdjustmentSaga);\n}\n\nfunction* listenToActivityEvents() {\n yield fork(initializeActivityFeedSaga);\n yield fork(historyFeedAdjustmentSaga);\n yield takeEvery(VIEWED_SHARED_HISTORY, sharedHistoryObservationSaga)\n yield takeEvery(ADJUSTED_HISTORY, historyAdjustmentCapstoneSaga);\n yield takeEvery(INITIALIZED_HISTORY, historyInitializationCapstoneSaga);\n}\n\nexport function* historyAdjustmentCapstoneSaga({\n payload: dateRange,\n}: PayloadEvent) {\n const fullRangeAndFeed = yield call(getFullHistory, dateRange);\n yield call(capstoneHistorySaga, dateRange, fullRangeAndFeed);\n}\n\nexport function* historyInitializationCapstoneSaga({\n payload: {full},\n}: PayloadEvent) {\n const fullRangeAndActivities: FullRangeAndFeed = {\n timeRange: full.between,\n activities: full.activities,\n };\n yield call(capstoneHistorySaga, full.between, fullRangeAndActivities);\n}\n\nexport function* listenToCurrentActivityEvents() {\n yield takeEvery(STARTED_ACTIVITY, currentActivityHistorySaga);\n}\n\nexport function* listenToCapstoneEvents() {\n yield takeEvery(FOUND_BEFORE_CAPSTONE, apiBeforeCapstoneSaga);\n yield takeEvery(FOUND_AFTER_CAPSTONE, apiAfterCapstoneSaga);\n}\n\nexport default function* HistorySagas() {\n yield all([\n listenToActivityEvents(),\n listenToCurrentActivityEvents(),\n listenToCapstoneEvents(),\n ]);\n}\n","import {call, put, select} from 'redux-saga/effects';\nimport {isOnline} from '../NetworkSagas';\nimport {CachedObjective, Objective} from '../../types/StrategyTypes';\nimport {performDelete, performPost, performPut} from '../APISagas';\nimport {\n createCachedObjectiveEvent,\n createSyncedObjectiveEvent,\n} from '../../events/StrategyEvents';\nimport {selectUserState} from '../../reducers';\nimport {createCachedDataEvent} from '../../events/UserEvents';\nimport {PayloadEvent} from '../../events/Event';\nimport {EventTypes} from '../../types/EventTypes';\nimport {isNotUnAuthorized} from \"../activity/RegisterActivitySaga\";\n\nexport function* objectiveCreationSaga({payload}: PayloadEvent) {\n yield call(\n objectiveAPIInteractionSaga,\n payload,\n objectiveCreateSaga,\n objectiveUploadToCached,\n );\n}\n\nexport function* objectiveChangesSaga({payload}: PayloadEvent) {\n yield call(\n objectiveAPIInteractionSaga,\n payload,\n objectiveUpdateSaga,\n objectiveUpdateToCached,\n );\n}\n\nexport function* objectiveTerminationSaga({payload}: PayloadEvent) {\n yield call(\n objectiveAPIInteractionSaga,\n payload,\n objectiveDeleteSaga,\n objectiveDeleteToCached,\n );\n}\n\nexport function* objectiveCompletionSaga({payload}: PayloadEvent) {\n yield call(\n objectiveAPIInteractionSaga,\n payload,\n objectiveCompleteSaga,\n objectiveCompleteToCached,\n );\n}\n\nexport function* objectiveCreateSaga(objective: Objective) {\n yield call(\n objectiveUploadSaga,\n objective,\n performPost,\n objectiveUploadToCached,\n );\n}\n\nexport function* objectiveUpdateSaga(objective: Objective) {\n yield call(\n objectiveUploadSaga,\n objective,\n performPut,\n objectiveUpdateToCached,\n );\n}\n\nexport function* objectiveDeleteSaga(objective: Objective) {\n yield call(\n objectiveUploadSaga,\n objective,\n performDelete,\n objectiveDeleteToCached,\n );\n}\n\nexport function* objectiveCompleteSaga(objective: Objective) {\n yield call(\n objectiveUploadSaga,\n objective,\n performPost,\n objectiveCompleteToCached,\n (_objective: Objective) => `${OBJECTIVES_URL}/${_objective.id}/complete`,\n );\n}\n\nexport const objectiveUploadToCached: (\n objective: Objective,\n) => CachedObjective = objective => ({\n objective,\n uploadType: EventTypes.CREATED,\n});\n\nexport const objectiveUpdateToCached: (\n objective: Objective,\n) => CachedObjective = objective => ({\n objective,\n uploadType: EventTypes.UPDATED,\n});\n\nexport const objectiveDeleteToCached: (\n objective: Objective,\n) => CachedObjective = objective => ({\n objective,\n uploadType: EventTypes.DELETED,\n});\n\nexport const objectiveCompleteToCached: (\n objective: Objective,\n) => CachedObjective = objective => ({\n objective,\n uploadType: EventTypes.COMPLETED,\n});\n\nexport function* objectiveAPIInteractionSaga(\n objective: Objective,\n objectiveSaga: (o: Objective) => any,\n cachedObjectiveFunction: (objective: Objective) => CachedObjective,\n) {\n const onlineStatus = yield call(isOnline);\n if (onlineStatus) {\n try {\n yield call(objectiveSaga, objective)\n } catch (e) {\n if(isNotUnAuthorized(e)){\n yield call(cacheObjectiveSaga, cachedObjectiveFunction(objective));\n }\n }\n } else {\n yield call(cacheObjectiveSaga, cachedObjectiveFunction(objective));\n }\n}\n\nexport const OBJECTIVES_URL = '/strategy/objectives';\n\nexport function* objectiveUploadSaga(\n objective: Objective,\n apiAction: (u: string, o: Objective) => any,\n cachingFunction: (objective: Objective) => CachedObjective,\n urlFunction: (objective: Objective) => string = __ => OBJECTIVES_URL,\n) {\n try {\n yield call(apiAction, urlFunction(objective), objective);\n yield put(createSyncedObjectiveEvent(objective));\n } catch (e) {\n if(isNotUnAuthorized(e)){\n yield call(cacheObjectiveSaga, cachingFunction(objective));\n }\n }\n}\n\nexport function* cacheObjectiveSaga(objective: CachedObjective) {\n const {\n information: {guid},\n } = yield select(selectUserState);\n yield put(\n createCachedObjectiveEvent({\n userGUID: guid,\n objective,\n }),\n );\n yield put(createCachedDataEvent());\n}\n","import {call, put} from 'redux-saga/effects';\nimport {performStreamedGet} from '../APISagas';\nimport {createFetchedObjectivesEvent} from '../../events/StrategyEvents';\nimport {createShowWarningNotificationEvent} from '../../events/MiscEvents';\n\nexport const OBJECTIVES_URL = '/strategy/objectives';\n\nexport function* objectiveHistoryFetchSaga() {\n try {\n const data = yield call(performStreamedGet, OBJECTIVES_URL);\n yield put(createFetchedObjectivesEvent(data));\n } catch (e) {\n yield put(\n createShowWarningNotificationEvent(\n 'Unable to get strategic! Try again later, please.',\n ),\n );\n }\n}\n\nexport function* objectiveObservationSaga() {\n yield call(console.log, 'Viewed Objectives Again');\n}\n","import {call, put, select} from 'redux-saga/effects';\nimport {performPost} from '../APISagas';\nimport {selectStrategyState, selectUserState} from '../../reducers';\nimport {createSyncedObjectivesEvent} from '../../events/StrategyEvents';\nimport {createSyncedDataEvent} from '../../events/UserEvents';\nimport {createShowWarningNotificationEvent} from '../../events/MiscEvents';\n\nexport const BULK_OBJECTIVE_UPLOAD_URL = '/strategy/objectives/bulk';\n\nexport function* strategySyncSaga() {\n const globalState = yield select();\n const {\n information: {guid},\n } = selectUserState(globalState);\n const {cache} = selectStrategyState(globalState);\n if (guid && cache && cache[guid]) {\n try {\n yield call(performPost, BULK_OBJECTIVE_UPLOAD_URL, cache[guid]);\n yield put(createSyncedObjectivesEvent(guid));\n yield put(createSyncedDataEvent());\n } catch (e) {\n yield put(\n createShowWarningNotificationEvent(\n 'Unable to sync settings! Try again later, please.',\n ),\n );\n }\n }\n}\n","import {all, fork, race, take, takeEvery} from 'redux-saga/effects';\nimport {\n COMPLETED_OBJECTIVE,\n CREATED_OBJECTIVE,\n DELETED_OBJECTIVE,\n UPDATED_OBJECTIVE,\n VIEWED_OBJECTIVES,\n} from '../events/StrategyEvents';\nimport {RECEIVED_PARTIAL_USER, RECEIVED_USER, REQUESTED_SYNC} from '../events/UserEvents';\nimport {\n objectiveChangesSaga,\n objectiveCompletionSaga,\n objectiveCreationSaga,\n objectiveTerminationSaga,\n} from './strategy/ObjectiveCreationSagas';\nimport {\n objectiveHistoryFetchSaga,\n objectiveObservationSaga,\n} from './strategy/ObjectiveSagas';\nimport {FOUND_WIFI} from '../events/NetworkEvents';\nimport {strategySyncSaga} from './strategy/StrategySyncSaga';\n\nexport function* objectiveObservationInitializationSaga() {\n yield race({\n fullUser: take(RECEIVED_USER),\n partialUser: take(RECEIVED_PARTIAL_USER),\n });\n yield fork(objectiveHistoryFetchSaga);\n yield takeEvery(VIEWED_OBJECTIVES, objectiveObservationSaga);\n}\n\nfunction* listenToActivityEvents() {\n yield takeEvery(CREATED_OBJECTIVE, objectiveCreationSaga);\n yield takeEvery(UPDATED_OBJECTIVE, objectiveChangesSaga);\n yield takeEvery(DELETED_OBJECTIVE, objectiveTerminationSaga);\n yield takeEvery(COMPLETED_OBJECTIVE, objectiveCompletionSaga);\n yield takeEvery(FOUND_WIFI, strategySyncSaga);\n yield takeEvery(RECEIVED_USER, strategySyncSaga);\n yield takeEvery(REQUESTED_SYNC, strategySyncSaga);\n yield fork(objectiveObservationInitializationSaga);\n}\n\nexport default function* StrategySagas() {\n yield all([listenToActivityEvents()]);\n}\n","import {call, put, select} from 'redux-saga/effects';\nimport {performPost} from '../APISagas';\nimport {selectTacticalActivityState, selectUserState} from '../../reducers';\nimport {createSyncedDataEvent} from '../../events/UserEvents';\nimport {createShowWarningNotificationEvent} from '../../events/MiscEvents';\nimport {createSyncedTacticalActivitiesEvent} from '../../events/TacticalEvents';\n\nexport const BULK_ACTIVITY_UPLOAD_URL = '/tactical/activity/bulk';\n\nexport function* tacticalActivitySyncSaga() {\n const globalState = yield select();\n const {\n information: {guid},\n } = selectUserState(globalState);\n const {cache} = selectTacticalActivityState(globalState);\n if (guid && cache && cache[guid]) {\n try {\n yield call(performPost, BULK_ACTIVITY_UPLOAD_URL, cache[guid]);\n yield put(createSyncedTacticalActivitiesEvent(guid));\n yield put(createSyncedDataEvent());\n } catch (e) {\n yield put(\n createShowWarningNotificationEvent(\n 'Unable to sync created activities! Try again later, please.',\n ),\n );\n }\n }\n}\n","import {call, put, select} from 'redux-saga/effects';\nimport {TacticalActivity} from '../../types/TacticalTypes';\nimport {\n createArchivedTacticalActivityEvent,\n createReRankedTacticalActivitiesEvent,\n createRestoredTacticalActivityEvent,\n createUpdatedTacticalActivityEvent,\n} from '../../events/TacticalEvents';\nimport {selectTacticalActivityState} from '../../reducers';\nimport {TacticalActivityState} from '../../reducers/TacticalReducer';\nimport {numberObjectToArray} from '../../miscellanous/Tools';\nimport {PayloadEvent} from '../../events/Event';\n\nexport function* removalReRankSaga(tacticalActivity: TacticalActivity) {\n const tacticalActivityState: TacticalActivityState = yield select(\n selectTacticalActivityState,\n );\n const allTacticalActivities = numberObjectToArray(\n tacticalActivityState.activities,\n );\n\n const changedActivities = allTacticalActivities\n .splice(tacticalActivity.rank + 1, allTacticalActivities.length)\n .map(activity => {\n --activity.rank;\n return activity;\n });\n\n yield put(createReRankedTacticalActivitiesEvent(changedActivities));\n}\n\nexport function* tacticalActivityHiddenSaga({\n payload,\n}: PayloadEvent) {\n const tacticalActivity: TacticalActivity = {\n ...payload,\n hidden: true,\n };\n\n yield call(removalReRankSaga, tacticalActivity);\n\n delete tacticalActivity.rank;\n yield put(createUpdatedTacticalActivityEvent(tacticalActivity));\n yield put(createArchivedTacticalActivityEvent(tacticalActivity));\n}\n\nexport function* tacticalActivityShownSaga({\n payload,\n}: PayloadEvent) {\n const tacticalActivity: TacticalActivity = {\n ...payload,\n hidden: false,\n };\n delete tacticalActivity.rank;\n yield put(createUpdatedTacticalActivityEvent(tacticalActivity));\n yield put(createRestoredTacticalActivityEvent(tacticalActivity));\n}\n","import {call, put, select} from 'redux-saga/effects';\nimport {isOnline} from '../NetworkSagas';\nimport {performDelete, performPost, performPut} from '../APISagas';\nimport {selectUserState} from '../../reducers';\nimport {createCachedDataEvent} from '../../events/UserEvents';\nimport {\n CachedTacticalActivity,\n TacticalActivity,\n} from '../../types/TacticalTypes';\nimport {\n createCachedTacticalActivityEvent,\n createDeletedTacticalActivityEvent,\n createSyncedTacticalActivityEvent,\n} from '../../events/TacticalEvents';\nimport {createShowWarningNotificationEvent} from '../../events/MiscEvents';\nimport {BULK_ACTIVITY_UPLOAD_URL} from './TacticalActivitySyncSaga';\nimport {removalReRankSaga} from './TacticalActivityVisibilitySagas';\nimport {PayloadEvent} from '../../events/Event';\nimport {EventTypes} from '../../types/EventTypes';\nimport {isNotUnAuthorized} from \"../activity/RegisterActivitySaga\";\n\nexport function* activityCreationSaga({\n payload,\n}: PayloadEvent) {\n yield call(\n activityAPIInteractionSaga,\n payload,\n activityCreateSaga,\n activityUploadToCached,\n );\n}\n\nexport function* activityChangesSaga({\n payload,\n}: PayloadEvent) {\n yield call(\n activityAPIInteractionSaga,\n payload,\n activityUpdateSaga,\n activityUpdateToCached,\n );\n}\n\nexport function* activityRankSaga({payload}: PayloadEvent) {\n try {\n yield call(performPut, BULK_ACTIVITY_UPLOAD_URL, payload);\n } catch (e) {\n yield put(\n createShowWarningNotificationEvent(\n 'Unable to update activity rank! Try again later, please.',\n ),\n );\n for (const tacticalActivity in payload) {\n if (payload.hasOwnProperty(tacticalActivity)) {\n yield call(\n cacheTacticalActivitySaga,\n activityUpdateToCached(payload[tacticalActivity]),\n );\n }\n }\n }\n}\n\nexport function* activityTerminationSaga({\n payload,\n}: PayloadEvent) {\n yield call(\n activityAPIInteractionSaga,\n payload,\n activityDeleteSaga,\n activityDeleteToCached,\n );\n yield call(removalReRankSaga, payload);\n yield put(createDeletedTacticalActivityEvent(payload));\n}\n\nexport function* activityCreateSaga(activity: TacticalActivity) {\n yield call(activityUploadSaga, activity, performPost, activityUploadToCached);\n}\n\nexport function* activityUpdateSaga(activity: TacticalActivity) {\n yield call(activityUploadSaga, activity, performPut, activityUpdateToCached);\n}\n\nexport function* activityDeleteSaga(activity: TacticalActivity) {\n yield call(\n activityUploadSaga,\n activity,\n performDelete,\n activityDeleteToCached,\n );\n}\n\nexport function* activityCompleteSaga(activity: TacticalActivity) {\n yield call(\n activityUploadSaga,\n activity,\n performPost,\n activityCompleteToCached,\n (_activity: TacticalActivity) =>\n `${TACTICAL_ACTIVITIES_URL}/${_activity.id}/complete`,\n );\n}\n\nexport const activityUploadToCached: (\n tacticalActivity: TacticalActivity,\n) => CachedTacticalActivity = activity => ({\n activity,\n uploadType: EventTypes.CREATED,\n});\n\nexport const activityUpdateToCached: (\n tacticalActivity: TacticalActivity,\n) => CachedTacticalActivity = activity => ({\n activity,\n uploadType: EventTypes.UPDATED,\n});\n\nexport const activityDeleteToCached: (\n tacticalActivity: TacticalActivity,\n) => CachedTacticalActivity = activity => ({\n activity,\n uploadType: EventTypes.DELETED,\n});\n\nexport const activityCompleteToCached: (\n tacticalActivity: TacticalActivity,\n) => CachedTacticalActivity = activity => ({\n activity,\n uploadType: EventTypes.COMPLETED,\n});\n\nexport function* activityAPIInteractionSaga(\n activity: TacticalActivity,\n activitySaga: (a: TacticalActivity) => void,\n cachedTacticalActivityFunction: (\n tacticalActivity: TacticalActivity,\n ) => CachedTacticalActivity,\n) {\n const onlineStatus = yield call(isOnline);\n if (onlineStatus) {\n try{\n yield call(activitySaga, activity);\n } catch (e) {\n yield call(\n cacheTacticalActivitySaga,\n cachedTacticalActivityFunction(activity),\n )\n }\n } else {\n yield call(\n cacheTacticalActivitySaga,\n cachedTacticalActivityFunction(activity),\n );\n }\n}\n\nexport const TACTICAL_ACTIVITIES_URL = '/tactical/activity';\n\nexport function* activityUploadSaga(\n activity: TacticalActivity,\n apiAction: any,\n cachingFunction: (\n tacticalActivity: TacticalActivity,\n ) => CachedTacticalActivity,\n urlFunction: (tacticalActivity: TacticalActivity) => string = __ =>\n TACTICAL_ACTIVITIES_URL,\n) {\n try {\n yield call(apiAction, urlFunction(activity), activity);\n yield put(createSyncedTacticalActivityEvent(activity));\n } catch (e) {\n if(isNotUnAuthorized(e)){\n yield call(cacheTacticalActivitySaga, cachingFunction(activity));\n }\n }\n}\n\nexport function* cacheTacticalActivitySaga(\n cachedActivity: CachedTacticalActivity,\n) {\n const {\n information: {guid},\n } = yield select(selectUserState);\n yield put(\n createCachedTacticalActivityEvent({\n userGUID: guid,\n cachedActivity,\n }),\n );\n yield put(createCachedDataEvent());\n}\n","import {call, put, select} from '@redux-saga/core/effects';\nimport {selectTacticalState, selectUserState} from '../../reducers';\nimport {\n createCachedSettingsEvent,\n createFailureToRegisterPomodoroSettingsEvent,\n createFoundPomodoroSettingsEvent,\n createRegisteredPomodoroSettingsEvent,\n createSyncedSettingsEvent,\n} from '../../events/TacticalEvents';\nimport {\n createCachedDataEvent,\n createSyncedDataEvent,\n} from '../../events/UserEvents';\nimport {isOnline} from '../NetworkSagas';\nimport {performGet, performPost} from '../APISagas';\nimport {delayWork} from '../activity/CurrentActivitySaga';\nimport {createShowWarningNotificationEvent} from '../../events/MiscEvents';\nimport {PomodoroSettings} from '../../types/TacticalTypes';\nimport {PayloadEvent} from '../../events/Event';\nimport {isNotUnAuthorized} from \"../activity/RegisterActivitySaga\";\n\nexport const POMODORO_API = '/tactical/pomodoro/settings';\n\nexport function* fetchSettings(): any {\n try {\n const {data} = yield call(performGet, POMODORO_API);\n yield put(createFoundPomodoroSettingsEvent(data));\n } catch (e) {\n yield call(delayWork);\n yield call(fetchSettings);\n }\n}\n\nexport function* settingsSyncSaga() {\n const globalState = yield select();\n const {\n information: {guid},\n } = selectUserState(globalState);\n const {\n pomodoro: {cache},\n } = selectTacticalState(globalState);\n if (guid && cache && cache[guid]) {\n try {\n yield call(performPost, POMODORO_API, cache[guid]);\n yield put(createSyncedSettingsEvent(guid));\n yield put(createSyncedDataEvent());\n } catch (e) {\n yield put(\n createShowWarningNotificationEvent(\n 'Unable to sync settings! Try again later, please.',\n ),\n );\n }\n }\n}\n\nexport function* settingsCacheSaga(settings: PomodoroSettings) {\n const {\n information: {guid},\n } = yield select(selectUserState);\n yield put(\n createCachedSettingsEvent({\n cachedSettings: {\n ...settings,\n },\n userGUID: guid,\n }),\n );\n yield put(createCachedDataEvent());\n}\n\nexport function* updatePomodoroSaga({payload}: PayloadEvent) {\n const onlineStatus = yield call(isOnline);\n if (onlineStatus) {\n yield call(settingsUploadSaga, payload);\n } else {\n yield call(settingsCacheSaga, payload);\n }\n}\n\nexport function* settingsUploadSaga(settings: PomodoroSettings) {\n try {\n yield call(performPost, POMODORO_API, settings);\n yield put(createRegisteredPomodoroSettingsEvent(settings));\n } catch (error) {\n yield put(\n createFailureToRegisterPomodoroSettingsEvent({\n error,\n settings,\n }),\n );\n if(isNotUnAuthorized(error)){\n yield call(settingsCacheSaga, settings);\n }\n }\n}\n","import {call, put} from 'redux-saga/effects';\nimport {performStreamedGet} from '../APISagas';\nimport {createShowWarningNotificationEvent} from '../../events/MiscEvents';\nimport {createFetchedTacticalActivitesEvent} from '../../events/TacticalEvents';\n\nexport const TACTICAL_ACTIVITIES_URL = '/tactical/activity';\n\nexport function* tacticalActivitiesFetchSaga() {\n try {\n const data = yield call(performStreamedGet, TACTICAL_ACTIVITIES_URL);\n yield put(createFetchedTacticalActivitesEvent(data));\n } catch (e) {\n yield put(\n createShowWarningNotificationEvent(\n 'Unable to get Activities! Try again later, please.',\n ),\n );\n }\n}\n\nexport function* tacticalActivityObservationSaga() {\n yield call(console.log, 'Viewed Tactical Activities Again');\n}\n","import {all, call, fork, take, takeEvery} from '@redux-saga/core/effects';\nimport {RECEIVED_PARTIAL_USER, RECEIVED_USER, REQUESTED_SYNC} from '../events/UserEvents';\nimport {\n CREATED_ACTIVITY,\n HID_ACTIVITY,\n RANKED_ACTIVITIES,\n REQUESTED_ACTIVITY_DELETION,\n UNHID_ACTIVITY,\n UPDATED_ACTIVITY,\n UPDATED_POMODORO_SETTINGS,\n VIEWED_ACTIVITIES,\n VIEWED_SETTINGS,\n} from '../events/TacticalEvents';\nimport {FOUND_WIFI} from '../events/NetworkEvents';\nimport {tacticalActivitySyncSaga} from './tactical/TacticalActivitySyncSaga';\nimport {\n activityChangesSaga,\n activityCreationSaga,\n activityRankSaga,\n activityTerminationSaga,\n} from './tactical/TacticalActivityCreationSagas';\nimport {\n fetchSettings,\n settingsSyncSaga,\n updatePomodoroSaga,\n} from './tactical/PomodoroSettingsSagas';\nimport {\n tacticalActivitiesFetchSaga,\n tacticalActivityObservationSaga,\n} from './tactical/TacticalActivitiesSagas';\nimport {\n tacticalActivityHiddenSaga,\n tacticalActivityShownSaga,\n} from './tactical/TacticalActivityVisibilitySagas';\nimport {race} from \"redux-saga/effects\";\nimport {RECEIVED_READ_TOKEN} from \"../events/SecurityEvents\";\n\nfunction* initializeTacticalSettings() {\n yield take(RECEIVED_USER);\n yield call(fetchSettings);\n yield fork(settingsSyncSaga);\n yield takeEvery(FOUND_WIFI, settingsSyncSaga);\n yield takeEvery(REQUESTED_SYNC, settingsSyncSaga);\n yield takeEvery(VIEWED_SETTINGS, fetchSettings);\n}\n\nfunction* initializeReadTacticalSettings() {\n yield take(RECEIVED_READ_TOKEN);\n yield call(fetchSettings);\n}\n\nfunction* watchForSettingsUpdates() {\n yield takeEvery(UPDATED_POMODORO_SETTINGS, updatePomodoroSaga);\n}\n\nfunction* tacticalActivitiesObservationInitializationSaga() {\n yield takeEvery(VIEWED_ACTIVITIES, tacticalActivityObservationSaga);\n yield race({\n fullUser: take(RECEIVED_USER),\n partialUser: take(RECEIVED_PARTIAL_USER),\n });\n yield fork(tacticalActivitiesFetchSaga);\n}\n\nfunction* listenForTacticalEvents() {\n yield fork(initializeReadTacticalSettings);\n yield fork(tacticalActivitiesObservationInitializationSaga);\n yield takeEvery(FOUND_WIFI, tacticalActivitySyncSaga);\n yield takeEvery(RECEIVED_USER, tacticalActivitySyncSaga);\n yield takeEvery(REQUESTED_SYNC, tacticalActivitySyncSaga);\n yield takeEvery(CREATED_ACTIVITY, activityCreationSaga);\n yield takeEvery(UPDATED_ACTIVITY, activityChangesSaga);\n yield takeEvery(RANKED_ACTIVITIES, activityRankSaga);\n yield takeEvery(REQUESTED_ACTIVITY_DELETION, activityTerminationSaga);\n yield takeEvery(HID_ACTIVITY, tacticalActivityHiddenSaga);\n yield takeEvery(UNHID_ACTIVITY, tacticalActivityShownSaga);\n}\n\nexport default function* rootSaga() {\n yield all([\n initializeTacticalSettings(),\n listenForTacticalEvents(),\n watchForSettingsUpdates(),\n ]);\n}\n","import {\n all,\n call,\n fork,\n put,\n select,\n take,\n takeEvery,\n} from 'redux-saga/effects';\nimport {\n selectActivityState,\n selectPomodoroState,\n selectStrategyState,\n selectTacticalActivityState,\n selectUserState,\n} from '../reducers';\nimport {\n CACHED_DATA,\n createCheckedCachesEvent,\n createRequestedSyncEvent,\n RECEIVED_USER,\n SYNCED_DATA,\n} from '../events/UserEvents';\nimport {INITIALIZED_SECURITY} from '../events/SecurityEvents';\n\nexport function* checkCaches() {\n yield take(INITIALIZED_SECURITY);\n yield call(inspectCaches);\n}\n\nexport function* inspectCaches() {\n const userGUID = yield call(fetchUserGuidSaga);\n const globalState = yield select();\n const hasCachedItems = [\n selectActivityState,\n selectTacticalActivityState,\n selectPomodoroState,\n selectStrategyState,\n ]\n .map(stateSelector => stateSelector(globalState))\n .map(state => state.cache[userGUID])\n .reduce((accum, cache) => accum || !!cache, false);\n yield call(cachedItemsSaga, hasCachedItems);\n if (hasCachedItems) {\n yield put(createRequestedSyncEvent());\n }\n}\n\nexport function* cachedItemsSaga(hasCachedItems: any = true) {\n yield put(createCheckedCachesEvent(!!hasCachedItems));\n}\n\nexport function* listenToCachingEvents() {\n yield takeEvery(CACHED_DATA, cachedItemsSaga);\n yield takeEvery(SYNCED_DATA, inspectCaches);\n}\n\nexport function* fetchUserGuidSaga() {\n const {\n information: {guid},\n } = yield select(selectUserState);\n if (guid) {\n return guid;\n } else {\n const user = yield take(RECEIVED_USER);\n return user.guid;\n }\n}\n\nfunction* listenToEvents() {\n yield fork(checkCaches);\n yield call(listenToCachingEvents);\n}\n\nexport default function* CacheSagas() {\n yield all([listenToEvents()]);\n}\n","import {call, delay, put, race, select} from 'redux-saga/effects';\nimport uuid from 'uuid/v4';\nimport {\n GlobalState,\n selectActivityState,\n selectTacticalState,\n selectTimeState,\n} from '../../reducers';\nimport {\n activitiesEqual,\n Activity,\n ActivityContent,\n ActivityTimedType,\n ActivityType,\n isActivityRecovery,\n RECOVERY,\n} from '../../types/ActivityTypes';\nimport {\n createTimeDecrementEvent,\n createTimeSetEvent,\n} from '../../events/TimeEvents';\nimport {waitForCurrentActivity} from './SandsOfTimeSaga';\nimport {\n createCompletedPomodoroEvent,\n createStartedActivityEvent,\n createStartedTimedActivityEvent,\n} from '../../events/ActivityEvents';\nimport omit from 'lodash/omit';\nimport {\n CURRENT_ACTIVITY_URL,\n handleNewActivity,\n} from '../activity/CurrentActivitySaga';\nimport {performGet} from '../APISagas';\n\nconst getTimerTime = (stopTime: number) =>\n Math.floor((stopTime - new Date().getTime()) / 1000);\n\nfunction* commenceTimedActivity(activityContent: ActivityContent) {\n const action = createStartedActivityEvent(activityContent);\n yield put(action);\n yield call(setTimer, action.payload);\n yield put(createStartedTimedActivityEvent(activityContent));\n}\n\nfunction* setTimer(activityThatStartedThis: Activity, addThis: number = 0) {\n const {\n antecedenceTime,\n content: {duration},\n } = activityThatStartedThis;\n yield put(\n createTimeSetEvent(\n getTimerTime(antecedenceTime + (duration || 0)) + addThis,\n ),\n );\n}\n\nexport function* pomodoroSaga(activityThatStartedThis: Activity) {\n yield call(setTimer, activityThatStartedThis, 1);\n\n let shouldKeepTiming: boolean = false;\n do {\n const before = new Date().valueOf();\n\n const {\n currentActivity,\n previousActivity,\n timeElapsed,\n pomodoroSettings,\n numberOfCompletedPomodoro,\n } = yield select((globalState: GlobalState) => {\n const {\n currentActivity: cA,\n previousActivity: pA,\n completedPomodoro: {count},\n } = selectActivityState(globalState);\n const {\n pomodoro: {settings},\n } = selectTacticalState(globalState);\n return {\n currentActivity: cA,\n previousActivity: pA,\n timeElapsed: selectTimeState(globalState).timeElapsed,\n pomodoroSettings: settings,\n numberOfCompletedPomodoro: count,\n };\n });\n\n // check to see if current activity is same because could have changed while moving to this next iteration\n const areActivitiesSame = activitiesEqual(\n currentActivity,\n activityThatStartedThis,\n );\n if (areActivitiesSame) {\n if (timeElapsed > 0) {\n yield put(createTimeDecrementEvent());\n const after = new Date().valueOf();\n const waitFor = 1000 - (after - before);\n const {currentActivity: newCurrentActivity} = yield race({\n currentActivity: call(waitForCurrentActivity),\n timeElapsed: delay(waitFor < 0 ? 0 : waitFor),\n });\n shouldKeepTiming = !newCurrentActivity;\n } else {\n const currentActivitySame = yield call(checkCurrentActivity);\n if (currentActivitySame) {\n if (isActivityRecovery(activityThatStartedThis)) {\n // @ts-ignore real\n const activityContent: ActivityContent = {\n ...omit(previousActivity.content, ['autoStart']),\n duration: pomodoroSettings.loadDuration,\n autoStart: true,\n uuid: uuid(),\n };\n yield call(commenceTimedActivity, activityContent);\n } else {\n const activityContent = {\n name: RECOVERY,\n type: ActivityType.ACTIVE,\n timedType: ActivityTimedType.TIMER,\n duration:\n (numberOfCompletedPomodoro + 1) % 4 === 0\n ? pomodoroSettings.longRecoveryDuration\n : pomodoroSettings.shortRecoveryDuration,\n uuid: uuid(),\n autoStart: true,\n };\n yield call(commenceTimedActivity, activityContent);\n yield put(createCompletedPomodoroEvent());\n }\n }\n shouldKeepTiming = false;\n }\n } else {\n shouldKeepTiming = false;\n }\n } while (shouldKeepTiming);\n}\n\nexport function* checkCurrentActivity() {\n try {\n const {data: activity} = yield call(performGet, CURRENT_ACTIVITY_URL);\n const {currentActivity} = yield select(selectActivityState);\n const areSame = activitiesEqual(activity, currentActivity);\n if (!areSame) {\n // There is more than one device controlling SOGoS now\n yield call(handleNewActivity, activity);\n }\n return areSame;\n } catch (e) {\n // todo: what do I do?\n return true;\n }\n}\n","import {call, delay, put, race, select} from 'redux-saga/effects';\nimport {waitForCurrentActivity} from './SandsOfTimeSaga';\nimport {activitiesEqual, Activity} from '../../types/ActivityTypes';\nimport {selectActivityState} from '../../reducers';\nimport {\n createTimeIncrementEvent,\n createTimeSetEvent,\n} from '../../events/TimeEvents';\n\nexport const getTime = (antecedenceTime: number) =>\n Math.floor((new Date().getTime() - antecedenceTime || 0) / 1000);\n\nexport const extractStartTime = (activityThatStartedThis: Activity) =>\n activityThatStartedThis.content.workStartedWomboCombo ||\n activityThatStartedThis.antecedenceTime;\n\nexport function* stopWatchSaga(activityThatStartedThis: Activity) {\n yield put(\n createTimeSetEvent(getTime(extractStartTime(activityThatStartedThis))),\n );\n\n let shouldKeepTiming: boolean = false;\n do {\n const before = new Date().valueOf();\n // check to see if current activity is same because could have changed while moving to this next iteration\n const {currentActivity} = yield select(selectActivityState);\n const areActivitiesSame = activitiesEqual(\n currentActivity,\n activityThatStartedThis,\n );\n if (areActivitiesSame) {\n yield put(createTimeIncrementEvent());\n const after = new Date().valueOf();\n const waitFor = 1000 - (after - before);\n const {currentActivity: newCurrentActivity} = yield race({\n currentActivity: call(waitForCurrentActivity),\n timeElapsed: delay(waitFor < 0 ? 0 : waitFor),\n });\n shouldKeepTiming = !newCurrentActivity;\n } else {\n shouldKeepTiming = false;\n }\n } while (shouldKeepTiming);\n}\n","import {GlobalState, selectActivityState} from '../../reducers';\nimport {call, fork, race, select, take} from 'redux-saga/effects';\nimport {ActivityTimedType} from '../../types/ActivityTypes';\nimport {\n INITIALIZED_CURRENT_ACTIVITY,\n RESUMED_TIMED_ACTIVITY,\n STARTED_TIMED_ACTIVITY,\n} from '../../events/ActivityEvents';\nimport {pomodoroSaga} from './PomodoroSaga';\nimport {stopWatchSaga} from './StopwatchSaga';\n\nconst extractState = (state: GlobalState) => {\n const {shouldTime} = selectActivityState(state);\n return {\n shouldTime,\n };\n};\n\nexport function* sandsOfTimeSaga() {\n do {\n const currentActivity = yield call(waitForCurrentActivity);\n const {shouldTime} = yield select(extractState);\n const {\n content: {timedType},\n } = currentActivity;\n const isTimer = timedType === ActivityTimedType.TIMER;\n if (shouldTime) {\n if (isTimer) {\n yield fork(pomodoroSaga, currentActivity);\n } else {\n yield fork(stopWatchSaga, currentActivity);\n }\n }\n } while (true);\n}\n\nexport function* waitForCurrentActivity() {\n const {firstActivity, newActivity, userActivity} = yield race({\n firstActivity: take(INITIALIZED_CURRENT_ACTIVITY),\n newActivity: take(RESUMED_TIMED_ACTIVITY),\n userActivity: take(STARTED_TIMED_ACTIVITY),\n });\n\n return firstActivity\n ? firstActivity.payload\n : newActivity\n ? newActivity.payload\n : userActivity.payload;\n}\n","import {call, put, select, take} from 'redux-saga/effects';\nimport {buffers, eventChannel} from 'redux-saga';\nimport {ActivityTimedType} from '../../types/ActivityTypes';\nimport {extractStartTime} from './StopwatchSaga';\nimport {GlobalState, selectActivityState} from '../../reducers';\nimport {createTimeSetEvent} from '../../events/TimeEvents';\n\nexport const createFocusChannel = () => {\n return eventChannel(statusObserver => {\n const listener = () => {\n statusObserver(true);\n };\n window.addEventListener('focus', listener);\n return () => window.removeEventListener('focus', listener);\n }, buffers.expanding(100));\n};\n\nfunction* updateTime() {\n const {shouldTime, currentActivity} = yield select(\n (globalState: GlobalState) => {\n const {shouldTime: sT, currentActivity: cA} = selectActivityState(\n globalState,\n );\n return {\n shouldTime: sT,\n currentActivity: cA,\n };\n },\n );\n const {\n content: {timedType},\n } = currentActivity;\n const isTimer = timedType === ActivityTimedType.TIMER;\n if (shouldTime) {\n const delta = Math.floor(\n (new Date().valueOf() - extractStartTime(currentActivity)) / 1000,\n );\n if (isTimer) {\n // todo: update pomodoro, maybe?\n } else {\n yield put(createTimeSetEvent(delta));\n }\n }\n}\n\nexport function* focusSaga() {\n const focusChannel = createFocusChannel();\n while (true) {\n yield take(focusChannel);\n yield call(updateTime);\n }\n}\n","import {all, fork} from 'redux-saga/effects';\nimport {sandsOfTimeSaga} from './time/SandsOfTimeSaga';\nimport {focusSaga} from './time/FocusSaga';\n\nfunction* startTimeSagas() {\n yield fork(sandsOfTimeSaga);\n yield fork(focusSaga);\n}\n\nexport default function* rootSaga() {\n yield all([startTimeSagas()]);\n}\n","import {put, call, all, takeEvery, delay} from 'redux-saga/effects';\nimport {RECEIVED_USER} from '../events/UserEvents';\nimport {PayloadEvent} from '../events/Event';\nimport {UserResponse} from '../types/UserTypes';\nimport {\n ACKNOWLEDGED_TACMOD,\n createAffirmedTabModAcknowledgementEvent,\n createSyncedThankedForDownloadingTacModEvent, createSyncedUserWelcomed,\n THANKED_FOR_TACMOD,\n USER_WELCOMED,\n} from '../events/ActivityEvents';\nimport {performPost} from './APISagas';\n\nfunction initialWalkThroughSaga({payload: user}: PayloadEvent) {\n const onboarding = user.misc.onboarding;\n if (!(onboarding && onboarding.welcomed)) {\n // show onboarding carousel\n }\n\n if (onboarding && onboarding.TacModDownloaded && !onboarding.TacModThanked) {\n // thank user for being awesome!!\n // also disable the TacMod notification.\n }\n}\n\nfunction* tacModAffirmationSaga(_: any, attempt = 10): Generator {\n try {\n yield call(performPost, '/user/onboarding/TacMod/notified', {});\n yield put(createAffirmedTabModAcknowledgementEvent());\n } catch (e) {\n yield delay(Math.pow(2, attempt) + Math.floor(Math.random() * 1000));\n yield call(tacModAffirmationSaga, {}, attempt < 13 ? attempt + 1 : 10);\n }\n}\nfunction* tacModGratefulSaga(_: any, attempt = 10): Generator {\n try {\n yield call(performPost, '/user/onboarding/TacMod/thanked', {});\n yield put(createSyncedThankedForDownloadingTacModEvent());\n } catch (e) {\n yield delay(Math.pow(2, attempt) + Math.floor(Math.random() * 1000));\n yield call(tacModAffirmationSaga, {}, attempt < 13 ? attempt + 1 : 10);\n }\n}\n\nfunction* initialOnboardingSaga(_: any, attempt = 10): Generator {\n try {\n yield call(performPost, '/user/onboarding/welcomed', {});\n yield put(createSyncedUserWelcomed());\n } catch (e) {\n yield delay(Math.pow(2, attempt) + Math.floor(Math.random() * 1000));\n yield call(tacModAffirmationSaga, {}, attempt < 13 ? attempt + 1 : 10);\n }\n}\n\nfunction* setUpOnboardingSagas() {\n yield takeEvery(RECEIVED_USER, initialWalkThroughSaga);\n yield takeEvery(ACKNOWLEDGED_TACMOD, tacModAffirmationSaga);\n yield takeEvery(THANKED_FOR_TACMOD, tacModGratefulSaga);\n yield takeEvery(USER_WELCOMED, initialOnboardingSaga);\n}\n\nexport default function* rootSaga() {\n yield all([setUpOnboardingSagas()]);\n}\n","import SecuritySagas from './SecuritySagas';\nimport ConfigurationSagas from './ConfigurationSagas';\nimport UserSagas from './UserSagas';\nimport ActivitySagas from './ActivitySagas';\nimport NetworkSagas from './NetworkSagas';\nimport {all} from 'redux-saga/effects';\nimport HistorySagas from './HistorySagas';\nimport StrategySagas from './StrategySagas';\nimport TacticalSagas from './TacticalSagas';\nimport CacheSagas from './CacheSagas';\nimport TimeSagas from './TimeSagas';\nimport OnboardingSagas from \"./OnboardingSagas\";\n\nexport default function* rootSaga() {\n yield all([\n SecuritySagas(),\n ConfigurationSagas(),\n TimeSagas(),\n UserSagas(),\n ActivitySagas(),\n NetworkSagas(),\n HistorySagas(),\n StrategySagas(),\n TacticalSagas(),\n CacheSagas(),\n OnboardingSagas(),\n ]);\n}\n","import {applyMiddleware, compose, createStore} from 'redux';\nimport omit from 'lodash/omit';\nimport rootReducer from '../reducers';\nimport thunk from 'redux-thunk';\nimport createSagaMiddleware from 'redux-saga';\nimport rootSaga from '../sagas';\nimport {createTransform, persistReducer, persistStore} from 'redux-persist';\nimport storage from 'redux-persist/lib/storage';\nimport autoMergeLevel2 from 'redux-persist/lib/stateReconciler/autoMergeLevel2';\nimport {routerMiddleware} from 'connected-react-router';\nimport {createBrowserHistory} from 'history';\n\nexport const history = createBrowserHistory();\nconst fetchMiddleware = (sagaMiddleware: any) => {\n const commonMiddleware = [thunk, sagaMiddleware, routerMiddleware(history)];\n if (process.env.NODE_ENV === 'development') {\n const reactoTron = require('./ReactotronConfiguration').default;\n return compose(\n applyMiddleware(...commonMiddleware),\n reactoTron.createEnhancer(),\n );\n }\n return applyMiddleware(...commonMiddleware);\n};\n\nconst blackListTransform = createTransform((inboundState: any, key) => {\n if (key === 'security') {\n return omit(inboundState, ['isInitialized', 'isOutOfSync', 'readOnly', 'readToken']);\n } else if (key === 'misc') {\n return omit(inboundState, ['notification', 'avatarUpload',]);\n } else {\n return inboundState;\n }\n});\n\nexport const fetchApplicationConfiguration = () => {\n const persistConfig = {\n key: 'root',\n storage,\n stateReconciler: autoMergeLevel2,\n whitelist: ['security', 'user', 'activity', 'strategy', 'tactical', 'misc'],\n transforms: [blackListTransform],\n };\n\n const sagaMiddleware = createSagaMiddleware();\n const store = createStore(\n persistReducer(persistConfig, rootReducer(history)),\n fetchMiddleware(sagaMiddleware),\n );\n sagaMiddleware.run(rootSaga);\n\n const persistor = persistStore(store);\n\n return {\n store,\n persistor,\n };\n};\n","import './modules/modules.d';\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport App from './views/App';\nimport * as serviceWorker from './serviceWorker';\nimport {Provider} from 'react-redux';\nimport {fetchApplicationConfiguration, history} from './config/Configuration';\nimport {PersistGate} from 'redux-persist/lib/integration/react';\nimport initWorkboxRefresh from '@loopmode/cra-workbox-refresh';\nimport {BrowserRouter as Router} from 'react-router-dom';\nimport {ConnectedRouter} from 'connected-react-router';\n\nconst {store, persistor} = fetchApplicationConfiguration();\n\nReactDOM.render(\n \n \n \n \n \n \n \n \n ,\n document.getElementById('root'),\n);\n\nconst renderRefreshUI = (registration: any) => {\n window.dispatchEvent(\n // eslint-disable-next-line no-undef\n new CustomEvent('sogosUpdateAvailable', {\n detail: registration,\n }),\n );\n};\n\nif (process.env.NODE_ENV === 'production') {\n serviceWorker.register({\n onUpdate: registration =>\n initWorkboxRefresh(registration, {\n render: renderRefreshUI,\n }),\n });\n} else {\n serviceWorker.unregister();\n}\n","module.exports = __webpack_public_path__ + \"static/media/SOGoS.e5e7ece0.svg\";","module.exports = __webpack_public_path__ + \"static/media/ActivityIcon.eec2e03c.svg\";","module.exports = __webpack_public_path__ + \"static/media/Goal.ede9b6f3.svg\";","module.exports = __webpack_public_path__ + \"static/media/Tomato.274cb36f.svg\";","module.exports = __webpack_public_path__ + \"static/media/confetti.b9e3f374.png\";","module.exports = __webpack_public_path__ + \"static/media/History.7aba704c.svg\";"],"sourceRoot":""}