{"version":3,"sources":["storage/GlobalStoreContext.tsx","components/SideBar/SideBarMenuItem.tsx","auth/auth0Context.tsx","auth/cookies.tsx","components/SideBar/SideBarComponent.tsx","components/AppBar/AppBarComponent.tsx","components/Shared/Progress/ProgressComponent.tsx","pages/insights/OverviewComponent.tsx","pages/insights/InsightCategoryComponent.tsx","pages/insights/RadarRankingComponent.tsx","pages/error/ErrorComponent.tsx","services/useFetchApiData.ts","services/settings.service.ts","common/appSettings.tsx","services/useFetchPostApiData.ts","pages/insights/InsightsContainer.tsx","services/insights.service.ts","analytics/trackerContext.tsx","components/VideoPlayer/VideoPlayerComponent.tsx","pages/lessons/Play/LessonVideoComponent.tsx","pages/lessons/Play/LessonPlayContainer.tsx","services/lessons.service.ts","pages/lessons/LessonItemComponent.tsx","pages/lessons/LessonsContainer.tsx","pages/settings/PracticeCategorySettingsComponent.tsx","models/preplabModels.ts","pages/settings/SettingsContainer.tsx","services/userSettings.service.ts","pages/practice/PracticeButton.tsx","pages/practice/PracticeCategoryComponent.tsx","pages/practice/PracticeMultipleComponent.tsx","pages/practice/TestSession/OptionExplanation.tsx","pages/practice/TestSession/SingleOptionSelectionList.tsx","pages/practice/TestSession/MostLeastOptionSelectionList.tsx","pages/practice/TestSession/QuestionContentTab.tsx","cache/useImage.tsx","pages/practice/TestSession/QuestionTabs.tsx","components/Shared/Countdown/CountdownComponent.tsx","components/Shared/ConfirmDialog/ConfirmDialogComponent.tsx","pages/practice/TestSession/TestSessionDialog.tsx","services/testSession.service.ts","pages/practice/PracticeContainer.tsx","services/shop.service.ts","pages/timeline/TimelineItemComponent.tsx","pages/timeline/TimelineContainer.tsx","services/timeline.service.ts","pages/shop/ShopPackageComponent.tsx","pages/shop/Payment/StripeCheckoutComponent.tsx","pages/shop/Receipt/ReceiptSummaryItem.tsx","pages/shop/Payment/PayPalCheckoutComponent.tsx","pages/shop/CheckoutDialog.tsx","pages/shop/ShopContainer.tsx","pages/shop/Receipt/ReceiptContainer.tsx","common/testSessionHelper.tsx","pages/result/ResultAnswersComponent.tsx","pages/result/ResultTimeScoreComponent.tsx","components/Shared/QuestionFeedback/QuestionFeedbackComponent.tsx","services/feedback.service.ts","components/VideoPlayer/PlayerDialog.tsx","pages/result/ResultQuestionsComponent.tsx","pages/result/CategoryResultsComponent.tsx","pages/result/ResultContainer.tsx","components/OnBoarding/OnBoardingDialog.tsx","assets/icons/CreativeThinking.tsx","assets/icons/TrainingVideo.tsx","assets/icons/GraduationCap.tsx","components/OnBoarding/WelcomeDialog.tsx","pages/CoreLayout.tsx","pages/login/LoginContainer.tsx","components/Auth/AuthRoute.tsx","common/settingsHelper.tsx","App.tsx","index.tsx"],"names":["StoreActions","SideBarMenuItem","title","to","icon","onClick","MenuItem","component","AdapterLink","ListItemIcon","Icon","Typography","variant","React","forwardRef","props","ref","innerRef","Auth0Context","createContext","useAuth0","useContext","Auth0Provider","children","settings","useState","isAuthenticated","setIsAuthenticated","auth0Lock","setAuth0Lock","profile","setProfile","idToken","setIdToken","options","closable","mustAcceptTerms","theme","logo","Auth0Logo","languageDictionary","signUpTerms","PolicyUrl","auth","redirect","params","scope","useEffect","Auth0ClientId","Auth0Domain","Auth0Lock","login","show","listenOnAuthenticated","key","value","Cookies","JSON","parse","ClientStorage","checkSession","error","result","updateUserProfile","accessToken","token","getUserInfo","console","Sentry","id","user_id","auth0","on","stringify","expires","daysUntilExpire","hide","Provider","logout","useStyles","makeStyles","createStyles","drawer","width","flexShrink","whiteSpace","border","drawerPaperMobile","backgroundColor","drawerPaper","objectFit","height","margin","toolbar","mixins","SideBarComponent","classes","mobileSideBarOpen","toggleMobileSideBar","logoPath","MenuItems","Hidden","smUp","Grid","alt","src","className","Divider","MenuList","Drawer","anchor","open","paper","onClose","ModalProps","keepMounted","xsDown","appBar","zIndex","menuButton","marginRight","spacing","flex","AppBarComponent","pageTitle","AppBar","position","Toolbar","IconButton","edge","color","aria-label","align","ProgressComponent","text","container","justify","direction","alignItems","item","gutterBottom","LinearProgress","OverviewComponent","insight","pieChartColors","pieChartdatasetOverride","hoverBackgroundColor","hoverBorderColor","hoverBorderWidth","chartsOptions","tooltips","displayColors","callbacks","label","tooltipItem","data","datasets","index","avgCorrectChartData","labels","borderWidth","AvgCorrect","percentilChartData","OverallPercentile","legendOpts","display","Card","CardHeader","CardContent","xs","legend","InsightCategoryComponent","category","useTheme","scales","yAxes","gridLines","Sessions","length","drawBorder","ticks","beginAtZero","max","min","stepSize","xAxes","maintainAspectRatio","responsive","Array","numbers","k","Result","chartData","borderColor","pointBackgroundColor","pointBorderColor","lineTension","Name","style","palette","getContrastText","Color","background","CardActions","UniqueQuestions","OtherUsers","RadarRankingComponent","setData","temp","Categories","forEach","cat","push","percentile","Percentile","Box","colors","scheme","keys","indexBy","maxValue","curve","gridShape","gridLevels","enableDots","dotSize","enableDotLabel","dotLabel","d","dotBorderWidth","top","right","bottom","left","isInteractive","legends","tooltipFormat","ErrorComponent","GlobalStoreContext","GlobalStoreDispatchContext","useGlobalStore","useGlobalStoreDispatch","FetchStatus","GlobalStoreProvider","tenantId","useFetchApiData","useGetSettings","useParams","status","useLocalStorage","localSettings","setSettings","useReducer","state","action","type","SetPageTitle","payload","SetAppSettings","appSettings","SetSettings","loading","TenantId","appVersion","process","dispatch","Success","APP_SETTINGS","APIUrl","window","apiUrl","PostState","Loading","Error","source","axios","CancelToken","a","xTenantId","get","cancelToken","headers","Accept","Authorization","response","isCancel","fetchData","cancel","InsightsContainer","sm","map","Id","TrackerContext","useTracker","TrackerProvider","store","pathname","useLocation","tagManagerArgs","gtmId","GoogleTagManager","GoogleTagManagerAuth","TagManager","initialize","trackPage","prof","getUserData","track","user_logins_count","trackAction","eventAction","eventCategory","dataLayer","createdat","Math","round","Date","created_at","getTime","user_name","name","user_email","email","logins_count","user_created_at","user_created_at_unix","user_app_version","path","event","view_path","view_url","location","href","eventId","replace","toLowerCase","VideoPlayer","videoUrl","thumbnailUrl","onStart","onProgress","handleOnProgress","played","url","controls","config","file","attributes","controlsList","poster","onContextMenu","e","preventDefault","LessonVideoComponent","lesson","getAccess","watched","reached25","reached50","reached75","cardStyle","maxWidth","breakpoints","tracker","HaveAccess","VideoContent","Thumbnail","eventLabel","Title","trackProgress","backgroundImage","dangerouslySetInnerHTML","__html","Description","root","Button","size","fullWidth","bind","LessonPlayContainer","history","useHistory","useGetLesson","alignContent","card","flexDirection","justifyContent","LessonItemComponent","markup","goToDetails","square","CardActionArea","disabled","CardMedia","image","paddingTop","endIcon","formControl","minWidth","selectEmpty","marginTop","LessonsContainer","categoryId","setCategoryId","useGetLessons","FormControl","InputLabel","Select","labelId","onChange","target","Lessons","md","lg","PracticeCategorySettingsComponent","userSettings","processing","saveUserSettings","languageFormStyle","CategoriesSettings","categorySettings","Accordion","AccordionSummary","expandIcon","AccordionDetails","AvailableLanguages","htmlFor","CategoryId","data-category-id","SelectedLanguage","catSetting","filter","x","oldValues","handleLanguageChange","lang","Code","QuestionsLimit","handleQuestionLimitChange","AvailableQuestionsLimit","limit","startIcon","Save","CircularProgress","marginLeft","QuestionAnswerState","TestSessionType","UserActivityContext","useFetchPostApiData","Sending","None","useCallback","postData","post","SettingsContainer","saveSettings","command","PracticeButton","tooltip","Tooltip","enterDelay","PracticeCategoryComponent","selectItem","buyItem","AvaliableQuestions","AlreadyHave","Practice","CanPracticeWeaknesses","Weaknesses","Exam","PracticeMultipleComponent","PracticeMultipleSelectorDialog","categories","testsessiontype","selectItems","selectedCategories","handleClose","Dialog","aria-labelledby","aria-describedby","DialogTitle","DialogContent","dividers","FormControlLabel","control","Checkbox","checked","concat","findIndex","splice","handleChange","DialogActions","autoFocus","OptionExplanation","explanation","explanationVideo","openVideo","hasExplanationText","hasExplanationVideo","radioDefault","radioIncorrect","red","radioCorrect","green","radioPartial","yellow","SingleOptionItem","option","isExplanationMode","selected","onPlayVideo","onSelected","getColor","res","MostEffectiveState","ListItem","button","sel","getResultIcon","Radio","tabIndex","disableRipple","ListItemText","Text","Explanation","ExplanationVideo","SingleOptionSelectionList","mostEffectiveAnswerId","onSelect","handleListItemClick","oId","List","Fragment","buttonDefault","secondary","contrastText","main","buttonCorrectSelected","A700","buttonIncorrectSelected","buttonPartialSelected","A400","buttonCorrectAnswer","MostLeastOptionItem","meSelected","leSelected","handleSelected","mostEffective","getButtonColor","effectiveState","readOnly","mt","ButtonGroup","disableFocusRipple","IsSelectedMost","IsSelectedLess","LeastEffectiveState","ListItemSecondaryAction","MostLeastOptionSelectionList","leastEffectiveAnswerId","onSelectMostEffective","onSelectLeastEffective","handleSelection","grid","media","padding","ImageSkeleton","speed","viewBox","foregroundColor","y","rx","ry","QuestionContentTab","question","questionResult","isActive","hasLoaded","setHasLoaded","hasError","setHasError","hasStartedInitialFetch","setHasStartedInitialFetch","Image","handleError","handleLoad","onerror","onload","removeEventListener","useImage","selectMostEffectiveAnswer","optionId","isSingleCorrect","IsSingleCorrect","MostEffectiveAnswer","LessEffectiveAnswer","hidden","Body","Options","selectLessEffectiveAnswer","TestSessionButtons","showPrevious","showNext","showCompleteTest","onNext","onPrevious","onCompleteTest","flexGrow","tab","QuestionTabs","questions","onTabSelected","onTabDeselected","completeTest","selectedTab","setSelectedTab","changeTab","oldTab","newTab","oldQuestion","newq","Tabs","indicatorColor","textColor","scrollButtons","Tab","Container","newSelectedTab","CountdownComponent","start","sec","timerTick","seconds","setSeconds","interval","setInterval","clearInterval","countdown","minutes","floor","abs","toString","parseString","ConfirmDialogComponent","content","cancelAction","okAction","cancelText","okText","DialogContentText","counter","PracticeTestSessionDialog","onComplete","mode","tracking","setResult","showAbortConfirmation","setShowAbortConfirmation","showCompleteConfirmation","setShowCompleteConfirmation","countdownActive","setCountdownActive","startTestSession","closeResponse","closeSession","didMount","useRef","flatMap","c","Questions","mins","reduce","prev","cur","MaxTotalTimeS","sessionId","onCompleteCallback","CategoryIds","join","eventValue","PreferedLanguage","current","resQ","Duration","TimeSpent","SessionId","fullScreen","questionId","questionTimeSpent","prevState","setTimeSpent","PracticeContainer","openTestSessionDialog","setOpenTestSessionDialog","openComboSessionSelector","setOpenComboSessionSelector","setSelected","TimelineItemComponent","timeline","showDetails","getActivityTitle","ActivityType","subheader","Created","TotalCorrectNormalized","TotalTimeSpentMs","TestSessionCategories","tim","CategoryColor","CategoryName","CorrectNormalized","TimelineContainer","Items","cardContent","chip","chipSelected","primary","light","purchaseButton","ShopPackageComponent","shopPackage","createCharge","goPractice","subscription","setSubscription","Subscriptions","Left","sub","Chip","clickable","handleDurationSelection","Price","Currency","buttonProgress","StripeCheckoutComponent","stripePublicKey","selectedPackage","setLoading","createSession","redirectToCheckoutCallbak","Stripe","redirectToCheckout","Amount","price","PackageId","packageId","duration","description","SuccessUrl","origin","CancelUrl","ReceiptSummaryItem","currency","PayPalCheckoutComponent","paypalPublicKey","setProcessing","createOrder","procStatus","processOrder","visibility","tagline","amount","onSuccess","details","OrderId","orderID","clientId","onButtonReady","CheckoutDialog","isNullOrUndefined","Paper","elevation","ShopContainer","setSelectedPackage","openCheckoutDialog","setOpenCheckoutDialog","pack","subs","Packages","StripePublicKey","PayPalPublicKey","table","ReceiptContainer","isCallback","receipt","mb","TransactionId","TestSessionHelper","mostState","leassState","mostSelected","lessSelected","ResultAnswersComponent","percentCorrect","percentUnanswered","UnansweredNormalized","percentageData","chartOptions","rotation","PI","circumference","getLabelByColor","ResultTimeScoreComponent","this","testSessionResult","gotoQuestion","timeLabels","timeDatasetOverride","tempMyTime","tempOthersTime","maxQuestionTimeS","val","MaxQuestionTimeS","timeOptions","barShowStroke","activeElements","datasetIndex","callback","scaleLabel","labelString","afterBuildTicks","humdaysChart","questionsData","i","AvgDuration","TimeSpentMs","IsAnswered","getQuestionColorByState","State","barData","redraw","pl","borderLeft","Component","QuestionFeedbackDialog","questionName","message","setMessage","sendFeedback","onCloseCallback","useMediaQuery","down","closeDialog","TextField","multiline","rows","QuestionId","FeedbackMessage","closeButton","grey","PlayerDialog","onBackdropClick","disableTypography","textDefault","textCorrect","textIncorrect","textPartial","ResultQuestionsComponent","openFeedback","setOpenFeedback","openVideoPlayer","setOpenVideoPlayer","showVideoPlayer","noWrap","trim","slice","IsViewed","FormLabel","getQuestionLabelByState","Percent","AccordionActions","CategoryResultsComponent","DisplayName","TotalTimeSpentS","ResultContainer","stepper","dialogPaper","slideRoot","sliderIcon","OnBoardingDialog","settingsKey","onDismiss","settingsName","isOpen","setOpen","activeStep","setActiveStep","childrenCount","Children","count","child","MobileStepper","steps","nextButton","backButton","prevActiveStep","OnBoardingSlide","svgIcon","cloneElement","SvgIcon","fillRule","shapeRendering","textRendering","WelcomeDialog","TrainingVideo","GraduationCap","CreativeThinking","appBarSpacer","transition","transitions","create","easing","sharp","leavingScreen","paddingBottom","CoreLayout","globalStore","Logo","setState","exact","render","LoginContainer","setOrigin","AuthRoute","rest","createElement","SettingsHelper","indigo","pink","blue","blueGrey","App","setTitle","createMuiTheme","setTheme","useFavicon","ImageRootPath","useTitle","AppName","getThemePalette","PrimaryPalette","SecondaryPalette","CssBaseline","onRedirectCallback","appState","replaceState","document","targetUrl","basename","IsProduction","dsn","release","environment","integrations","Integrations","BrowserTracing","tracesSampleRate","TenantRoot","ReactDOM","getElementById"],"mappings":"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","file":"static/js/main.4c7c063d.chunk.js","sourcesContent":["import React, { useEffect, useContext, useReducer } from \"react\";\r\nimport { useGetSettings } from \"../services/settings.service\";\r\nimport { useLocalStorage } from \"react-use\";\r\nimport { FetchStatus } from \"../services/useFetchApiData\";\r\nimport { TenantSettingsViewModel } from \"../models/preplabModels\";\r\nimport { useParams } from \"react-router-dom\";\r\n\r\ninterface IPersistentAppState {\r\n [key: string]: boolean | number | string | undefined;\r\n}\r\n\r\nexport const GlobalStoreContext = React.createContext({} as any);\r\nexport const GlobalStoreDispatchContext = React.createContext>({} as any);\r\n\r\nexport const useGlobalStore = () => useContext(GlobalStoreContext);\r\nexport const useGlobalStoreDispatch = () => useContext(GlobalStoreDispatchContext);\r\n\r\nexport enum StoreActions {\r\n SetPageTitle,\r\n SetAppSettings,\r\n SetSettings,\r\n SetTenantId,\r\n}\r\n\r\ntype GlobalStoreAction =\r\n | { type: StoreActions.SetPageTitle; payload: string }\r\n | { type: StoreActions.SetAppSettings; payload: IPersistentAppState }\r\n | { type: StoreActions.SetSettings; payload: TenantSettingsViewModel };\r\n\r\nexport interface IGlobalStore {\r\n loading: boolean;\r\n settings: TenantSettingsViewModel;\r\n tenantId?: string;\r\n appVersion?: string;\r\n pageTitle: string;\r\n appSettings: IPersistentAppState;\r\n}\r\n\r\ninterface IGlobalStoreProviderProps {\r\n children: any;\r\n [index: string]: any;\r\n}\r\n\r\nexport const GlobalStoreProvider = ({ children }: IGlobalStoreProviderProps) => {\r\n const stateReducer = (state: IGlobalStore, action: GlobalStoreAction): IGlobalStore => {\r\n switch (action.type) {\r\n case StoreActions.SetPageTitle:\r\n return { ...state, pageTitle: action.payload };\r\n case StoreActions.SetAppSettings:\r\n return { ...state, appSettings: action.payload };\r\n case StoreActions.SetSettings:\r\n return { ...state, loading: false, settings: action.payload, tenantId: action.payload?.TenantId };\r\n default:\r\n return state;\r\n }\r\n };\r\n\r\n var { tenantId } = useParams<{ tenantId: string | undefined }>();\r\n\r\n const [status, , data] = useGetSettings(tenantId);\r\n\r\n const [localSettings, setSettings] = useLocalStorage(\r\n \"app.settings\",\r\n {} as IPersistentAppState,\r\n );\r\n\r\n const [state, dispatch] = useReducer>(stateReducer, {\r\n loading: true,\r\n pageTitle: \"\",\r\n appVersion: process.env.REACT_APP_VERSION,\r\n appSettings: localSettings ?? {},\r\n settings: data,\r\n });\r\n\r\n useEffect(() => {\r\n if (status === FetchStatus.Success && data) {\r\n dispatch({ type: StoreActions.SetSettings, payload: data });\r\n }\r\n }, [status, data]);\r\n\r\n useEffect(() => {\r\n setSettings(state.appSettings);\r\n }, [setSettings, state.appSettings]);\r\n\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n};\r\n","import React from \"react\";\r\nimport { ListItemIcon, MenuItem, Typography, Icon } from \"@material-ui/core\";\r\nimport { Link, LinkProps } from \"react-router-dom\";\r\n\r\ninterface IMenuItemProps {\r\n title: string;\r\n to: string;\r\n icon: string;\r\n onClick?: () => void;\r\n}\r\n\r\nexport const SideBarMenuItem = ({ title, to, icon, onClick }: IMenuItemProps) => {\r\n return (\r\n <>\r\n \r\n \r\n {icon}\r\n \r\n {title}\r\n \r\n \r\n );\r\n};\r\n\r\n// Used for react-router-dom link compability\r\nconst AdapterLink = React.forwardRef((props, ref) => (\r\n \r\n));\r\n","import React, { useState, useEffect, useContext } from \"react\";\r\nimport Auth0Lock from \"auth0-lock\";\r\nimport { TenantSettingsViewModel } from \"../models/preplabModels\";\r\nimport { Auth0UserProfile } from \"auth0-js\";\r\nimport * as ClientStorage from \"./cookies\";\r\nimport * as Sentry from \"@sentry/react\";\r\n\r\nexport interface IAuth0Context {\r\n isAuthenticated: boolean;\r\n idToken: string;\r\n profile: Auth0UserProfile;\r\n login: () => void;\r\n logout: () => void;\r\n}\r\n\r\nexport const Auth0Context = React.createContext({} as any);\r\n\r\nexport const useAuth0 = () => useContext(Auth0Context);\r\n\r\ninterface IAuth0ProviderProps {\r\n children: any;\r\n settings: TenantSettingsViewModel;\r\n [index: string]: any;\r\n}\r\n\r\nexport const Auth0Provider = ({ children, settings }: IAuth0ProviderProps) => {\r\n const [isAuthenticated, setIsAuthenticated] = useState(false);\r\n const [auth0Lock, setAuth0Lock] = useState(null);\r\n const [profile, setProfile] = useState({} as any);\r\n const [idToken, setIdToken] = useState(\"\");\r\n\r\n let options = {\r\n closable: false,\r\n mustAcceptTerms: true,\r\n theme: {\r\n logo: settings.Auth0Logo,\r\n },\r\n languageDictionary: {\r\n title: \"\",\r\n signUpTerms:\r\n 'I agree to the terms and privacy policy',\r\n },\r\n auth: {\r\n redirect: false,\r\n params: {\r\n scope: \"openid email\",\r\n },\r\n },\r\n };\r\n\r\n useEffect(() => {\r\n if (settings.Auth0ClientId && settings.Auth0Domain) {\r\n let auth = new Auth0Lock(settings.Auth0ClientId, settings.Auth0Domain, options);\r\n setAuth0Lock(auth);\r\n }\r\n }, []);\r\n\r\n const login = () => {\r\n if (auth0Lock) auth0Lock.show();\r\n };\r\n\r\n useEffect(() => {\r\n if (auth0Lock) {\r\n listenOnAuthenticated(auth0Lock);\r\n\r\n if (ClientStorage.get(\"auth0.is.authenticated\") && auth0Lock) {\r\n auth0Lock.checkSession({}, (error, result) => {\r\n if (!error && result) {\r\n setIdToken(result.idToken);\r\n updateUserProfile(result.accessToken);\r\n setIsAuthenticated(true);\r\n } else {\r\n login();\r\n }\r\n });\r\n } else {\r\n login();\r\n }\r\n }\r\n }, [auth0Lock]);\r\n\r\n const updateUserProfile = (token: string) => {\r\n if (auth0Lock) {\r\n auth0Lock.getUserInfo(token, (error, profile) => {\r\n if (error) {\r\n console.error(error);\r\n return;\r\n }\r\n\r\n setProfile(profile);\r\n\r\n if (process.env.NODE_ENV === \"production\") Sentry.setUser({ id: profile.user_id });\r\n });\r\n }\r\n };\r\n\r\n const listenOnAuthenticated = (auth0: Auth0LockStatic) => {\r\n auth0.on(\"authenticated\", (result) => {\r\n auth0.getUserInfo(result.accessToken, (error, profile) => {\r\n if (error) {\r\n console.error(error);\r\n return;\r\n }\r\n\r\n ClientStorage.save(\"auth0.is.authenticated\", true, { daysUntilExpire: 1 });\r\n\r\n setIdToken(result.idToken);\r\n setProfile(profile);\r\n setIsAuthenticated(true);\r\n auth0.hide();\r\n });\r\n });\r\n };\r\n\r\n const logout = () => {\r\n setIdToken(\"\");\r\n setProfile({} as any);\r\n setIsAuthenticated(false);\r\n\r\n ClientStorage.remove(\"auth0.is.authenticated\");\r\n if (auth0Lock) auth0Lock.logout({});\r\n };\r\n\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n};\r\n","import * as Cookies from \"es-cookie\";\r\n\r\ninterface ClientStorageOptions {\r\n daysUntilExpire: number;\r\n}\r\n\r\nexport const getAllKeys = () => Object.keys(Cookies.getAll() || {});\r\n\r\nexport const get = (key: string) => {\r\n const value = Cookies.get(key);\r\n if (typeof value === \"undefined\") {\r\n return;\r\n }\r\n\r\n return JSON.parse(value) as T;\r\n};\r\n\r\nexport const save = (key: string, value: any, options: ClientStorageOptions) => {\r\n Cookies.set(key, JSON.stringify(value), {\r\n expires: options.daysUntilExpire,\r\n });\r\n};\r\n\r\nexport const remove = (key: string) => {\r\n Cookies.remove(key);\r\n};\r\n","import React from \"react\";\r\nimport { Divider, Drawer, Hidden, MenuList, makeStyles, Grid, Theme, createStyles } from \"@material-ui/core\";\r\nimport { SideBarMenuItem } from \"./SideBarMenuItem\";\r\nimport { useAuth0 } from \"../../auth/auth0Context\";\r\n\r\nexport const drawerWidth: number = 240;\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n drawer: {\r\n width: drawerWidth,\r\n flexShrink: 0,\r\n whiteSpace: \"nowrap\",\r\n border: \"none\",\r\n },\r\n drawerPaperMobile: {\r\n backgroundColor: \"#fafafaff\",\r\n width: drawerWidth,\r\n },\r\n drawerPaper: {\r\n backgroundColor: \"#00000000\",\r\n width: drawerWidth,\r\n },\r\n logo: {\r\n objectFit: \"cover\",\r\n height: \"32px\",\r\n margin: \"2px\",\r\n },\r\n toolbar: {\r\n ...theme.mixins.toolbar,\r\n },\r\n }),\r\n);\r\n\r\ninterface ISideBarProps {\r\n logoPath: string;\r\n mobileSideBarOpen: boolean;\r\n toggleMobileSideBar: Function;\r\n}\r\nexport const SideBarComponent = (props: ISideBarProps) => {\r\n const classes = useStyles();\r\n\r\n const { mobileSideBarOpen, toggleMobileSideBar, logoPath } = props;\r\n\r\n const { logout } = useAuth0();\r\n\r\n function onLogOut() {\r\n logout();\r\n }\r\n\r\n const MenuItems = (\r\n <>\r\n \r\n \r\n \"logo\"\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n\r\n return (\r\n <>\r\n \r\n \r\n {MenuItems}\r\n \r\n \r\n \r\n \r\n
\r\n {MenuItems}\r\n \r\n \r\n \r\n );\r\n};\r\n","import React from \"react\";\r\nimport AppBar from \"@material-ui/core/AppBar\";\r\nimport Toolbar from \"@material-ui/core/Toolbar\";\r\nimport Typography from \"@material-ui/core/Typography\";\r\nimport IconButton from \"@material-ui/core/IconButton\";\r\nimport MenuIcon from \"@material-ui/icons/Menu\";\r\nimport { Hidden, createStyles, makeStyles, Theme, Grid } from \"@material-ui/core\";\r\nimport { drawerWidth } from \"../SideBar/SideBarComponent\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n appBar: {\r\n zIndex: theme.zIndex.drawer + 1,\r\n margin: 0,\r\n },\r\n menuButton: {\r\n marginRight: theme.spacing(2),\r\n },\r\n logo: {\r\n width: drawerWidth,\r\n },\r\n title: {\r\n flex: 1,\r\n },\r\n }),\r\n);\r\n\r\ninterface IAppBarProps {\r\n logoPath: string;\r\n toggleMobileSideBar: Function;\r\n pageTitle: string;\r\n}\r\n\r\nexport const AppBarComponent = ({ logoPath, toggleMobileSideBar, pageTitle }: IAppBarProps) => {\r\n const classes = useStyles();\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \"logo\"\r\n \r\n \r\n \r\n {pageTitle}\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import React from \"react\";\r\nimport { Typography, Grid, LinearProgress } from \"@material-ui/core\";\r\n\r\ninterface IProgressProps {\r\n text: string;\r\n}\r\nexport const ProgressComponent = (props: IProgressProps) => {\r\n const { text } = props;\r\n return (\r\n \r\n \r\n {text && (\r\n \r\n {text}\r\n \r\n )}\r\n \r\n \r\n \r\n );\r\n};\r\n","import React from \"react\";\r\nimport { Card, CardContent, CardHeader, Grid, Typography } from \"@material-ui/core\";\r\nimport { Doughnut } from \"react-chartjs-2\";\r\nimport { InsightsViewModel } from \"../../models/preplabModels\";\r\n\r\ninterface IOverviewProps {\r\n insight: InsightsViewModel;\r\n}\r\nexport const OverviewComponent = (props: IOverviewProps) => {\r\n let { insight } = props;\r\n let pieChartColors = [\"#26A65B\", \"#DDDCD8\"];\r\n let pieChartdatasetOverride = {\r\n hoverBackgroundColor: [\"#26A65B\", \"#DDDCD8\"],\r\n hoverBorderColor: [\"#26A65B\", \"#DDDCD8\"],\r\n hoverBorderWidth: 0,\r\n };\r\n let chartsOptions = {\r\n tooltips: {\r\n displayColors: false,\r\n callbacks: {\r\n label: function (tooltipItem: any, data: any) {\r\n var value = data.datasets[0].data[tooltipItem.index];\r\n return value + \" %\";\r\n },\r\n },\r\n },\r\n };\r\n\r\n let avgCorrectChartData = {\r\n labels: [\"\", \"\"],\r\n datasets: [\r\n {\r\n borderWidth: pieChartdatasetOverride.hoverBorderWidth,\r\n hoverBackgroundColor: pieChartdatasetOverride.hoverBackgroundColor,\r\n hoverBorderColor: pieChartdatasetOverride.hoverBorderColor,\r\n backgroundColor: pieChartColors,\r\n data: [insight.AvgCorrect, 100 - insight.AvgCorrect],\r\n },\r\n ],\r\n };\r\n let percentilChartData = {\r\n labels: [\"\", \"\"],\r\n datasets: [\r\n {\r\n borderWidth: pieChartdatasetOverride.hoverBorderWidth,\r\n hoverBackgroundColor: pieChartdatasetOverride.hoverBackgroundColor,\r\n hoverBorderColor: pieChartdatasetOverride.hoverBorderColor,\r\n backgroundColor: pieChartColors,\r\n data: [insight.OverallPercentile, 100 - insight.OverallPercentile],\r\n },\r\n ],\r\n };\r\n const legendOpts = {\r\n display: false,\r\n };\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {insight.OverallPercentile} %\r\n \r\n \r\n Overall percentile\r\n \r\n \r\n \r\n \r\n\r\n \r\n {insight.AvgCorrect} %\r\n \r\n \r\n Avg correct answers\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import React from \"react\";\r\nimport { Card, CardContent, CardHeader, Grid, CardActions, Typography, useTheme } from \"@material-ui/core\";\r\nimport { Line } from \"react-chartjs-2\";\r\nimport { InsightCategoryViewModel } from \"../../models/preplabModels\";\r\n\r\ninterface IInsightCategoryProps {\r\n category: InsightCategoryViewModel;\r\n}\r\nexport const InsightCategoryComponent = (props: IInsightCategoryProps) => {\r\n let { category } = props;\r\n\r\n const theme = useTheme();\r\n\r\n let chartsOptions = {\r\n tooltips: {\r\n displayColors: false,\r\n callbacks: {\r\n label: function (tooltipItem: any, data: any) {\r\n var value = data.datasets[0].data[tooltipItem.index];\r\n return value + \" %\";\r\n },\r\n },\r\n },\r\n scales: {\r\n yAxes: [\r\n {\r\n gridLines: {\r\n display: category.Sessions.length > 0,\r\n drawBorder: false,\r\n },\r\n ticks: {\r\n display: false,\r\n beginAtZero: true,\r\n max: 100,\r\n min: 0,\r\n stepSize: 50,\r\n },\r\n },\r\n ],\r\n xAxes: [\r\n {\r\n gridLines: {\r\n display: false,\r\n },\r\n },\r\n ],\r\n },\r\n maintainAspectRatio: false,\r\n responsive: true,\r\n };\r\n\r\n let labels = new Array();\r\n let numbers = new Array();\r\n\r\n for (var k = 0; k < category.Sessions.length; k++) {\r\n labels[k] = \"\";\r\n numbers[k] = category.Sessions[k].Result;\r\n }\r\n\r\n let chartData = {\r\n labels: labels,\r\n datasets: [\r\n {\r\n borderColor: \"#97BBCD\",\r\n pointBackgroundColor: \"#97BBCD\",\r\n pointBorderColor: \"#FFFFFF\",\r\n lineTension: 0.2,\r\n data: numbers,\r\n },\r\n ],\r\n };\r\n const legendOpts = {\r\n display: false,\r\n };\r\n return (\r\n <>\r\n \r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n \r\n \r\n \r\n \r\n {category.UniqueQuestions}\r\n \r\n \r\n Questions seen\r\n \r\n \r\n \r\n \r\n {category.AvgCorrect} %\r\n \r\n \r\n Your average\r\n \r\n \r\n \r\n \r\n {category.OtherUsers} %\r\n \r\n \r\n Other users\r\n \r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n","import React, { useState, useEffect } from \"react\";\r\nimport { Card, CardContent, CardHeader, Box } from \"@material-ui/core\";\r\nimport { ResponsiveRadar } from \"@nivo/radar\";\r\nimport { InsightsViewModel } from \"../../models/preplabModels\";\r\n\r\ninterface IRadarRankingProps {\r\n insight: InsightsViewModel;\r\n}\r\n\r\nexport const RadarRankingComponent = ({ insight }: IRadarRankingProps) => {\r\n const [data, setData] = useState<{ category: string; percentile: number }[]>([]);\r\n\r\n useEffect(() => {\r\n let temp: { category: string; percentile: number }[] = [];\r\n\r\n insight.Categories?.forEach((cat) => {\r\n temp.push({ category: cat.Name, percentile: cat.Percentile });\r\n });\r\n\r\n setData(temp);\r\n }, [insight]);\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n `${d.value}%`}\r\n dotBorderWidth={1}\r\n margin={{ top: 25, right: 10, bottom: 25, left: 10 }}\r\n isInteractive={true}\r\n data={data}\r\n legends={[]}\r\n tooltipFormat={(value) => `${value}%`}\r\n >\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import React from \"react\";\r\nimport { Typography, Grid } from \"@material-ui/core\";\r\n\r\ninterface IErrorProps {\r\n error: any;\r\n}\r\nexport const ErrorComponent = (props: IErrorProps) => {\r\n const { error } = props;\r\n console.error(error);\r\n return (\r\n \r\n \r\n Oops, something went wrong. Please try again later.\r\n \r\n \r\n );\r\n};\r\n","import { useGlobalStore } from \"./../storage/GlobalStoreContext\";\r\nimport { useEffect, useReducer } from \"react\";\r\nimport { useAuth0 } from \"../auth/auth0Context\";\r\nimport { APP_SETTINGS } from \"../common/appSettings\";\r\nimport axios from \"axios\";\r\n\r\nexport enum FetchStatus {\r\n Loading = \"LOADING\",\r\n Success = \"SUCCESS\",\r\n Error = \"ERROR\",\r\n}\r\n\r\ninterface IFetchState {\r\n status: FetchStatus;\r\n error: Error;\r\n data: T;\r\n}\r\n\r\ntype Action =\r\n | { type: FetchStatus.Loading }\r\n | { type: FetchStatus.Success; payload: T }\r\n | { type: FetchStatus.Error; payload: Error };\r\n\r\nexport const useFetchApiData = (apiUrl: string, tenantId?: string): [FetchStatus, Error, T] => {\r\n const { idToken } = useAuth0();\r\n const settings = useGlobalStore();\r\n\r\n const stateReducer = (state: IFetchState, action: Action): IFetchState => {\r\n switch (action.type) {\r\n case FetchStatus.Loading:\r\n return { ...state, status: FetchStatus.Loading };\r\n case FetchStatus.Success:\r\n return { ...state, status: FetchStatus.Success, data: action.payload };\r\n case FetchStatus.Error:\r\n return { ...state, status: FetchStatus.Error, error: action.payload };\r\n default:\r\n return state;\r\n }\r\n };\r\n\r\n const [state, dispatch] = useReducer, Action>>(stateReducer, {\r\n status: FetchStatus.Loading,\r\n error: new Error(),\r\n data: {} as T,\r\n });\r\n\r\n useEffect(() => {\r\n const source = axios.CancelToken.source();\r\n\r\n if (!apiUrl) return;\r\n\r\n const fetchData = async () => {\r\n dispatch({ type: FetchStatus.Loading });\r\n try {\r\n let xTenantId = tenantId ?? settings.tenantId;\r\n\r\n const response = await axios.get(`${APP_SETTINGS.APIUrl}${apiUrl}`, {\r\n cancelToken: source.token,\r\n headers: {\r\n Accept: \"application/json\",\r\n ...(idToken && { Authorization: \"Bearer \" + idToken }),\r\n ...(xTenantId && { \"x-tenant-id\": xTenantId }),\r\n },\r\n });\r\n\r\n const data = await response.data;\r\n\r\n dispatch({ type: FetchStatus.Success, payload: data });\r\n } catch (error) {\r\n if (axios.isCancel(error)) return;\r\n console.error(error);\r\n dispatch({ type: FetchStatus.Error, payload: error });\r\n }\r\n };\r\n\r\n fetchData();\r\n\r\n return () => {\r\n source.cancel();\r\n };\r\n }, [apiUrl, idToken, settings.tenantId, tenantId]);\r\n\r\n return [state.status, state.error, state.data];\r\n};\r\n","import { TenantSettingsViewModel } from \"../models/preplabModels\";\r\nimport { useFetchApiData } from \"./useFetchApiData\";\r\n\r\nexport const useGetSettings = (tenantId?: string) => {\r\n return useFetchApiData(\"/api/Settings/GetSettings\", tenantId);\r\n};\r\n","declare global {\r\n interface Window {\r\n [key: string]: any;\r\n appSettings: any;\r\n }\r\n}\r\n\r\nexport const APP_SETTINGS = {\r\n APIUrl: (window.appSettings && window.appSettings.apiUrl) || \"\",\r\n};\r\n","import { useCallback, useReducer } from \"react\";\r\nimport { useAuth0 } from \"../auth/auth0Context\";\r\nimport { APP_SETTINGS } from \"../common/appSettings\";\r\nimport axios from \"axios\";\r\nimport { useGlobalStore } from \"../storage/GlobalStoreContext\";\r\n\r\nexport enum PostState {\r\n None = \"NONE\",\r\n Sending = \"SENDING\",\r\n Success = \"SUCCESS\",\r\n Error = \"ERROR\",\r\n}\r\n\r\nexport interface IApiPostResponse {\r\n status: PostState;\r\n error: Error;\r\n data: T;\r\n}\r\n\r\ntype Action =\r\n | { type: PostState.Sending }\r\n | { type: PostState.Success; payload: R }\r\n | { type: PostState.Error; payload: Error };\r\n\r\nexport const useFetchPostApiData = (\r\n apiUrl: string,\r\n): [IApiPostResponse, (data: Tpost) => Promise] => {\r\n const { idToken } = useAuth0();\r\n const settings = useGlobalStore();\r\n\r\n const stateReducer = (\r\n state: IApiPostResponse,\r\n action: Action,\r\n ): IApiPostResponse => {\r\n switch (action.type) {\r\n case PostState.Sending:\r\n return { ...state, status: PostState.Sending };\r\n case PostState.Success:\r\n return { ...state, status: PostState.Success, data: action.payload };\r\n case PostState.Error:\r\n return { ...state, status: PostState.Error, error: action.payload };\r\n default:\r\n return state;\r\n }\r\n };\r\n\r\n const [state, dispatch] = useReducer, Action>>(stateReducer, {\r\n status: PostState.None,\r\n error: new Error(),\r\n data: {} as Tresponse,\r\n });\r\n\r\n const postData = useCallback(\r\n async (postData: Tpost): Promise => {\r\n dispatch({ type: PostState.Sending });\r\n\r\n try {\r\n const response = await axios.post(`${APP_SETTINGS.APIUrl}${apiUrl}`, postData, {\r\n headers: {\r\n Accept: \"application/json\",\r\n \"Content-Type\": \"application/json; charset=utf-8\",\r\n ...(idToken && { Authorization: \"Bearer \" + idToken }),\r\n ...(settings.tenantId && { \"x-tenant-id\": settings.tenantId }),\r\n },\r\n });\r\n\r\n var data = response.data;\r\n\r\n dispatch({ type: PostState.Success, payload: data });\r\n\r\n return data;\r\n } catch (error) {\r\n console.error(error);\r\n dispatch({ type: PostState.Error, payload: error });\r\n }\r\n\r\n return {} as Tresponse;\r\n },\r\n [apiUrl, idToken, settings.tenantId],\r\n );\r\n\r\n return [state, postData];\r\n};\r\n","import React from \"react\";\r\nimport { Grid } from \"@material-ui/core\";\r\nimport { ProgressComponent } from \"../../components/Shared/Progress/ProgressComponent\";\r\nimport { OverviewComponent } from \"./OverviewComponent\";\r\nimport { InsightCategoryComponent } from \"./InsightCategoryComponent\";\r\nimport { RadarRankingComponent } from \"./RadarRankingComponent\";\r\nimport { ErrorComponent } from \"../error/ErrorComponent\";\r\nimport { useEffect } from \"react\";\r\nimport { useGetInsights } from \"../../services/insights.service\";\r\nimport { StoreActions, useGlobalStoreDispatch } from \"../../storage/GlobalStoreContext\";\r\nimport { FetchStatus } from \"../../services/useFetchApiData\";\r\nimport { InsightCategoryViewModel } from \"../../models/preplabModels\";\r\n\r\nexport const InsightsContainer = () => {\r\n const [status, error, data] = useGetInsights();\r\n const dispatch = useGlobalStoreDispatch();\r\n\r\n useEffect(() => {\r\n dispatch({ type: StoreActions.SetPageTitle, payload: \"Insights\" });\r\n }, [dispatch]);\r\n\r\n return (\r\n <>\r\n \r\n {status === FetchStatus.Loading ? (\r\n \r\n ) : status === FetchStatus.Error ? (\r\n \r\n ) : (\r\n <>\r\n \r\n \r\n \r\n {data && }\r\n \r\n \r\n {data && }\r\n \r\n \r\n \r\n \r\n \r\n {data?.Categories &&\r\n data.Categories.map((cat: InsightCategoryViewModel) => (\r\n \r\n \r\n \r\n ))}\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n );\r\n};\r\n","import { InsightsViewModel } from \"./../models/preplabModels\";\r\nimport { useFetchApiData } from \"./useFetchApiData\";\r\n\r\nexport const useGetInsights = () => {\r\n return useFetchApiData(\"/api/Insights/GetPackagesData\");\r\n};\r\n","import React, { useContext, useEffect } from \"react\";\r\nimport TagManager from \"react-gtm-module\";\r\nimport { useAuth0 } from \"../auth/auth0Context\";\r\nimport { useGlobalStore } from \"../storage/GlobalStoreContext\";\r\nimport { useLocation } from \"react-router\";\r\n\r\ntype userActions =\r\n | { eventAction: \"Signed In\"; eventCategory: \"User\" }\r\n | { eventAction: \"Signed Up\"; eventCategory: \"User\" };\r\n\r\ntype feedbackActions = { eventAction: \"Question Feedback Sent\"; eventCategory: \"Feedback\"; eventLabel: string };\r\n\r\ntype lessonsActions =\r\n | { eventAction: \"Play\"; eventCategory: \"Lesson\"; eventLabel: string }\r\n | { eventAction: \"Played 25%\"; eventCategory: \"Lesson\"; eventLabel: string }\r\n | { eventAction: \"Played 50%\"; eventCategory: \"Lesson\"; eventLabel: string }\r\n | { eventAction: \"Played 75%\"; eventCategory: \"Lesson\"; eventLabel: string };\r\n\r\ntype practiceActions =\r\n | { eventAction: \"Exam Practice Started\"; eventCategory: \"Practice\"; eventLabel: string }\r\n | { eventAction: \"Weakness Practice Started\"; eventCategory: \"Practice\"; eventLabel: string }\r\n | { eventAction: \"Regular Practice Started\"; eventCategory: \"Practice\"; eventLabel: string }\r\n | { eventAction: \"Practice Started\"; eventCategory: \"Practice\"; eventLabel: string; eventValue: string }\r\n | { eventAction: \"Customized Practice Started\"; eventCategory: \"Practice\"; eventLabel: string; eventValue: string }\r\n | { eventAction: \"Practice Completed\"; eventCategory: \"Practice\"; eventLabel: string };\r\n\r\ntype shopActions =\r\n | { eventAction: \"Purchase Started\"; eventCategory: \"Shop\"; eventLabel: string }\r\n | {\r\n eventAction: \"Purchase Completed\";\r\n eventCategory: \"Shop\";\r\n eventLabel: string;\r\n eventValue: number;\r\n };\r\n\r\nexport type userAction = userActions | feedbackActions | shopActions | lessonsActions | practiceActions;\r\n\r\nexport interface ITrackerContext {\r\n trackAction: (action: userAction) => void;\r\n}\r\n\r\nconst TrackerContext = React.createContext({} as any);\r\n\r\nexport const useTracker = () => useContext(TrackerContext);\r\n\r\ninterface ITrackerProviderProps {\r\n children: any;\r\n}\r\n\r\nexport const TrackerProvider = ({ children }: ITrackerProviderProps) => {\r\n const store = useGlobalStore();\r\n const { isAuthenticated, profile } = useAuth0();\r\n const { pathname } = useLocation();\r\n\r\n const tagManagerArgs = {\r\n gtmId: store.settings?.GoogleTagManager ?? \"\",\r\n auth: store.settings?.GoogleTagManagerAuth ?? \"\",\r\n };\r\n\r\n useEffect(() => {\r\n if (tagManagerArgs.gtmId) TagManager.initialize(tagManagerArgs);\r\n }, []);\r\n\r\n useEffect(() => {\r\n trackPage(pathname);\r\n }, [pathname]);\r\n\r\n useEffect(() => {\r\n if (isAuthenticated && profile) {\r\n let prof = getUserData();\r\n track(prof);\r\n\r\n if (prof.user_logins_count === \"1\") {\r\n trackAction({ eventAction: \"Signed Up\", eventCategory: \"User\" });\r\n } else {\r\n trackAction({ eventAction: \"Signed In\", eventCategory: \"User\" });\r\n }\r\n }\r\n }, [isAuthenticated, profile]);\r\n\r\n const track = (data: Object) => {\r\n TagManager.dataLayer({\r\n dataLayer: data,\r\n });\r\n };\r\n\r\n const getUserData = () => {\r\n let createdat = Math.round(new Date(profile.created_at).getTime() / 1000);\r\n return {\r\n user_id: profile.user_id,\r\n user_name: profile.name,\r\n user_email: profile.email,\r\n user_logins_count: (profile as any).logins_count,\r\n user_created_at: profile.created_at,\r\n user_created_at_unix: createdat,\r\n user_app_version: store.appVersion,\r\n };\r\n };\r\n\r\n const trackPage = (path: string) => {\r\n track({\r\n event: \"pageView\",\r\n view_path: pathname,\r\n view_url: window.location.href,\r\n });\r\n };\r\n const trackAction = (action: userAction) => {\r\n let eventId = action.eventAction.replace(\" \", \"_\").toLowerCase();\r\n track({\r\n event: \"user_action\",\r\n eventId,\r\n ...action,\r\n });\r\n };\r\n\r\n return {children};\r\n};\r\n","import React from \"react\";\r\nimport ReactPlayer from \"react-player\";\r\nimport { Grid } from \"@material-ui/core\";\r\n\r\ninterface IVideoPlayerProps {\r\n videoUrl: string;\r\n thumbnailUrl?: string;\r\n onStart?: () => void;\r\n onProgress?: (played: number) => void;\r\n}\r\n\r\nexport const VideoPlayer = ({ videoUrl, thumbnailUrl, onStart, onProgress }: IVideoPlayerProps) => {\r\n const handleOnStart = () => {\r\n if (onStart) onStart();\r\n };\r\n\r\n const handleOnProgress = (played: number) => {\r\n if (onProgress) onProgress(played);\r\n };\r\n\r\n return (\r\n \r\n \r\n e.preventDefault(),\r\n },\r\n },\r\n }}\r\n onStart={handleOnStart}\r\n onProgress={(state) => handleOnProgress(state.played)}\r\n />\r\n \r\n \r\n );\r\n};\r\n","import React from \"react\";\r\nimport { Card, CardContent, Grid, CardActions, Typography, Button, useTheme } from \"@material-ui/core\";\r\nimport { useTracker } from \"../../../analytics/trackerContext\";\r\nimport { VideoPlayer } from \"../../../components/VideoPlayer/VideoPlayerComponent\";\r\nimport { LessonViewModel } from \"../../../models/preplabModels\";\r\n\r\ninterface ILessonVideoProps {\r\n lesson: LessonViewModel;\r\n getAccess: Function;\r\n}\r\nexport const LessonVideoComponent = (props: ILessonVideoProps) => {\r\n let { lesson, getAccess } = props;\r\n\r\n let watched = {\r\n reached25: false,\r\n reached50: false,\r\n reached75: false,\r\n };\r\n\r\n const theme = useTheme();\r\n\r\n const cardStyle = {\r\n maxWidth: theme.breakpoints.width(\"md\"),\r\n };\r\n\r\n const tracker = useTracker();\r\n\r\n const trackProgress = (played: number) => {\r\n if (played >= 0.25 && !watched.reached25) {\r\n tracker.trackAction({\r\n eventAction: \"Played 25%\",\r\n eventCategory: \"Lesson\",\r\n eventLabel: lesson.Title ?? \"titlenotset\",\r\n });\r\n\r\n watched = { reached25: true, reached50: false, reached75: false };\r\n } else if (played >= 0.5 && !watched.reached50) {\r\n tracker.trackAction({\r\n eventAction: \"Played 50%\",\r\n eventCategory: \"Lesson\",\r\n eventLabel: lesson.Title ?? \"titlenotset\",\r\n });\r\n\r\n watched = { reached25: true, reached50: true, reached75: false };\r\n } else if (played >= 0.75 && !watched.reached75) {\r\n tracker.trackAction({\r\n eventAction: \"Played 75%\",\r\n eventCategory: \"Lesson\",\r\n eventLabel: lesson.Title ?? \"titlenotset\",\r\n });\r\n watched = { reached25: true, reached50: true, reached75: true };\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n \r\n \r\n {lesson.HaveAccess && lesson.VideoContent && (\r\n \r\n tracker.trackAction({\r\n eventAction: \"Play\",\r\n eventCategory: \"Lesson\",\r\n eventLabel: lesson.Title ?? \"titlenotset\",\r\n })\r\n }\r\n onProgress={(played) => {\r\n trackProgress(played);\r\n }}\r\n />\r\n )}\r\n {lesson.HaveAccess && lesson.Thumbnail && !lesson.VideoContent && (\r\n {lesson.Name}\r\n )}\r\n {!lesson.HaveAccess && (\r\n \r\n \r\n \r\n {lesson.Title}\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n \r\n {!lesson.HaveAccess && (\r\n \r\n Get Access to this video\r\n \r\n )}\r\n {lesson.HaveAccess && (\r\n
\r\n \r\n {lesson.Title}\r\n \r\n \r\n
\r\n )}\r\n
\r\n
\r\n \r\n );\r\n};\r\n","import React, { useEffect } from \"react\";\r\nimport { Grid, Typography } from \"@material-ui/core\";\r\nimport { ProgressComponent } from \"../../../components/Shared/Progress/ProgressComponent\";\r\nimport { ErrorComponent } from \"../../error/ErrorComponent\";\r\nimport { LessonVideoComponent } from \"./LessonVideoComponent\";\r\nimport { useHistory, useParams } from \"react-router-dom\";\r\nimport { useGetLesson } from \"../../../services/lessons.service\";\r\nimport { StoreActions, useGlobalStoreDispatch } from \"../../../storage/GlobalStoreContext\";\r\nimport { FetchStatus } from \"../../../services/useFetchApiData\";\r\n\r\ninterface ILessonProps {}\r\n\r\nexport const LessonPlayContainer = () => {\r\n let history = useHistory();\r\n let { id } = useParams<{ id: string }>();\r\n\r\n let param = id ? id : \"\";\r\n const [status, error, data] = useGetLesson(param);\r\n\r\n const dispatch = useGlobalStoreDispatch();\r\n\r\n useEffect(() => {\r\n dispatch({ type: StoreActions.SetPageTitle, payload: \"Play\" });\r\n }, [dispatch]);\r\n\r\n const getAccess = () => {\r\n history.push(\"/shop\");\r\n };\r\n\r\n return (\r\n <>\r\n \r\n {status === FetchStatus.Loading ? (\r\n \r\n ) : status === FetchStatus.Error ? (\r\n \r\n ) : (\r\n \r\n \r\n {data && (\r\n \r\n \r\n \r\n )}\r\n {!data && (\r\n \r\n \r\n No lesson found\r\n \r\n \r\n )}\r\n \r\n \r\n )}\r\n \r\n \r\n );\r\n};\r\n","import { LessonsViewModel, LessonViewModel } from \"./../models/preplabModels\";\r\nimport { useFetchApiData } from \"./useFetchApiData\";\r\n\r\nexport const useGetLesson = (id: string) => {\r\n var url = \"/api/Lessons/GetLesson?lessonId=\" + id;\r\n return useFetchApiData(url);\r\n};\r\n\r\nexport const useGetLessons = (categoryId: string) => {\r\n var url = \"/api/Lessons/GetLessons\";\r\n if (categoryId) {\r\n url += \"?categoryId=\" + categoryId;\r\n }\r\n\r\n return useFetchApiData(url);\r\n};\r\n","import React from \"react\";\r\nimport {\r\n Card,\r\n CardMedia,\r\n CardContent,\r\n CardActions,\r\n Typography,\r\n Button,\r\n makeStyles,\r\n Theme,\r\n createStyles,\r\n CardActionArea,\r\n Divider,\r\n} from \"@material-ui/core\";\r\nimport PlayCircleOutlineIcon from \"@material-ui/icons/PlayCircleOutline\";\r\nimport ShopOutlinedIcon from \"@material-ui/icons/ShopOutlined\";\r\nimport { LessonsLessonViewModel } from \"../../models/preplabModels\";\r\n\r\nconst useStyles: any = makeStyles((theme: Theme) =>\r\n createStyles({\r\n card: {\r\n height: \"100%\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n justifyContent: \"space-between\",\r\n },\r\n }),\r\n);\r\n\r\ninterface ILessonProps {\r\n lesson: LessonsLessonViewModel;\r\n getAccess: () => void;\r\n goToDetails: (lessonId: string) => void;\r\n}\r\nexport const LessonItemComponent = (props: ILessonProps) => {\r\n let { lesson, getAccess, goToDetails } = props;\r\n\r\n const classes = useStyles();\r\n\r\n const createMarkup = (markup: string | undefined) => {\r\n return { __html: markup ? markup : \"\" };\r\n };\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {!lesson.HaveAccess && (\r\n }\r\n >\r\n Get Access\r\n \r\n )}\r\n {lesson.HaveAccess && (\r\n }\r\n >\r\n Play\r\n \r\n )}\r\n \r\n \r\n \r\n );\r\n};\r\n","import React from \"react\";\r\nimport {\r\n Grid,\r\n Typography,\r\n MenuItem,\r\n Select,\r\n FormControl,\r\n InputLabel,\r\n makeStyles,\r\n createStyles,\r\n Theme,\r\n} from \"@material-ui/core\";\r\nimport { ProgressComponent } from \"../../components/Shared/Progress/ProgressComponent\";\r\nimport { LessonItemComponent } from \"./LessonItemComponent\";\r\nimport { ErrorComponent } from \"../error/ErrorComponent\";\r\nimport { useState, useEffect } from \"react\";\r\nimport { useHistory } from \"react-router\";\r\nimport { useGetLessons } from \"../../services/lessons.service\";\r\nimport { StoreActions, useGlobalStoreDispatch } from \"../../storage/GlobalStoreContext\";\r\nimport { FetchStatus } from \"../../services/useFetchApiData\";\r\nimport { LessonsCategoryViewModel, LessonsLessonViewModel } from \"../../models/preplabModels\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n formControl: {\r\n margin: theme.spacing(1),\r\n minWidth: 120,\r\n },\r\n selectEmpty: {\r\n marginTop: theme.spacing(2),\r\n },\r\n }),\r\n);\r\n\r\nexport const LessonsContainer = () => {\r\n const classes = useStyles();\r\n const [categoryId, setCategoryId] = useState(\"00000000-0000-0000-0000-000000000000\");\r\n\r\n const history = useHistory();\r\n\r\n const dispatch = useGlobalStoreDispatch();\r\n const [status, error, data] = useGetLessons(categoryId);\r\n\r\n useEffect(() => {\r\n dispatch({ type: StoreActions.SetPageTitle, payload: \"Lessons\" });\r\n }, [dispatch]);\r\n\r\n function getAccess() {\r\n history.push(\"/shop\");\r\n }\r\n function goToDetails(id: string) {\r\n history.push(\"/lessons/play/\" + id);\r\n }\r\n function changeFilterCategory(event: any) {\r\n setCategoryId(event.target.value as string);\r\n }\r\n\r\n return (\r\n <>\r\n \r\n {status === FetchStatus.Loading ? (\r\n \r\n ) : status === FetchStatus.Error ? (\r\n \r\n ) : (\r\n <>\r\n \r\n {data?.Categories && data.Categories.length > 0 && (\r\n \r\n Category\r\n \r\n All\r\n {data.Categories.map((category: LessonsCategoryViewModel) => (\r\n \r\n {category.Name}\r\n \r\n ))}\r\n \r\n \r\n )}\r\n \r\n \r\n \r\n {data?.Lessons &&\r\n data.Lessons.map((lesson: LessonsLessonViewModel) => (\r\n \r\n \r\n \r\n ))}\r\n {(!data?.Lessons || data.Lessons.length === 0) && (\r\n \r\n \r\n No lessons are available yet, in mean time why not do couple of practice\r\n rounds.\r\n \r\n \r\n )}\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n );\r\n};\r\n","import React from \"react\";\r\nimport {\r\n Card,\r\n Grid,\r\n Typography,\r\n Button,\r\n CardActions,\r\n Select,\r\n CircularProgress,\r\n FormControl,\r\n MenuItem,\r\n InputLabel,\r\n Accordion,\r\n AccordionSummary,\r\n AccordionDetails,\r\n} from \"@material-ui/core\";\r\n\r\nimport { Save } from \"@material-ui/icons\";\r\nimport { useState } from \"react\";\r\nimport ExpandMoreIcon from \"@material-ui/icons/ExpandMore\";\r\nimport { UserSettingsViewModel, UserCategorySettingsViewModel } from \"../../models/preplabModels\";\r\n\r\ninterface IPracticeCategorySettingsComponentProps {\r\n userSettings: UserSettingsViewModel;\r\n processing: boolean;\r\n saveUserSettings: (settings: UserSettingsViewModel) => void;\r\n}\r\nexport const PracticeCategorySettingsComponent = (props: IPracticeCategorySettingsComponentProps) => {\r\n const { userSettings, processing, saveUserSettings } = props;\r\n\r\n const [settings, setSettings] = useState(userSettings);\r\n\r\n const progressStyle = {\r\n position: \"absolute\" as \"absolute\",\r\n top: \"50%\",\r\n left: \"50%\",\r\n marginTop: -12,\r\n marginLeft: -12,\r\n };\r\n\r\n const languageFormStyle = {\r\n marginRight: 10,\r\n };\r\n\r\n const handleLanguageChange = (categoryId: string, value: string) => {\r\n var catSetting = settings.CategoriesSettings.filter(\r\n (x: UserCategorySettingsViewModel) => x.CategoryId === categoryId,\r\n );\r\n\r\n if (catSetting.length > 0) {\r\n catSetting[0].SelectedLanguage = value;\r\n\r\n setSettings((oldValues) => ({ ...oldValues, catSetting }));\r\n }\r\n };\r\n\r\n const handleQuestionLimitChange = (categoryId: string, value: number) => {\r\n var catSetting = settings.CategoriesSettings.filter(\r\n (x: UserCategorySettingsViewModel) => x.CategoryId === categoryId,\r\n );\r\n\r\n if (catSetting.length > 0) {\r\n catSetting[0].QuestionsLimit = value;\r\n\r\n setSettings((oldValues) => ({ ...oldValues, catSetting }));\r\n }\r\n };\r\n\r\n const saveSettings = (event: any) => {\r\n event.preventDefault();\r\n saveUserSettings(settings);\r\n };\r\n\r\n return (\r\n <>\r\n {userSettings.CategoriesSettings &&\r\n userSettings.CategoriesSettings.map((categorySettings, index) => (\r\n \r\n }>\r\n {categorySettings.Name}\r\n \r\n \r\n \r\n \r\n \r\n \r\n Language\r\n \r\n \r\n handleLanguageChange(\r\n categorySettings.CategoryId,\r\n e.target.value as string,\r\n )\r\n }\r\n >\r\n {categorySettings.AvailableLanguages.map((lang) => (\r\n \r\n {lang.Name}\r\n \r\n ))}\r\n \r\n \r\n \r\n \r\n \r\n \r\n Questions per session\r\n \r\n \r\n handleQuestionLimitChange(\r\n categorySettings.CategoryId,\r\n e.target.value as number,\r\n )\r\n }\r\n >\r\n {categorySettings.AvailableQuestionsLimit.map((limit) => (\r\n \r\n {limit}\r\n \r\n ))}\r\n \r\n \r\n \r\n \r\n \r\n \r\n ))}\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","/* tslint:disable */\r\n/* eslint-disable */\r\n//----------------------\r\n// \r\n// Generated using the NSwag toolchain v13.8.2.0 (NJsonSchema v10.2.1.0 (Newtonsoft.Json v12.0.0.0)) (http://NSwag.org)\r\n// \r\n//----------------------\r\n// ReSharper disable InconsistentNaming\r\n\r\nexport interface InsightsViewModel {\r\n OverallPercentile: number;\r\n AvgCorrect: number;\r\n Categories: InsightCategoryViewModel[];\r\n}\r\n\r\nexport interface InsightCategoryViewModel {\r\n Percentile: number;\r\n AvgCorrect: number;\r\n OtherUsers: number;\r\n UniqueQuestions: number;\r\n Name: string;\r\n Color: string;\r\n Id: string;\r\n Sessions: InsightSessionsViewModel[];\r\n}\r\n\r\nexport interface InsightSessionsViewModel {\r\n SessionId: string;\r\n Date: Date;\r\n Result: number;\r\n}\r\n\r\nexport interface LessonsViewModel {\r\n Lessons: LessonsLessonViewModel[];\r\n Categories: LessonsCategoryViewModel[];\r\n}\r\n\r\nexport interface LessonsLessonViewModel {\r\n Id: string;\r\n CategoryId: string;\r\n Modified: Date;\r\n Name: string;\r\n HaveAccess: boolean;\r\n Thumbnail: string;\r\n Title: string;\r\n Description: string;\r\n VideoContent: string;\r\n Tags: LessonsLesonTagViewModel[];\r\n}\r\n\r\nexport interface LessonsLesonTagViewModel {\r\n Id: string;\r\n Name: string;\r\n}\r\n\r\nexport interface LessonsCategoryViewModel {\r\n Id: string;\r\n Name: string;\r\n}\r\n\r\nexport interface LessonViewModel {\r\n Id: string;\r\n CategoryId: string;\r\n Modified: Date;\r\n Name: string;\r\n HaveAccess: boolean;\r\n Thumbnail: string;\r\n Title: string;\r\n Description: string;\r\n VideoContent: string;\r\n Tags: LessonTag[];\r\n}\r\n\r\nexport interface LessonTag {\r\n Id: string;\r\n Name: string;\r\n}\r\n\r\nexport interface TenantSettingsViewModel {\r\n GoogleTagManager: string;\r\n GoogleTagManagerAuth: string;\r\n AppName: string;\r\n PolicyUrl: string;\r\n PrimaryPalette: string;\r\n SecondaryPalette: string;\r\n BrowserThemeColor: string;\r\n ImageRootPath: string;\r\n Logo: string;\r\n Auth0Logo: string;\r\n Auth0ClientId: string;\r\n Auth0Domain: string;\r\n PayPalPublicKey: string;\r\n StripePublicKey: string;\r\n StripeCurrency: string;\r\n IsProduction: boolean;\r\n TenantId: string;\r\n}\r\n\r\nexport interface ProblemDetails {\r\n Type: string;\r\n Title: string;\r\n Status: number | undefined;\r\n Detail: string;\r\n Instance: string;\r\n Extensions: { [key: string]: any };\r\n}\r\n\r\nexport interface UserPackageViewModel {\r\n Categories: UserPackageCategoryViewModel[];\r\n}\r\n\r\nexport interface UserPackageCategoryViewModel {\r\n Id: string;\r\n Name: string;\r\n Color: string;\r\n PreferedLanguage: string;\r\n AlreadyHave: boolean;\r\n Percentile: number;\r\n CanPracticeWeaknesses: boolean;\r\n AvaliableQuestions: number;\r\n}\r\n\r\nexport interface PackagesViewModel {\r\n Packages: PackageViewModel[];\r\n}\r\n\r\nexport interface PackageViewModel {\r\n PackageId: string;\r\n Name: string;\r\n Description: string;\r\n AlreadyHave: boolean;\r\n Left: string;\r\n Subscriptions: SubscriptionViewModel[];\r\n}\r\n\r\nexport interface SubscriptionViewModel {\r\n Duration: string;\r\n Price: string;\r\n Description: string;\r\n Currency: string;\r\n}\r\n\r\nexport interface TransactionViewModel {\r\n IsCompleted: boolean;\r\n Created: string;\r\n TransactionId: string;\r\n Name: string;\r\n Description: string;\r\n Duration: string;\r\n Amount: number;\r\n Currency: string;\r\n Provider: string;\r\n}\r\n\r\nexport interface StartTestSessionViewModel {\r\n Id: string;\r\n Categories: SessionResultCategoryViewModel[];\r\n}\r\n\r\nexport interface SessionResultCategoryViewModel {\r\n Id: string;\r\n Order: number;\r\n DisplayName: string;\r\n CategoryColor: string;\r\n IsSingleCorrect: boolean;\r\n MaxTotalTimeS: number;\r\n MaxQuestionTimeS: number;\r\n CorrectNormalized: number;\r\n UnansweredNormalized: number;\r\n TotalTimeSpentS: number;\r\n Questions: SessionResultQuestionViewModel[];\r\n}\r\n\r\nexport interface SessionResultQuestionViewModel {\r\n Id: string;\r\n Order: number;\r\n IsSingleCorrect: boolean;\r\n Title: string;\r\n Name: string;\r\n Body: string;\r\n Image: string;\r\n MostEffectiveAnswer: string;\r\n LessEffectiveAnswer: string;\r\n TimeSpentMs: number;\r\n Percent: number;\r\n State: QuestionAnswerState;\r\n IsAnswered: boolean;\r\n IsViewed: boolean;\r\n AvgDuration: number;\r\n Options: SessionResultOptionViewModel[];\r\n}\r\n\r\nexport enum QuestionAnswerState {\r\n Incorrect = 0,\r\n Correct = 1,\r\n Partial = 2,\r\n}\r\n\r\nexport interface SessionResultOptionViewModel {\r\n Id: string;\r\n Order: number;\r\n Text: string;\r\n Explanation: string;\r\n ExplanationVideo: string;\r\n LeastEffectiveState: QuestionAnswerState;\r\n MostEffectiveState: QuestionAnswerState;\r\n IsSelectedLess: boolean;\r\n IsSelectedMost: boolean;\r\n}\r\n\r\nexport interface StartTestSessionCommand {\r\n TestSessionType: TestSessionType;\r\n CategoryIds: string[];\r\n}\r\n\r\nexport enum TestSessionType {\r\n NotSet = 0,\r\n Practice = 1,\r\n Exam = 2,\r\n Weaknesses = 3,\r\n}\r\n\r\nexport interface CloseTestSessionCommand {\r\n SessionId: string;\r\n Questions: CloseTestSessionCommandQuestion[];\r\n}\r\n\r\nexport interface CloseTestSessionCommandQuestion {\r\n Id: string;\r\n Duration: number;\r\n LessEffectiveAnswer: string;\r\n MostEffectiveAnswer: string;\r\n}\r\n\r\nexport interface SessionResultViewModel {\r\n Id: string;\r\n SessionType: TestSessionType;\r\n CorrectNormalized: number;\r\n UnansweredNormalized: number;\r\n TotalTimeSpentS: number;\r\n Categories: SessionResultCategoryViewModel[];\r\n}\r\n\r\nexport interface SendQuestionFeedbackCommand {\r\n QuestionId: string;\r\n FeedbackMessage: string;\r\n}\r\n\r\nexport interface TimelineViewModel {\r\n Items: TimelineItemViewModel[];\r\n}\r\n\r\nexport interface TimelineItemViewModel {\r\n Id: string;\r\n ActivityContextId: UserActivityContext;\r\n ActivityContext: string;\r\n ActivityType: TestSessionType;\r\n Created: string;\r\n TotalCorrectNormalized: number;\r\n TotalTimeSpentMs: number;\r\n TestSessionCategories: TimelineTestSessionCategoryViewModel[];\r\n}\r\n\r\nexport enum UserActivityContext {\r\n None = 0,\r\n TestSession = 1,\r\n}\r\n\r\nexport interface TimelineTestSessionCategoryViewModel {\r\n CategoryName: string;\r\n CategoryColor: string;\r\n CorrectNormalized: number;\r\n}\r\n\r\nexport interface UserSettingsViewModel {\r\n CategoriesSettings: UserCategorySettingsViewModel[];\r\n}\r\n\r\nexport interface UserCategorySettingsViewModel {\r\n CategoryId: string;\r\n Name: string;\r\n SelectedLanguage: string;\r\n QuestionsLimit: number;\r\n AvailableLanguages: LanguageViewModel[];\r\n AvailableQuestionsLimit: number[];\r\n}\r\n\r\nexport interface LanguageViewModel {\r\n Name: string;\r\n Code: string;\r\n}\r\n\r\nexport interface SaveUserSettingsCommand {\r\n CategoriesSettings: UserCategorySettingsViewModel2[];\r\n}\r\n\r\nexport interface UserCategorySettingsViewModel2 {\r\n CategoryId: string;\r\n SelectedLanguage: string;\r\n QuestionsLimit: number;\r\n}\r\n\r\nexport interface VersionViewModel {\r\n Version: string;\r\n Environment: string;\r\n Description: string;\r\n}\r\n\r\nexport interface PayPalCreateOrderCommand {\r\n PackageId: string;\r\n Amount: number;\r\n Name: string;\r\n Description: string;\r\n}\r\n\r\nexport interface PayPalProcessOrderCommand {\r\n PackageId: string;\r\n Name: string;\r\n Description: string;\r\n Duration: number;\r\n Amount: number;\r\n OrderId: string;\r\n}\r\n\r\nexport interface StripeCreateCheckoutSessionCommand {\r\n PackageId: string;\r\n Name: string;\r\n Description: string;\r\n Duration: number;\r\n Amount: number;\r\n SuccessUrl: string;\r\n CancelUrl: string;\r\n}\r\n","import React, { useEffect } from \"react\";\r\nimport { Grid, Typography } from \"@material-ui/core\";\r\nimport { ProgressComponent } from \"../../components/Shared/Progress/ProgressComponent\";\r\nimport { PracticeCategorySettingsComponent } from \"./PracticeCategorySettingsComponent\";\r\nimport { ErrorComponent } from \"../error/ErrorComponent\";\r\nimport { useGetUserSettings, useSaveUserSettings } from \"../../services/userSettings.service\";\r\nimport { StoreActions, useGlobalStore, useGlobalStoreDispatch } from \"../../storage/GlobalStoreContext\";\r\nimport { FetchStatus } from \"../../services/useFetchApiData\";\r\nimport { SaveUserSettingsCommand, UserSettingsViewModel } from \"../../models/preplabModels\";\r\nimport { PostState } from \"../../services/useFetchPostApiData\";\r\n\r\nexport const SettingsContainer = () => {\r\n const [status, error, userSettings] = useGetUserSettings();\r\n const [response, saveSettings] = useSaveUserSettings();\r\n\r\n const store = useGlobalStore();\r\n const dispatch = useGlobalStoreDispatch();\r\n\r\n useEffect(() => {\r\n dispatch({ type: StoreActions.SetPageTitle, payload: \"My Settings\" });\r\n }, [dispatch]);\r\n\r\n const saveUserSettings = (settings: UserSettingsViewModel) => {\r\n const command: SaveUserSettingsCommand = {\r\n CategoriesSettings: settings.CategoriesSettings,\r\n };\r\n saveSettings(command);\r\n };\r\n\r\n return (\r\n <>\r\n \r\n {status === FetchStatus.Loading ? (\r\n \r\n ) : status === FetchStatus.Error ? (\r\n \r\n ) : (\r\n <>\r\n {userSettings && (\r\n \r\n \r\n Practice settings\r\n \r\n\r\n \r\n \r\n )}\r\n \r\n \r\n App Version: {store.appVersion}\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n );\r\n};\r\n","import { useFetchPostApiData } from \"./useFetchPostApiData\";\r\nimport { SaveUserSettingsCommand, UserSettingsViewModel } from \"./../models/preplabModels\";\r\nimport { useFetchApiData } from \"./useFetchApiData\";\r\n\r\nexport const useGetUserSettings = () => {\r\n return useFetchApiData(\"/api/UserSettings/GetUserSettings\");\r\n};\r\n\r\nexport const useSaveUserSettings = () => {\r\n return useFetchPostApiData(\"/api/UserSettings/SaveUserSettings\");\r\n};\r\n","import React from \"react\";\r\nimport { Tooltip, Button } from \"@material-ui/core\";\r\n\r\nexport const PracticeButton: React.FC<{\r\n tooltip?: string;\r\n disabled?: boolean;\r\n onClick: () => void;\r\n}> = ({ tooltip, disabled, onClick, children }) => {\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import React from \"react\";\r\nimport { Card, CardContent, Grid, Typography, Button, CardActions } from \"@material-ui/core\";\r\nimport { PracticeButton } from \"./PracticeButton\";\r\nimport { TestSessionType, UserPackageCategoryViewModel } from \"../../models/preplabModels\";\r\n\r\ninterface IPracticeCategoryComponentProps {\r\n category: UserPackageCategoryViewModel;\r\n selectItem: (mode: TestSessionType, category: UserPackageCategoryViewModel) => void;\r\n buyItem?: (category: UserPackageCategoryViewModel) => void;\r\n}\r\nexport const PracticeCategoryComponent = ({ category, selectItem, buyItem }: IPracticeCategoryComponentProps) => {\r\n const handleBuyItem = (cat: UserPackageCategoryViewModel): void => {\r\n if (buyItem) {\r\n buyItem(cat);\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n {category.Name}\r\n \r\n {category.AvaliableQuestions > 0 && (\r\n \r\n {category.AvaliableQuestions} questions avaliable\r\n \r\n )}\r\n \r\n {category && (\r\n \r\n \r\n {category.Percentile} %\r\n \r\n \r\n Your Percentile\r\n \r\n \r\n )}\r\n \r\n \r\n \r\n \r\n {category.AlreadyHave && (\r\n \r\n selectItem(TestSessionType.Practice, category)}\r\n >\r\n Practice\r\n \r\n \r\n )}\r\n\r\n {category.AlreadyHave && (\r\n \r\n selectItem(TestSessionType.Weaknesses, category)}\r\n >\r\n Weaknesses\r\n \r\n \r\n )}\r\n\r\n {category.AlreadyHave && (\r\n \r\n selectItem(TestSessionType.Exam, category)}\r\n >\r\n Exam\r\n \r\n \r\n )}\r\n {!category.AlreadyHave && (\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import React from \"react\";\r\nimport { Grid, Card, CardContent, Typography, CardActions } from \"@material-ui/core\";\r\nimport Button from \"@material-ui/core/Button\";\r\nimport Dialog from \"@material-ui/core/Dialog\";\r\nimport DialogActions from \"@material-ui/core/DialogActions\";\r\nimport DialogContent from \"@material-ui/core/DialogContent\";\r\nimport DialogTitle from \"@material-ui/core/DialogTitle\";\r\nimport FormControlLabel from \"@material-ui/core/FormControlLabel\";\r\nimport Checkbox from \"@material-ui/core/Checkbox\";\r\nimport { PracticeButton } from \"./PracticeButton\";\r\nimport { TestSessionType, UserPackageCategoryViewModel } from \"../../models/preplabModels\";\r\n\r\ninterface IPracticeMultipleComponentProps {\r\n selectItem: (mode: TestSessionType) => void;\r\n}\r\n\r\nexport const PracticeMultipleComponent = ({ selectItem }: IPracticeMultipleComponentProps) => {\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n Combine categories\r\n \r\n \r\n Cover multiple areas in single practice session\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n selectItem(TestSessionType.Practice)}\r\n >\r\n Practice\r\n \r\n \r\n\r\n \r\n selectItem(TestSessionType.Weaknesses)}\r\n >\r\n Weaknesses\r\n \r\n \r\n\r\n \r\n selectItem(TestSessionType.Exam)}>\r\n Exam\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\ninterface IPracticeMultipleSelectorDialogProps {\r\n categories: Array;\r\n testsessiontype: TestSessionType;\r\n open: boolean;\r\n selectItems: (categories: Array) => void;\r\n onClose: () => void;\r\n}\r\n\r\nexport const PracticeMultipleSelectorDialog = ({\r\n categories,\r\n testsessiontype,\r\n open,\r\n selectItems,\r\n onClose,\r\n}: IPracticeMultipleSelectorDialogProps) => {\r\n let selectedCategories = [] as Array;\r\n\r\n const handleStart = () => {\r\n selectItems(selectedCategories);\r\n };\r\n\r\n const handleClose = () => onClose();\r\n\r\n const handleChange = (category: UserPackageCategoryViewModel, checked: boolean) => {\r\n if (checked) {\r\n selectedCategories = selectedCategories.concat(category);\r\n } else {\r\n let index = selectedCategories.findIndex((cat) => cat.Id === category.Id);\r\n\r\n if (index > -1) {\r\n selectedCategories.splice(index, 1);\r\n }\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n \r\n Select one or more categories\r\n \r\n \r\n {categories &&\r\n categories.map((category: UserPackageCategoryViewModel) => (\r\n \r\n handleChange(category, event.target.checked)}\r\n />\r\n }\r\n label={category.Name}\r\n />\r\n \r\n ))}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import React from \"react\";\r\nimport { Typography, Button } from \"@material-ui/core\";\r\nimport PlayCircleOutlineIcon from \"@material-ui/icons/PlayCircleOutline\";\r\n\r\ninterface IOptionExplanation {\r\n explanation: string;\r\n explanationVideo: string;\r\n openVideo?: () => void;\r\n}\r\n\r\nexport const OptionExplanation = ({ explanation, explanationVideo, openVideo }: IOptionExplanation) => {\r\n const createMarkup = (markup: string | undefined) => {\r\n return { __html: markup ? markup : \"\" };\r\n };\r\n\r\n const handleOpenVideo = () => openVideo?.(); //Check if not undefined\r\n\r\n let hasExplanationText = !!explanation;\r\n let hasExplanationVideo = !!explanationVideo;\r\n\r\n return (\r\n <>\r\n {hasExplanationText && (\r\n <>\r\n Explanation\r\n \r\n \r\n )}\r\n\r\n {hasExplanationVideo && (\r\n }\r\n >\r\n Watch the explanation video\r\n \r\n )}\r\n \r\n );\r\n};\r\n","import React from \"react\";\r\nimport {\r\n List,\r\n ListItem,\r\n ListItemText,\r\n Divider,\r\n ListItemIcon,\r\n Typography,\r\n Radio,\r\n makeStyles,\r\n createStyles,\r\n Theme,\r\n} from \"@material-ui/core\";\r\nimport { green, red, yellow } from \"@material-ui/core/colors\";\r\n\r\nimport WrongIcon from \"@material-ui/icons/ClearOutlined\";\r\nimport WrongSelectedIcon from \"@material-ui/icons/CancelOutlined\";\r\n\r\nimport CorrectSelectedIcon from \"@material-ui/icons/CheckCircleOutlined\";\r\nimport CorrectIcon from \"@material-ui/icons/CheckOutlined\";\r\nimport { OptionExplanation } from \"./OptionExplanation\";\r\nimport { SessionResultOptionViewModel } from \"../../../models/preplabModels\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n radioDefault: {},\r\n\r\n radioIncorrect: {\r\n color: red[700],\r\n \"&$checked\": {\r\n color: red[500],\r\n },\r\n },\r\n radioCorrect: {\r\n color: green[700],\r\n \"&$checked\": {\r\n color: green[500],\r\n },\r\n },\r\n\r\n radioPartial: {\r\n color: yellow[400],\r\n \"&$checked\": {\r\n color: yellow[500],\r\n },\r\n },\r\n\r\n checked: {},\r\n }),\r\n);\r\n\r\ninterface ISingleOptionItemProp {\r\n option: SessionResultOptionViewModel;\r\n selected: boolean;\r\n isExplanationMode?: boolean;\r\n onPlayVideo?: (url: string) => void;\r\n onSelected: (optionId: string) => void;\r\n}\r\n\r\nconst SingleOptionItem = ({ option, isExplanationMode, selected, onPlayVideo, onSelected }: ISingleOptionItemProp) => {\r\n const classes = useStyles();\r\n\r\n const getResultIcon = (sel: boolean, res: SessionResultOptionViewModel) => {\r\n if (!isExplanationMode) {\r\n return <>;\r\n }\r\n\r\n switch (res.MostEffectiveState) {\r\n case 0:\r\n return sel === true ? (\r\n \r\n ) : (\r\n \r\n );\r\n case 1:\r\n return sel === true ? (\r\n \r\n ) : (\r\n \r\n );\r\n default:\r\n return <>;\r\n }\r\n };\r\n\r\n const getColor = (res: SessionResultOptionViewModel) => {\r\n if (!isExplanationMode) return classes.radioDefault;\r\n\r\n switch (res.MostEffectiveState) {\r\n case 0:\r\n return classes.radioIncorrect;\r\n case 1:\r\n return classes.radioCorrect;\r\n case 2:\r\n return classes.radioPartial;\r\n default:\r\n return classes.radioDefault;\r\n }\r\n };\r\n\r\n const handleOpenVideo = () => {\r\n if (onPlayVideo && option.ExplanationVideo) onPlayVideo(option.ExplanationVideo);\r\n };\r\n\r\n return (\r\n <>\r\n {\r\n onSelected(option.Id);\r\n }}\r\n >\r\n \r\n {isExplanationMode ? (\r\n getResultIcon(selected, option)\r\n ) : (\r\n \r\n )}\r\n \r\n \r\n {option.Text}\r\n\r\n {isExplanationMode && (\r\n \r\n )}\r\n \r\n \r\n \r\n );\r\n};\r\n\r\ninterface ISingleOptionSelectionListProps {\r\n options: SessionResultOptionViewModel[];\r\n mostEffectiveAnswerId: string;\r\n isExplanationMode: boolean;\r\n onPlayVideo?: (url: string) => void;\r\n onSelect: (oId: string) => void;\r\n}\r\n\r\nexport const SingleOptionSelectionList = ({\r\n options,\r\n isExplanationMode,\r\n mostEffectiveAnswerId,\r\n onPlayVideo,\r\n onSelect,\r\n}: ISingleOptionSelectionListProps) => {\r\n const handleListItemClick = (oId: string) => {\r\n onSelect(oId);\r\n };\r\n\r\n return (\r\n <>\r\n \r\n {options.map((item, index) => (\r\n \r\n \r\n {options[index + 1] ? : \"\"}\r\n \r\n ))}\r\n \r\n \r\n );\r\n};\r\n","import React from \"react\";\r\nimport {\r\n Typography,\r\n Button,\r\n makeStyles,\r\n Theme,\r\n createStyles,\r\n List,\r\n Divider,\r\n ListItem,\r\n ListItemIcon,\r\n Checkbox,\r\n ListItemText,\r\n ListItemSecondaryAction,\r\n ButtonGroup,\r\n Box,\r\n} from \"@material-ui/core\";\r\n\r\nimport { green, red, yellow } from \"@material-ui/core/colors\";\r\nimport { OptionExplanation } from \"./OptionExplanation\";\r\nimport { SessionResultOptionViewModel } from \"../../../models/preplabModels\";\r\n\r\nconst useStyles: any = makeStyles((theme: Theme) =>\r\n createStyles({\r\n buttonDefault: {\r\n color: theme.palette.secondary.contrastText,\r\n backgroundColor: theme.palette.secondary.main,\r\n },\r\n buttonCorrectSelected: {\r\n color: theme.palette.getContrastText(green.A700),\r\n backgroundColor: green.A700,\r\n },\r\n buttonIncorrectSelected: {\r\n color: theme.palette.getContrastText(red.A700),\r\n backgroundColor: red.A700,\r\n },\r\n buttonPartialSelected: {\r\n color: theme.palette.getContrastText(yellow.A400),\r\n backgroundColor: yellow.A400,\r\n },\r\n buttonCorrectAnswer: {\r\n color: green.A700,\r\n borderColor: green.A700,\r\n },\r\n\r\n checked: {},\r\n }),\r\n);\r\n\r\ninterface IMostLeastOptionItemProps {\r\n option: SessionResultOptionViewModel;\r\n meSelected: boolean;\r\n leSelected: boolean;\r\n isExplanationMode: boolean;\r\n onSelected: (mostEffective: boolean, optionId: string) => void;\r\n onPlayVideo?: (url: string) => void;\r\n}\r\n\r\nexport const MostLeastOptionItem = ({\r\n option,\r\n isExplanationMode,\r\n meSelected,\r\n leSelected,\r\n onPlayVideo,\r\n onSelected,\r\n}: IMostLeastOptionItemProps) => {\r\n var classes = useStyles();\r\n\r\n const handleSelected = (mostEffective: boolean, id: string) => {\r\n if (onSelected) {\r\n onSelected(mostEffective, id);\r\n }\r\n };\r\n\r\n const getButtonColor = (selected: boolean, effectiveState: number) => {\r\n if (!selected && effectiveState === 1) return classes.buttonCorrectAnswer;\r\n else if (selected && effectiveState === 0) return classes.buttonIncorrectSelected;\r\n else if (selected && effectiveState === 1) return classes.buttonCorrectSelected;\r\n else if (selected && effectiveState === 2) return classes.buttonIncorrectSelected;\r\n\r\n return selected ? classes.buttonDefault : \"\";\r\n };\r\n\r\n const handleOpenVideo = () => {\r\n if (onPlayVideo && option.ExplanationVideo) onPlayVideo(option.ExplanationVideo);\r\n };\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n {option.Text}\r\n \r\n \r\n handleSelected(true, option.Id)}\r\n >\r\n Most Effective\r\n \r\n handleSelected(false, option.Id)}\r\n >\r\n Least Effective\r\n \r\n \r\n \r\n {isExplanationMode && (\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\ninterface IMostLeastOptionSelectionListProps {\r\n options: SessionResultOptionViewModel[];\r\n mostEffectiveAnswerId: string;\r\n leastEffectiveAnswerId: string;\r\n isExplanationMode: boolean;\r\n onSelectMostEffective: (oId: string) => void;\r\n onSelectLeastEffective: (oId: string) => void;\r\n onPlayVideo?: (url: string) => void;\r\n}\r\n\r\nexport const MostLeastOptionSelectionList = ({\r\n options,\r\n mostEffectiveAnswerId,\r\n leastEffectiveAnswerId,\r\n isExplanationMode,\r\n onSelectMostEffective,\r\n onSelectLeastEffective,\r\n onPlayVideo,\r\n}: IMostLeastOptionSelectionListProps) => {\r\n function handleSelection(mostEffective: boolean, oId: string) {\r\n if (mostEffective) {\r\n onSelectMostEffective(oId);\r\n } else {\r\n onSelectLeastEffective(oId);\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n \r\n {options.map((item, index) => (\r\n \r\n \r\n {options[index + 1] ? : \"\"}\r\n \r\n ))}\r\n \r\n \r\n );\r\n};\r\n","import React from \"react\";\r\nimport { Grid, Card, CardContent, Typography, makeStyles, Theme, createStyles, CardMedia } from \"@material-ui/core\";\r\nimport { SingleOptionSelectionList } from \"./SingleOptionSelectionList\";\r\nimport { MostLeastOptionSelectionList } from \"./MostLeastOptionSelectionList\";\r\nimport ContentLoader from \"react-content-loader\";\r\nimport { IQuestionResult } from \"../../../models/IQuestionResult\";\r\nimport { SessionResultQuestionViewModel } from \"../../../models/preplabModels\";\r\nimport { useImage } from \"../../../cache/useImage\";\r\n\r\ninterface IQuestionProps {\r\n isActive: boolean;\r\n question: SessionResultQuestionViewModel;\r\n selectMostEffectiveAnswer: (optId: string, qId: string) => void;\r\n selectLessEffectiveAnswer: (optId: string, qId: string) => void;\r\n questionResult: IQuestionResult;\r\n}\r\n\r\nconst useStyles: any = makeStyles((theme: Theme) =>\r\n createStyles({\r\n appBar: {\r\n position: \"relative\",\r\n },\r\n title: {\r\n marginLeft: theme.spacing(2),\r\n flex: 1,\r\n },\r\n grid: {\r\n marginTop: theme.spacing(2),\r\n },\r\n card: {},\r\n media: {\r\n padding: 5,\r\n height: \"100%\",\r\n width: \"100%\",\r\n },\r\n }),\r\n);\r\n\r\nconst ImageSkeleton = () => (\r\n \r\n \r\n \r\n);\r\n\r\nexport const QuestionContentTab = (props: IQuestionProps) => {\r\n const { question, questionResult, isActive } = props;\r\n const classes = useStyles();\r\n\r\n const { hasLoaded } = useImage(question.Image);\r\n\r\n function selectMostEffectiveAnswer(optionId: string) {\r\n props.selectMostEffectiveAnswer(optionId, question.Id);\r\n }\r\n\r\n function selectLessEffectiveAnswer(optionId: string) {\r\n props.selectLessEffectiveAnswer(optionId, question.Id);\r\n }\r\n\r\n let isSingleCorrect = question.IsSingleCorrect;\r\n let MostEffectiveAnswer = questionResult ? questionResult.MostEffectiveAnswer : \"\";\r\n let LessEffectiveAnswer = questionResult ? questionResult.LessEffectiveAnswer : \"\";\r\n\r\n return (\r\n \r\n );\r\n};\r\n","import { useEffect, useState } from \"react\";\r\n\r\nexport const useImage = (src: string) => {\r\n const [hasLoaded, setHasLoaded] = useState(false);\r\n const [hasError, setHasError] = useState(false);\r\n const [hasStartedInitialFetch, setHasStartedInitialFetch] = useState(false);\r\n\r\n useEffect(() => {\r\n setHasStartedInitialFetch(true);\r\n setHasLoaded(false);\r\n setHasError(false);\r\n\r\n // Here's where the magic happens.\r\n const image = new Image();\r\n image.src = src;\r\n\r\n const handleError = () => {\r\n setHasError(true);\r\n };\r\n\r\n const handleLoad = () => {\r\n setHasLoaded(true);\r\n setHasError(false);\r\n };\r\n\r\n image.onerror = handleError;\r\n image.onload = handleLoad;\r\n\r\n return () => {\r\n image.removeEventListener(\"error\", handleError);\r\n image.removeEventListener(\"load\", handleLoad);\r\n };\r\n }, [src]);\r\n\r\n return { hasLoaded, hasError, hasStartedInitialFetch };\r\n};\r\n","import React, { useState } from \"react\";\r\nimport { AppBar, Tabs, Tab, Grid, Button, Container, makeStyles, createStyles, Box } from \"@material-ui/core\";\r\nimport { IQuestionResult } from \"../../../models/IQuestionResult\";\r\nimport { QuestionContentTab } from \"./QuestionContentTab\";\r\nimport { SessionResultQuestionViewModel } from \"../../../models/preplabModels\";\r\n\r\ninterface ITestSessionButtonsProps {\r\n showPrevious: boolean;\r\n showNext: boolean;\r\n showCompleteTest: boolean;\r\n onPrevious: () => void;\r\n onNext: () => void;\r\n onCompleteTest: () => void;\r\n}\r\nexport const TestSessionButtons = ({\r\n showPrevious,\r\n showNext,\r\n showCompleteTest,\r\n onNext,\r\n onPrevious,\r\n onCompleteTest,\r\n}: ITestSessionButtonsProps) => {\r\n return (\r\n <>\r\n \r\n \r\n {showPrevious && (\r\n \r\n )}\r\n \r\n \r\n {showNext && (\r\n \r\n )}\r\n {showCompleteTest && (\r\n \r\n )}\r\n \r\n \r\n \r\n );\r\n};\r\n\r\ninterface IQuestionTabsProps {\r\n questions: SessionResultQuestionViewModel[];\r\n result: { [questionId: string]: IQuestionResult };\r\n onTabDeselected: (tab: number, question: SessionResultQuestionViewModel) => void;\r\n onTabSelected: (tab: number, question: SessionResultQuestionViewModel) => void;\r\n completeTest: () => void;\r\n selectMostEffectiveAnswer: (optId: string, qId: string) => void;\r\n selectLessEffectiveAnswer: (optId: string, qId: string) => void;\r\n}\r\nconst useStyles = makeStyles(() =>\r\n createStyles({\r\n root: {\r\n flexGrow: 1,\r\n },\r\n tab: {\r\n minWidth: \"64px\",\r\n },\r\n }),\r\n);\r\n\r\nexport const QuestionTabs = (props: IQuestionTabsProps) => {\r\n let {\r\n questions,\r\n selectMostEffectiveAnswer,\r\n selectLessEffectiveAnswer,\r\n result,\r\n onTabSelected,\r\n onTabDeselected,\r\n completeTest,\r\n } = props;\r\n\r\n const classes = useStyles();\r\n\r\n const [selectedTab, setSelectedTab] = useState(0);\r\n\r\n function handleChange(event: any, newTab: number) {\r\n changeTab(selectedTab, newTab);\r\n }\r\n\r\n function onNext() {\r\n if (selectedTab < questions.length - 1) {\r\n let newSelectedTab = Math.min(selectedTab + 1, questions.length - 1);\r\n changeTab(selectedTab, newSelectedTab);\r\n }\r\n }\r\n\r\n function onPrevious() {\r\n if (selectedTab > 0) {\r\n let newSelectedTab = Math.max(selectedTab - 1, 0);\r\n changeTab(selectedTab, newSelectedTab);\r\n }\r\n }\r\n\r\n const changeTab = (oldTab: number, newTab: number) => {\r\n let oldQuestion = questions[oldTab];\r\n onTabDeselected(oldTab, oldQuestion);\r\n\r\n let newq = questions[newTab];\r\n\r\n setSelectedTab(newTab);\r\n\r\n onTabSelected(newTab, newq);\r\n };\r\n\r\n const onCompleteTest = () => {\r\n completeTest();\r\n };\r\n\r\n return (\r\n <>\r\n \r\n \r\n {questions &&\r\n questions.map((question, index) => (\r\n \r\n ))}\r\n \r\n \r\n \r\n {questions &&\r\n questions.map((question, index) => (\r\n \r\n ))}\r\n\r\n \r\n 0}\r\n showNext={selectedTab < questions.length - 1}\r\n showCompleteTest={selectedTab >= questions.length - 1}\r\n onPrevious={onPrevious}\r\n onNext={onNext}\r\n onCompleteTest={onCompleteTest}\r\n />\r\n \r\n \r\n \r\n );\r\n};\r\n","import React, { useState, useEffect } from \"react\";\r\n\r\ninterface ICountdownProps {\r\n start: boolean;\r\n sec: number;\r\n timerTick: (sec: number) => void;\r\n}\r\n\r\nexport const CountdownComponent = ({ start, sec, timerTick }: ICountdownProps) => {\r\n const [seconds, setSeconds] = useState(sec);\r\n\r\n useEffect(() => {\r\n let interval: any = null;\r\n\r\n if (start) {\r\n interval = setInterval(() => {\r\n setSeconds((seconds) => seconds - 1);\r\n }, 1000);\r\n } else {\r\n clearInterval(interval);\r\n }\r\n\r\n if (start === false) {\r\n clearInterval(interval);\r\n } else {\r\n timerTick(seconds);\r\n }\r\n return () => clearInterval(interval);\r\n }, [seconds, start]);\r\n\r\n const parseString = (countdown: number) => {\r\n let minutes = Math.floor(Math.abs(countdown) / 60);\r\n let seconds = Math.abs(countdown) - minutes * 60;\r\n let sign = countdown < 0 ? \"-\" : \"\";\r\n\r\n return (\r\n sign + (minutes < 10 ? \"0\" : \"\") + minutes.toString() + \":\" + (seconds < 10 ? \"0\" : \"\") + seconds.toString()\r\n );\r\n };\r\n\r\n return <>{parseString(seconds)};\r\n};\r\n","import React from \"react\";\r\nimport { Dialog, DialogTitle, DialogContent, DialogContentText, DialogActions, Button } from \"@material-ui/core\";\r\n\r\ninterface IConfirmDialogProps {\r\n title: string;\r\n content: string;\r\n cancelText: string;\r\n okText: string;\r\n open: boolean;\r\n cancelAction: () => void;\r\n okAction: () => void;\r\n}\r\n\r\nexport const ConfirmDialogComponent = (props: IConfirmDialogProps) => {\r\n const { title, content, cancelAction, okAction, cancelText, okText, open } = props;\r\n\r\n const closeDialog = (callback: () => void) => {\r\n callback();\r\n };\r\n\r\n return (\r\n closeDialog(cancelAction)} aria-labelledby=\"responsive-dialog-title\">\r\n {title}\r\n \r\n {content}\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import React from \"react\";\r\nimport { IQuestionResult } from \"../../../models/IQuestionResult\";\r\nimport { useEffect, useState, useRef } from \"react\";\r\nimport {\r\n Dialog,\r\n Typography,\r\n Button,\r\n IconButton,\r\n AppBar,\r\n Toolbar,\r\n makeStyles,\r\n createStyles,\r\n Theme,\r\n Container,\r\n} from \"@material-ui/core\";\r\nimport CloseIcon from \"@material-ui/icons/Close\";\r\nimport { ProgressComponent } from \"../../../components/Shared/Progress/ProgressComponent\";\r\nimport { ErrorComponent } from \"../../error/ErrorComponent\";\r\nimport { QuestionTabs } from \"./QuestionTabs\";\r\nimport { CountdownComponent } from \"../../../components/Shared/Countdown/CountdownComponent\";\r\nimport { ConfirmDialogComponent } from \"../../../components/Shared/ConfirmDialog/ConfirmDialogComponent\";\r\nimport { useCloseTestSession, useStartTestSession } from \"../../../services/testSession.service\";\r\nimport { useTracker } from \"../../../analytics/trackerContext\";\r\nimport { PostState } from \"../../../services/useFetchPostApiData\";\r\nimport {\r\n SessionResultQuestionViewModel,\r\n TestSessionType,\r\n UserPackageCategoryViewModel,\r\n CloseTestSessionCommandQuestion,\r\n} from \"../../../models/preplabModels\";\r\n\r\ninterface ITestSessionDialogProps {\r\n category: UserPackageCategoryViewModel[];\r\n mode: TestSessionType;\r\n open: boolean;\r\n onClose: () => void;\r\n onComplete: (sessionId: string) => void;\r\n}\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n root: {\r\n flexGrow: 1,\r\n },\r\n appBar: {\r\n position: \"relative\",\r\n },\r\n title: {\r\n marginLeft: theme.spacing(2),\r\n flex: 1,\r\n },\r\n counter: {\r\n marginLeft: theme.spacing(2),\r\n flex: 1,\r\n },\r\n }),\r\n);\r\n\r\nexport const PracticeTestSessionDialog = (props: ITestSessionDialogProps) => {\r\n const { onClose, onComplete, open, category, mode } = props;\r\n\r\n const classes = useStyles();\r\n const tracking = useTracker();\r\n\r\n const [selectedTab, setSelectedTab] = useState(0);\r\n const [result, setResult] = useState<{ [qId: string]: IQuestionResult }>({});\r\n\r\n const [showAbortConfirmation, setShowAbortConfirmation] = useState(false);\r\n const [showCompleteConfirmation, setShowCompleteConfirmation] = useState(false);\r\n const [countdownActive, setCountdownActive] = useState(true);\r\n\r\n const [response, startTestSession] = useStartTestSession();\r\n\r\n const [closeResponse, closeSession] = useCloseTestSession();\r\n\r\n const didMount = useRef(false);\r\n\r\n let questions = response?.data?.Categories ? response.data.Categories.flatMap((c) => c.Questions) : [];\r\n let mins = response?.data?.Categories?.reduce((prev, cur) => prev + cur.MaxTotalTimeS, 0) ?? 0;\r\n let sessionId = response?.data?.Id ?? null;\r\n\r\n const onCompleteCallback = React.useCallback(onComplete, [sessionId]);\r\n\r\n useEffect(() => {\r\n startTestSession({ CategoryIds: category.map((c) => c.Id), TestSessionType: mode });\r\n }, [category, mode, startTestSession]);\r\n\r\n useEffect(() => {\r\n if (response.status === PostState.Success) {\r\n tracking.trackAction({\r\n eventAction:\r\n (response?.data?.Categories?.length ?? 0) > 1 ? \"Customized Practice Started\" : \"Practice Started\",\r\n eventCategory: \"Practice\",\r\n eventLabel: category.flatMap((c) => c.Name).join(\",\"),\r\n eventValue: category.flatMap((c) => c.PreferedLanguage).join(\",\"),\r\n });\r\n\r\n if (mode === TestSessionType.Weaknesses) {\r\n tracking.trackAction({\r\n eventAction: \"Weakness Practice Started\",\r\n eventCategory: \"Practice\",\r\n eventLabel: category.flatMap((c) => c.Name).join(\",\"),\r\n });\r\n } else if (mode === TestSessionType.Exam) {\r\n tracking.trackAction({\r\n eventAction: \"Exam Practice Started\",\r\n eventCategory: \"Practice\",\r\n eventLabel: category.flatMap((c) => c.Name).join(\",\"),\r\n });\r\n } else {\r\n tracking.trackAction({\r\n eventAction: \"Regular Practice Started\",\r\n eventCategory: \"Practice\",\r\n eventLabel: category.flatMap((c) => c.Name).join(\",\"),\r\n });\r\n }\r\n }\r\n }, [category, mode, response, response.status, tracking]);\r\n\r\n useEffect(() => {\r\n if (closeResponse.status === PostState.Success && didMount.current && sessionId) {\r\n setShowCompleteConfirmation(false);\r\n\r\n tracking.trackAction({\r\n eventAction: \"Practice Completed\",\r\n eventCategory: \"Practice\",\r\n eventLabel: category.flatMap((c) => c.Name).join(\",\"),\r\n });\r\n\r\n onCompleteCallback(sessionId);\r\n }\r\n\r\n didMount.current = true;\r\n }, [category, closeResponse.status, onCompleteCallback, sessionId, tracking]);\r\n\r\n const onTabSelected = (selectedTab: number) => {\r\n // setTimer(new Date());\r\n setSelectedTab(selectedTab);\r\n };\r\n\r\n const onTabDeselected = (tab: number, question: SessionResultQuestionViewModel) => {\r\n // setTimeSpent(question.Id);\r\n };\r\n\r\n const onAbortTest = () => {\r\n setShowAbortConfirmation(false);\r\n onClose();\r\n };\r\n\r\n const onCompleteTest = () => {\r\n if (questions && sessionId) {\r\n let resQ = new Array();\r\n\r\n for (let key in result) {\r\n const item = result[key];\r\n resQ.push({\r\n Id: item.Id,\r\n MostEffectiveAnswer: item.MostEffectiveAnswer,\r\n LessEffectiveAnswer: item.LessEffectiveAnswer,\r\n Duration: item.TimeSpent,\r\n });\r\n }\r\n\r\n closeSession({\r\n SessionId: sessionId,\r\n Questions: resQ,\r\n });\r\n }\r\n };\r\n\r\n const selectMostEffectiveAnswer = (optionId: string, questionId: string) => {\r\n setResult((prevState) => ({\r\n ...prevState,\r\n [questionId]: {\r\n ...prevState[questionId],\r\n Id: questionId,\r\n MostEffectiveAnswer: optionId,\r\n },\r\n }));\r\n };\r\n\r\n const selectLessEffectiveAnswer = (optionId: string, questionId: string) => {\r\n setResult((prevState) => ({\r\n ...prevState,\r\n [questionId]: {\r\n ...prevState[questionId],\r\n Id: questionId,\r\n LessEffectiveAnswer: optionId,\r\n },\r\n }));\r\n };\r\n\r\n const setTimeSpent = (questionId: string) => {\r\n let questionTimeSpent = 0;\r\n\r\n if (result[questionId]?.TimeSpent) {\r\n questionTimeSpent = result[questionId].TimeSpent;\r\n }\r\n\r\n questionTimeSpent += 1000; //miliseconds\r\n\r\n //questionTimeSpent += Date.now() - timer.getTime();\r\n\r\n setResult((prevState) => ({\r\n ...prevState,\r\n [questionId]: {\r\n ...prevState[questionId],\r\n Id: questionId,\r\n TimeSpent: questionTimeSpent,\r\n },\r\n }));\r\n };\r\n\r\n const timerTick = (sec: number) => {\r\n setTimeSpent(questions[selectedTab].Id);\r\n\r\n if (sec <= 0 && mode === TestSessionType.Exam) {\r\n setCountdownActive(false);\r\n onCompleteTest();\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n {mode !== TestSessionType.Exam && (\r\n setShowAbortConfirmation(true)}\r\n >\r\n \r\n \r\n )}\r\n\r\n \r\n {mode === TestSessionType.Weaknesses\r\n ? \"Weaknesses\"\r\n : mode === TestSessionType.Exam\r\n ? \"Exam\"\r\n : \"Practice\"}\r\n \r\n {response.status === PostState.Success && questions && questions.length > 0 && (\r\n <>\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n\r\n {response.status === PostState.Sending ? (\r\n \r\n \r\n \r\n ) : response.status === PostState.Error ? (\r\n \r\n \r\n \r\n ) : (\r\n <>\r\n {questions && questions.length > 0 && (\r\n <>\r\n setShowCompleteConfirmation(true)}\r\n selectMostEffectiveAnswer={selectMostEffectiveAnswer}\r\n selectLessEffectiveAnswer={selectLessEffectiveAnswer}\r\n result={result}\r\n />\r\n\r\n setShowAbortConfirmation(false)}\r\n okAction={() => onAbortTest()}\r\n />\r\n\r\n setShowCompleteConfirmation(false)}\r\n okAction={() => onCompleteTest()}\r\n />\r\n \r\n )}\r\n \r\n )}\r\n \r\n \r\n );\r\n};\r\n","import { CloseTestSessionCommand, StartTestSessionCommand, StartTestSessionViewModel } from \"./../models/preplabModels\";\r\nimport { useFetchPostApiData } from \"./useFetchPostApiData\";\r\nimport { useFetchApiData } from \"./useFetchApiData\";\r\nimport { SessionResultViewModel } from \"../models/preplabModels\";\r\n\r\nexport const useGetTestSessionData = (sessionId: string) => {\r\n return useFetchApiData(`/api/TestSession/GetSessionData?sessionId=${sessionId}`);\r\n};\r\n\r\nexport const useStartTestSession = () => {\r\n return useFetchPostApiData(\"/api/TestSession/StartTestSession\");\r\n};\r\n\r\nexport const useCloseTestSession = () => {\r\n return useFetchPostApiData(\"/api/TestSession/CloseTestSession\");\r\n};\r\n","import React from \"react\";\r\nimport { ProgressComponent } from \"../../components/Shared/Progress/ProgressComponent\";\r\nimport { Grid } from \"@material-ui/core\";\r\nimport { ErrorComponent } from \"../error/ErrorComponent\";\r\nimport { PracticeCategoryComponent } from \"./PracticeCategoryComponent\";\r\nimport { PracticeMultipleSelectorDialog, PracticeMultipleComponent } from \"./PracticeMultipleComponent\";\r\n\r\nimport { useEffect, useState } from \"react\";\r\nimport { PracticeTestSessionDialog } from \"./TestSession/TestSessionDialog\";\r\nimport { useHistory } from \"react-router\";\r\nimport { useGetUserPackages } from \"../../services/shop.service\";\r\nimport { StoreActions, useGlobalStoreDispatch } from \"../../storage/GlobalStoreContext\";\r\n\r\nimport { FetchStatus } from \"../../services/useFetchApiData\";\r\nimport { TestSessionType, UserPackageCategoryViewModel } from \"../../models/preplabModels\";\r\n\r\nexport const PracticeContainer = () => {\r\n const [openTestSessionDialog, setOpenTestSessionDialog] = useState(false);\r\n const [openComboSessionSelector, setOpenComboSessionSelector] = useState(false);\r\n const [selected, setSelected] = useState<{\r\n category: UserPackageCategoryViewModel[];\r\n mode: TestSessionType;\r\n }>({} as any);\r\n\r\n const [status, error, data] = useGetUserPackages();\r\n\r\n const dispatch = useGlobalStoreDispatch();\r\n\r\n let history = useHistory();\r\n\r\n useEffect(() => {\r\n dispatch({ type: StoreActions.SetPageTitle, payload: \"Practice\" });\r\n }, [dispatch]);\r\n\r\n function selectItem(mode: TestSessionType, category: UserPackageCategoryViewModel) {\r\n if (category) {\r\n setSelected({ category: [category], mode });\r\n setOpenTestSessionDialog(true);\r\n }\r\n }\r\n\r\n function openComboSelector(mode: TestSessionType) {\r\n setSelected((prevState) => ({ ...prevState, mode }));\r\n setOpenComboSessionSelector(true);\r\n }\r\n\r\n function selectCombo(categories: Array) {\r\n setSelected((prevState) => ({ ...prevState, category: categories }));\r\n\r\n setOpenComboSessionSelector(false);\r\n setOpenTestSessionDialog(true);\r\n }\r\n\r\n function buyItem() {\r\n history.push(\"/shop\");\r\n }\r\n\r\n function testSessionCompleted(sessionId: string) {\r\n setOpenTestSessionDialog(false);\r\n history.push(\"/practice/result/\" + sessionId);\r\n }\r\n\r\n return (\r\n <>\r\n \r\n {status === FetchStatus.Loading ? (\r\n \r\n ) : status === FetchStatus.Error ? (\r\n \r\n ) : (\r\n \r\n \r\n \r\n \r\n {data &&\r\n data.Categories.map((category: UserPackageCategoryViewModel) => (\r\n \r\n \r\n \r\n ))}\r\n \r\n )}\r\n \r\n\r\n {data && (\r\n setOpenComboSessionSelector(false)}\r\n />\r\n )}\r\n\r\n {openTestSessionDialog && (\r\n setOpenTestSessionDialog(false)}\r\n onComplete={(id: string) => testSessionCompleted(id)}\r\n />\r\n )}\r\n \r\n );\r\n};\r\n","import { useFetchPostApiData } from \"./useFetchPostApiData\";\r\nimport {\r\n PayPalCreateOrderCommand,\r\n PayPalProcessOrderCommand,\r\n StripeCreateCheckoutSessionCommand,\r\n TransactionViewModel,\r\n UserPackageViewModel,\r\n} from \"./../models/preplabModels\";\r\nimport { useFetchApiData } from \"./useFetchApiData\";\r\nimport { PackagesViewModel } from \"../models/preplabModels\";\r\n\r\nexport const useGetTransaction = (transactionId: string) => {\r\n return useFetchApiData(`/api/shop/GetTransaction?transactionId=${transactionId}`);\r\n};\r\n\r\nexport const useGetShop = () => {\r\n return useFetchApiData(\"/api/Shop/GetPackages\");\r\n};\r\n\r\nexport const useGetUserPackages = () => {\r\n return useFetchApiData(\"/api/Shop/GetUserPackages\");\r\n};\r\n\r\nexport const useCreateCheckoutSession = () => {\r\n return useFetchPostApiData(\"/api/payment/stripe/CreateCheckoutSession\");\r\n};\r\n\r\nexport const useCreatePayPalOrder = () => {\r\n return useFetchPostApiData(\"/api/payment/paypal/CreateOrder\");\r\n};\r\n\r\nexport const useProcessPayPalOrder = () => {\r\n return useFetchPostApiData(\"/api/payment/paypal/ProcessOrder\");\r\n};\r\n","import React from \"react\";\r\nimport { Card, CardContent, Grid, Typography, CardActionArea, CardHeader, Box, Divider } from \"@material-ui/core\";\r\nimport { TestSessionType, TimelineItemViewModel } from \"../../models/preplabModels\";\r\n\r\ninterface ITimelineItemProps {\r\n timeline: TimelineItemViewModel;\r\n showDetails: (categoryId: string) => void;\r\n}\r\n\r\nexport const TimelineItemComponent = (props: ITimelineItemProps) => {\r\n const { timeline, showDetails } = props;\r\n const cardStyle = {\r\n maxWidth: 345,\r\n };\r\n\r\n const handleDetails = () => {\r\n showDetails(timeline.Id);\r\n };\r\n\r\n const getActivityTitle = (type: TestSessionType): string => {\r\n switch (type) {\r\n case TestSessionType.Practice:\r\n return \"Practice session\";\r\n case TestSessionType.Weaknesses:\r\n return \"Weaknesses session\";\r\n case TestSessionType.Exam:\r\n return \"Exam session\";\r\n\r\n default:\r\n return \"\";\r\n }\r\n };\r\n\r\n return (\r\n \r\n \r\n {getActivityTitle(timeline.ActivityType)}}\r\n subheader={{timeline.Created}}\r\n />\r\n \r\n \r\n \r\n {timeline.TotalCorrectNormalized}%\r\n \r\n \r\n Time spent\r\n \r\n {Math.round(timeline.TotalTimeSpentMs / 1000)} s\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {timeline.TestSessionCategories.length > 0 &&\r\n timeline.TestSessionCategories.map((tim, index) => (\r\n \r\n \r\n \r\n {tim.CategoryName}\r\n \r\n \r\n {/* Intentionally Empty */}\r\n \r\n {tim.CorrectNormalized}%\r\n \r\n \r\n ))}\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import React, { useEffect } from \"react\";\r\nimport { Grid, Typography } from \"@material-ui/core\";\r\nimport { TimelineItemComponent } from \"./TimelineItemComponent\";\r\nimport { ProgressComponent } from \"../../components/Shared/Progress/ProgressComponent\";\r\nimport { ErrorComponent } from \"../error/ErrorComponent\";\r\nimport { useHistory } from \"react-router\";\r\nimport { useGetTimelines } from \"../../services/timeline.service\";\r\nimport { StoreActions, useGlobalStoreDispatch } from \"../../storage/GlobalStoreContext\";\r\nimport { FetchStatus } from \"../../services/useFetchApiData\";\r\n\r\nexport const TimelineContainer = () => {\r\n let history = useHistory();\r\n\r\n const [status, error, data] = useGetTimelines();\r\n const dispatch = useGlobalStoreDispatch();\r\n\r\n useEffect(() => {\r\n dispatch({ type: StoreActions.SetPageTitle, payload: \"Timeline\" });\r\n }, [dispatch]);\r\n\r\n function showDetails(id: string) {\r\n history.push(`/practice/result/${id}`);\r\n }\r\n\r\n return (\r\n <>\r\n \r\n {status === FetchStatus.Loading ? (\r\n \r\n \r\n \r\n ) : status === FetchStatus.Error ? (\r\n \r\n ) : (\r\n <>\r\n {data.Items.length === 0 && (\r\n \r\n \r\n No activities avaliable yet. Go ahead and do couple of practice rounds.\r\n \r\n \r\n )}\r\n {data.Items.length > 0 &&\r\n data.Items.map((tim) => (\r\n \r\n \r\n \r\n ))}\r\n \r\n )}\r\n \r\n \r\n );\r\n};\r\n","import { useFetchApiData } from \"./useFetchApiData\";\r\nimport { TimelineViewModel } from \"../models/preplabModels\";\r\n\r\nexport const useGetTimelines = () => {\r\n return useFetchApiData(\"/api/Timeline/GetTimelines\");\r\n};\r\n","import React, { useEffect } from \"react\";\r\nimport {\r\n Card,\r\n CardContent,\r\n Typography,\r\n Button,\r\n CardActions,\r\n CardHeader,\r\n Divider,\r\n Chip,\r\n Grid,\r\n makeStyles,\r\n} from \"@material-ui/core\";\r\nimport { green } from \"@material-ui/core/colors\";\r\nimport { useState } from \"react\";\r\nimport ShoppingCartOutlinedIcon from \"@material-ui/icons/ShoppingCartOutlined\";\r\nimport ArrowForwardOutlinedIcon from \"@material-ui/icons/ArrowForwardOutlined\";\r\nimport { PackageViewModel, SubscriptionViewModel } from \"../../models/preplabModels\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n card: {\r\n height: \"100%\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n justifyContent: \"space-between\",\r\n },\r\n cardContent: {\r\n height: \"100%\",\r\n },\r\n chip: {},\r\n\r\n chipSelected: {\r\n color: theme.palette.secondary.contrastText,\r\n backgroundColor: theme.palette.primary.light,\r\n },\r\n\r\n purchaseButton: {\r\n color: theme.palette.secondary.contrastText,\r\n backgroundColor: green[400],\r\n borderColor: green[500],\r\n \"&:hover\": {\r\n borderColor: green[300],\r\n backgroundColor: green[800],\r\n },\r\n },\r\n}));\r\n\r\ninterface IShopPackageProps {\r\n shopPackage: PackageViewModel;\r\n goPractice: () => void;\r\n createCharge: (pack: PackageViewModel, subs: SubscriptionViewModel) => void;\r\n}\r\nexport const ShopPackageComponent = (props: IShopPackageProps) => {\r\n const { shopPackage, createCharge, goPractice } = props;\r\n const classes = useStyles();\r\n\r\n const [subscription, setSubscription] = useState({} as SubscriptionViewModel);\r\n\r\n useEffect(() => {\r\n if (shopPackage.Subscriptions && shopPackage.Subscriptions.length > 0) {\r\n setSubscription(shopPackage.Subscriptions[0]);\r\n }\r\n }, [shopPackage]);\r\n\r\n const handleDurationSelection = (sub: SubscriptionViewModel) => {\r\n setSubscription(sub);\r\n };\r\n\r\n const handlePay = (sub: SubscriptionViewModel) => {\r\n createCharge(shopPackage, sub);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n {shopPackage.AlreadyHave && (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n Expiry date\r\n \r\n \r\n \r\n {shopPackage.Left ? {shopPackage.Left} : \"Unlimited\"}\r\n \r\n \r\n \r\n \r\n \r\n }\r\n >\r\n Go practice\r\n \r\n \r\n \r\n )}\r\n {!shopPackage.AlreadyHave && (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n Select duration\r\n \r\n \r\n \r\n {shopPackage.Subscriptions &&\r\n shopPackage.Subscriptions.map((sub, index) => (\r\n \r\n handleDurationSelection(sub)}\r\n />\r\n \r\n ))}\r\n \r\n \r\n \r\n \r\n \r\n handlePay(subscription)}\r\n endIcon={}\r\n >\r\n Checkout total {subscription.Price} {subscription.Currency}\r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n","import React, { useState, useEffect } from \"react\";\r\nimport { Grid, Button, Typography, CircularProgress, makeStyles, createStyles, Theme } from \"@material-ui/core\";\r\nimport { useCreateCheckoutSession } from \"../../../services/shop.service\";\r\nimport { ISelectedPackage } from \"../../../models/ISelectedPackage\";\r\nimport { green } from \"@material-ui/core/colors\";\r\nimport { useTracker } from \"../../../analytics/trackerContext\";\r\n\r\nimport PaymentIcon from \"@material-ui/icons/Payment\";\r\nimport { PostState } from \"../../../services/useFetchPostApiData\";\r\nimport { StripeCreateCheckoutSessionCommand } from \"../../../models/preplabModels\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n buttonProgress: {\r\n color: green[500],\r\n position: \"absolute\",\r\n top: \"50%\",\r\n left: \"50%\",\r\n marginTop: -12,\r\n marginLeft: -12,\r\n },\r\n purchaseButton: {\r\n color: theme.palette.secondary.contrastText,\r\n backgroundColor: green[500],\r\n borderColor: green[600],\r\n \"&:hover\": {\r\n borderColor: green[300],\r\n backgroundColor: green[800],\r\n },\r\n },\r\n }),\r\n);\r\n\r\ninterface IStripeCheckoutComponentProps {\r\n stripePublicKey: string;\r\n selectedPackage: ISelectedPackage;\r\n}\r\n\r\nexport const StripeCheckoutComponent = ({ stripePublicKey, selectedPackage }: IStripeCheckoutComponentProps) => {\r\n const [loading, setLoading] = useState(false);\r\n\r\n const classes = useStyles();\r\n\r\n const [response, createSession] = useCreateCheckoutSession();\r\n const tracking = useTracker();\r\n\r\n const redirectToCheckoutCallbak = React.useCallback(() => {\r\n const stripe = window.Stripe(stripePublicKey);\r\n stripe.redirectToCheckout({\r\n sessionId: response.data,\r\n });\r\n }, [response.data, stripePublicKey]);\r\n\r\n useEffect(() => {\r\n if (response.status === PostState.Success && response.data) {\r\n redirectToCheckoutCallbak();\r\n }\r\n }, [redirectToCheckoutCallbak, response.data, response.status]);\r\n\r\n if (stripePublicKey === \"\" || selectedPackage === null) {\r\n return <>;\r\n }\r\n\r\n const handlePay = () => {\r\n setLoading(true);\r\n\r\n let command: StripeCreateCheckoutSessionCommand = {\r\n Amount: +selectedPackage.price,\r\n PackageId: selectedPackage.packageId,\r\n Duration: +selectedPackage.duration,\r\n Description: selectedPackage.description,\r\n Name: selectedPackage.name,\r\n SuccessUrl: `${window.location.origin}/shop/receipt`,\r\n CancelUrl: window.location.href,\r\n };\r\n\r\n createSession(command);\r\n\r\n tracking.trackAction({\r\n eventAction: \"Purchase Started\",\r\n eventCategory: \"Shop\",\r\n eventLabel: selectedPackage.name,\r\n });\r\n };\r\n return (\r\n <>\r\n \r\n {response.status === PostState.Error && (\r\n \r\n {response.error}\r\n \r\n )}\r\n }\r\n >\r\n Pay with credit card\r\n {loading && }\r\n \r\n \r\n \r\n );\r\n};\r\n","import React from \"react\";\r\nimport { Grid, List, ListItem, Divider, ListItemText } from \"@material-ui/core\";\r\nimport { ISelectedPackage } from \"../../../models/ISelectedPackage\";\r\n\r\nexport const ReceiptSummaryItem = ({ selectedPackage }: { selectedPackage: ISelectedPackage }) => {\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import React, { useEffect, useState } from \"react\";\r\nimport { Grid, Typography, LinearProgress } from \"@material-ui/core\";\r\nimport { ISelectedPackage } from \"../../../models/ISelectedPackage\";\r\nimport { PayPalButton } from \"react-paypal-button-v2\";\r\nimport { useCreatePayPalOrder, useProcessPayPalOrder } from \"../../../services/shop.service\";\r\nimport { useHistory } from \"react-router\";\r\nimport { useTracker } from \"../../../analytics/trackerContext\";\r\nimport { PostState } from \"../../../services/useFetchPostApiData\";\r\n\r\ninterface IPayPalCheckoutProps {\r\n selectedPackage: ISelectedPackage;\r\n paypalPublicKey: string;\r\n}\r\n\r\nexport const PayPalCheckoutComponent = ({ paypalPublicKey, selectedPackage }: IPayPalCheckoutProps) => {\r\n const [loading, setLoading] = useState(true);\r\n const [processing, setProcessing] = useState(false);\r\n\r\n const tracking = useTracker();\r\n\r\n let history = useHistory();\r\n\r\n const [, createOrder] = useCreatePayPalOrder();\r\n\r\n const [procStatus, processOrder] = useProcessPayPalOrder();\r\n\r\n useEffect(() => {\r\n if (processing && procStatus.status === PostState.Success && procStatus.data) {\r\n setProcessing(false);\r\n\r\n tracking.trackAction({\r\n eventAction: \"Purchase Completed\",\r\n eventCategory: \"Shop\",\r\n eventLabel: selectedPackage.name,\r\n eventValue: +selectedPackage.price, //+ converts to number if null it will be (0)\r\n });\r\n\r\n history.push(`/shop/receipt/${procStatus.data}`);\r\n }\r\n }, [\r\n processing,\r\n procStatus.status,\r\n procStatus.data,\r\n tracking,\r\n selectedPackage.name,\r\n selectedPackage.price,\r\n history,\r\n ]);\r\n\r\n const handleSucess = (details: any, data: any) => {\r\n setProcessing(true);\r\n\r\n processOrder({\r\n Amount: +selectedPackage.price,\r\n Duration: +selectedPackage.duration,\r\n PackageId: selectedPackage.packageId,\r\n Name: selectedPackage.name,\r\n Description: selectedPackage.description,\r\n OrderId: data.orderID,\r\n });\r\n };\r\n\r\n return (\r\n <>\r\n \r\n {procStatus.status === PostState.Error && (\r\n \r\n {procStatus.error}\r\n \r\n )}\r\n {loading && (\r\n \r\n Loading please wait...\r\n \r\n \r\n )}\r\n {processing && (\r\n \r\n Processing the transaction do not close the browser\r\n \r\n \r\n )}\r\n \r\n {\r\n var res = await createOrder({\r\n Amount: +selectedPackage.price,\r\n PackageId: selectedPackage.packageId,\r\n Name: selectedPackage.name,\r\n Description: selectedPackage.description,\r\n });\r\n\r\n tracking.trackAction({\r\n eventAction: \"Purchase Started\",\r\n eventCategory: \"Shop\",\r\n eventLabel: selectedPackage.name,\r\n });\r\n\r\n return res;\r\n }}\r\n onSuccess={handleSucess}\r\n options={{\r\n clientId: paypalPublicKey,\r\n currency: selectedPackage.currency,\r\n }}\r\n onButtonReady={() => setLoading(false)}\r\n >\r\n \r\n \r\n \r\n );\r\n};\r\n","import React from \"react\";\r\nimport {\r\n Dialog,\r\n Paper,\r\n AppBar,\r\n Toolbar,\r\n IconButton,\r\n Typography,\r\n makeStyles,\r\n Theme,\r\n createStyles,\r\n Container,\r\n Grid,\r\n Divider,\r\n} from \"@material-ui/core\";\r\nimport { ISelectedPackage } from \"../../models/ISelectedPackage\";\r\nimport { StripeCheckoutComponent } from \"./Payment/StripeCheckoutComponent\";\r\nimport CloseIcon from \"@material-ui/icons/Close\";\r\nimport { isNullOrUndefined } from \"util\";\r\nimport { ReceiptSummaryItem } from \"./Receipt/ReceiptSummaryItem\";\r\nimport { PayPalCheckoutComponent } from \"./Payment/PayPalCheckoutComponent\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n root: {\r\n flexGrow: 1,\r\n },\r\n appBar: {\r\n position: \"relative\",\r\n },\r\n title: {\r\n marginLeft: theme.spacing(2),\r\n flex: 1,\r\n },\r\n }),\r\n);\r\n\r\ninterface ICheckoutDialogProps {\r\n selectedPackage: ISelectedPackage | null;\r\n stripePublicKey: string;\r\n paypalPublicKey: string;\r\n open: boolean;\r\n onClose: () => void;\r\n}\r\n\r\nexport const CheckoutDialog = (props: ICheckoutDialogProps) => {\r\n const { open, selectedPackage, stripePublicKey, paypalPublicKey, onClose } = props;\r\n\r\n const classes = useStyles();\r\n\r\n if (isNullOrUndefined(selectedPackage)) {\r\n return <>;\r\n }\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n Complete your purchase\r\n \r\n \r\n \r\n \r\n \r\n \r\n Checkout summary\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n Payment method\r\n \r\n \r\n \r\n \r\n \r\n Pay with VISA, MasterCard, iDEAL, Giropay and others\r\n \r\n \r\n \r\n\r\n \r\n \r\n or\r\n \r\n\r\n \r\n \r\n Payment via PayPal\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import React, { useState } from \"react\";\r\nimport { Grid } from \"@material-ui/core\";\r\nimport { ISelectedPackage } from \"../../models/ISelectedPackage\";\r\nimport { ProgressComponent } from \"../../components/Shared/Progress/ProgressComponent\";\r\nimport { ErrorComponent } from \"../error/ErrorComponent\";\r\nimport { ShopPackageComponent } from \"./ShopPackageComponent\";\r\nimport { useEffect } from \"react\";\r\nimport { CheckoutDialog } from \"./CheckoutDialog\";\r\nimport { useHistory } from \"react-router\";\r\nimport { useGetShop } from \"../../services/shop.service\";\r\nimport { StoreActions, useGlobalStore, useGlobalStoreDispatch } from \"../../storage/GlobalStoreContext\";\r\nimport { FetchStatus } from \"../../services/useFetchApiData\";\r\nimport { PackageViewModel, SubscriptionViewModel } from \"../../models/preplabModels\";\r\n\r\ninterface IShopProps {}\r\n\r\nexport const ShopContainer = () => {\r\n const [selectedPackage, setSelectedPackage] = useState(null);\r\n const [openCheckoutDialog, setOpenCheckoutDialog] = useState(false);\r\n\r\n const [status, error, data] = useGetShop();\r\n\r\n const { settings } = useGlobalStore();\r\n const dispatch = useGlobalStoreDispatch();\r\n\r\n let history = useHistory();\r\n\r\n useEffect(() => {\r\n dispatch({ type: StoreActions.SetPageTitle, payload: \"Shop\" });\r\n }, [dispatch]);\r\n\r\n useEffect(() => {\r\n if (selectedPackage) {\r\n setOpenCheckoutDialog(true);\r\n }\r\n }, [selectedPackage]);\r\n\r\n const closeDialog = () => {\r\n setSelectedPackage(null);\r\n setOpenCheckoutDialog(false);\r\n };\r\n\r\n const goPractice = () => {\r\n history.push(\"/practice\");\r\n };\r\n\r\n const createCharge = (pack: PackageViewModel, subs: SubscriptionViewModel) => {\r\n let selectedPackage: ISelectedPackage = {\r\n duration: subs.Duration,\r\n name: pack.Name,\r\n description: subs.Description,\r\n price: subs.Price,\r\n currency: subs.Currency,\r\n packageId: pack.PackageId,\r\n };\r\n setSelectedPackage(selectedPackage);\r\n };\r\n\r\n return (\r\n <>\r\n \r\n {status === FetchStatus.Loading ? (\r\n \r\n ) : status === FetchStatus.Error ? (\r\n \r\n ) : (\r\n <>\r\n \r\n {data &&\r\n data.Packages.map((shopPackage) => (\r\n \r\n \r\n \r\n ))}\r\n \r\n {data && (\r\n \r\n )}\r\n \r\n )}\r\n \r\n \r\n );\r\n};\r\n","import React, { useEffect } from \"react\";\r\nimport { Card, CardContent, Typography, Divider, Grid, makeStyles, createStyles, Theme, Box } from \"@material-ui/core\";\r\nimport { useParams, useHistory } from \"react-router-dom\";\r\nimport { useGetTransaction } from \"../../../services/shop.service\";\r\nimport { ErrorComponent } from \"../../error/ErrorComponent\";\r\nimport { ProgressComponent } from \"../../../components/Shared/Progress/ProgressComponent\";\r\nimport { StoreActions, useGlobalStoreDispatch } from \"../../../storage/GlobalStoreContext\";\r\nimport { useTracker } from \"../../../analytics/trackerContext\";\r\nimport { FetchStatus } from \"../../../services/useFetchApiData\";\r\n\r\ninterface IReceiptContainerProps {}\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n table: { margin: theme.spacing(1, 0, 1, 0) },\r\n }),\r\n);\r\n\r\nexport const ReceiptContainer = () => {\r\n const classes = useStyles();\r\n\r\n const tracking = useTracker();\r\n const history = useHistory();\r\n let { sessionId, isCallback } = useParams<{ sessionId: string | undefined; isCallback: string | undefined }>();\r\n\r\n let param = sessionId ? sessionId : \"\";\r\n\r\n const [status, error, receipt] = useGetTransaction(param);\r\n\r\n const dispatch = useGlobalStoreDispatch();\r\n\r\n useEffect(() => {\r\n dispatch({ type: StoreActions.SetPageTitle, payload: \"Receipt\" });\r\n }, [dispatch]);\r\n\r\n useEffect(() => {\r\n if (status === FetchStatus.Success && receipt && isCallback) {\r\n tracking.trackAction({\r\n eventAction: \"Purchase Completed\",\r\n eventCategory: \"Shop\",\r\n eventLabel: receipt.Name,\r\n eventValue: +receipt.Amount, //+ converts to number if null it will be (0)\r\n });\r\n\r\n history.replace(`/shop/receipt/${sessionId}`);\r\n }\r\n }, [isCallback, status, tracking, history, sessionId, receipt]);\r\n\r\n return (\r\n <>\r\n \r\n {status === FetchStatus.Loading ? (\r\n \r\n ) : status === FetchStatus.Error || !receipt ? (\r\n \r\n ) : (\r\n \r\n \r\n PAYMENT RECEIPT\r\n \r\n \r\n {receipt.Name}\r\n \r\n \r\n \r\n Hi,\r\n \r\n \r\n Congratulations! You have just gained access to the {receipt.Name} package.\r\n \r\n Below are the details of your purchase.\r\n \r\n \r\n \r\n \r\n \r\n ITEM\r\n \r\n {`${receipt.Name} ${receipt.Description}`}\r\n \r\n \r\n \r\n DATE PURCHASED\r\n \r\n {`${receipt.Created}`}\r\n \r\n \r\n \r\n AMOUNT\r\n \r\n {`${receipt.Amount} ${receipt.Currency}`}\r\n \r\n \r\n \r\n \r\n \r\n Invoice id: {receipt.TransactionId} {receipt.Provider}\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n );\r\n};\r\n","export class TestSessionHelper {\r\n public static getQuestionColorByState(state: number): string {\r\n return state !== 0 ? (state === 2 ? \"#F0E68C\" : \"#26A65B\") : \"#C93756\";\r\n }\r\n\r\n public static getQuestionLabelByState(state: number): string {\r\n return state !== 0 ? (state === 2 ? \"Partially correct\" : \"Correct\") : \"Incorrect\";\r\n }\r\n\r\n public static getOptionColorByState(\r\n mostState: number,\r\n leassState: number,\r\n mostSelected: number,\r\n lessSelected: number,\r\n ): string | undefined {\r\n if (mostSelected) {\r\n return mostState === 2 ? \"#F0E68C\" : mostState === 0 ? \"#C93756\" : \"#26A65B\";\r\n }\r\n\r\n if (lessSelected) {\r\n return leassState === 2 ? \"#F0E68C\" : leassState === 0 ? \"#C93756\" : \"#26A65B\";\r\n }\r\n\r\n if (mostState !== 0) {\r\n return mostState === 2 ? \"#fff\" : \"#26A65B\";\r\n } else if (leassState !== 0) {\r\n return leassState === 2 ? \"#fff\" : \"#26A65B\";\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n public static getLabelByColor(color: string): string {\r\n switch (color) {\r\n case \"#C93756\":\r\n return \"Incorrect\";\r\n case \"#26A65B\":\r\n return \"Correct\";\r\n case \"#F0E68C\":\r\n return \"Partial\";\r\n case \"#DDDCD8\":\r\n return \"Unanswered\";\r\n }\r\n\r\n return \"\";\r\n }\r\n}\r\n","import React from \"react\";\r\nimport { Card, CardContent, CardHeader } from \"@material-ui/core\";\r\n\r\nimport { Doughnut } from \"react-chartjs-2\";\r\nimport { TestSessionHelper } from \"../../common/testSessionHelper\";\r\nimport { SessionResultViewModel } from \"../../models/preplabModels\";\r\n\r\ninterface IResultAnswersProps {\r\n result: SessionResultViewModel;\r\n}\r\nexport const ResultAnswersComponent = (props: IResultAnswersProps) => {\r\n let { result } = props;\r\n let percentCorrect = result.CorrectNormalized;\r\n let percentUnanswered = result.UnansweredNormalized;\r\n let percentageLabels = [\"Correct\", \"Unanswered\", \"Incorrect\"];\r\n let chartColors = [\"#26A65B\", \"#DDDCD8\", \"#C93756\"];\r\n let percentageData = [percentCorrect, percentUnanswered, 100 - percentCorrect - percentUnanswered];\r\n let chartOptions = {\r\n maintainAspectRatio: false,\r\n rotation: 1 * Math.PI,\r\n circumference: 1 * Math.PI,\r\n tooltips: {\r\n displayColors: false,\r\n callbacks: {\r\n label: (tooltipItem: any, data: any) => {\r\n var value = data.datasets[0].data[tooltipItem.index];\r\n return (\r\n TestSessionHelper.getLabelByColor(data.datasets[0].hoverBackgroundColor[tooltipItem.index]) +\r\n \": \" +\r\n value +\r\n \" %\"\r\n );\r\n },\r\n },\r\n },\r\n };\r\n const data = {\r\n labels: percentageLabels,\r\n datasets: [\r\n {\r\n hoverBackgroundColor: [\"#26A65B\", \"#DDDCD8\", \"#C93756\"],\r\n hoverBorderColor: [\"#26A65B\", \"#DDDCD8\", \"#C93756\"],\r\n hoverBorderWidth: 0,\r\n backgroundColor: chartColors,\r\n data: percentageData,\r\n },\r\n ],\r\n };\r\n const legendOpts = {\r\n display: false,\r\n };\r\n\r\n return (\r\n
\r\n \r\n \r\n\r\n \r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n );\r\n};\r\n","import React from \"react\";\r\nimport { Card, CardHeader, CardContent, Grid, Box } from \"@material-ui/core\";\r\nimport { Bar } from \"react-chartjs-2\";\r\nimport { TestSessionHelper } from \"../../common/testSessionHelper\";\r\nimport { SessionResultCategoryViewModel } from \"../../models/preplabModels\";\r\n\r\ninterface IResultTimeScoreProps {\r\n testSessionResult: SessionResultCategoryViewModel[];\r\n gotoQuestion: Function;\r\n}\r\n\r\n//export const ResultTimeScoreComponent = (props: IResultTimeScoreProps) => {\r\nexport class ResultTimeScoreComponent extends React.Component {\r\n render() {\r\n let { testSessionResult, gotoQuestion } = this.props;\r\n let timeLabels = [];\r\n let timeDatasetOverride = [\r\n {\r\n backgroundColor: new Array(),\r\n borderWidth: 0,\r\n },\r\n {\r\n backgroundColor: new Array(),\r\n borderWidth: 0,\r\n },\r\n ];\r\n var tempMyTime = new Array();\r\n var tempOthersTime = new Array();\r\n\r\n let maxQuestionTimeS = testSessionResult.reduce(\r\n (max, val) => (max > val.MaxQuestionTimeS ? max : val.MaxQuestionTimeS),\r\n testSessionResult[0].MaxQuestionTimeS,\r\n );\r\n\r\n let timeOptions = {\r\n responsive: true,\r\n maintainAspectRatio: false,\r\n barShowStroke: false,\r\n onClick: function (event?: MouseEvent, activeElements?: Array<{}>) {\r\n gotoQuestion(activeElements);\r\n },\r\n tooltips: {\r\n callbacks: {\r\n label: function (tooltipItem: any, data: any) {\r\n var value = data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index];\r\n return Math.round(value) + \" seconds\";\r\n },\r\n title: function (tooltipItem: any, data: any) {\r\n return \"\";\r\n },\r\n },\r\n },\r\n scales: {\r\n yAxes: [\r\n {\r\n ticks: {\r\n beginAtZero: true,\r\n max: maxQuestionTimeS * 1.5,\r\n min: 0,\r\n stepSize: maxQuestionTimeS,\r\n callback: function (value: string) {\r\n return value + \"s\";\r\n },\r\n },\r\n scaleLabel: {\r\n display: true,\r\n labelString: \"Time\",\r\n },\r\n afterBuildTicks: function (humdaysChart: any) {\r\n humdaysChart.ticks = [];\r\n humdaysChart.ticks.push(0);\r\n humdaysChart.ticks.push(maxQuestionTimeS);\r\n },\r\n },\r\n ],\r\n xAxes: [\r\n {\r\n gridLines: {\r\n display: false,\r\n },\r\n scaleLabel: {\r\n display: false,\r\n labelString: \"Other users correct/points\",\r\n },\r\n },\r\n ],\r\n },\r\n };\r\n\r\n let questionsData = testSessionResult.flatMap((c) => c.Questions);\r\n\r\n for (var i = 0; i < questionsData.length; i++) {\r\n tempOthersTime.push(questionsData[i].AvgDuration);\r\n\r\n if (questionsData[i].TimeSpentMs) {\r\n tempMyTime.push((questionsData[i].TimeSpentMs as number) / 1000);\r\n } else {\r\n tempMyTime.push(0);\r\n }\r\n\r\n timeLabels.push([i + 1]);\r\n timeDatasetOverride[0].backgroundColor.push(\r\n !questionsData[i].IsAnswered\r\n ? \"#DDDCD8\"\r\n : TestSessionHelper.getQuestionColorByState(questionsData[i].State),\r\n );\r\n timeDatasetOverride[1].backgroundColor.push(\"#000000\");\r\n }\r\n\r\n const barData = {\r\n labels: timeLabels,\r\n datasets: [\r\n {\r\n data: tempMyTime,\r\n backgroundColor: timeDatasetOverride[0].backgroundColor,\r\n },\r\n {\r\n data: tempOthersTime,\r\n backgroundColor: timeDatasetOverride[1].backgroundColor,\r\n },\r\n ],\r\n options: {\r\n onClick: gotoQuestion,\r\n },\r\n };\r\n const legendOpts = {\r\n display: false,\r\n };\r\n return (\r\n
\r\n \r\n \r\n \r\n
\r\n \r\n
\r\n \r\n \r\n \r\n Correct\r\n \r\n \r\n \r\n \r\n Incorrect\r\n \r\n \r\n \r\n \r\n Partial\r\n \r\n \r\n \r\n \r\n Unanswered\r\n \r\n \r\n \r\n \r\n Other users\r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n );\r\n }\r\n}\r\n","import React, { useState, useEffect } from \"react\";\r\nimport {\r\n Dialog,\r\n DialogTitle,\r\n DialogContent,\r\n DialogActions,\r\n Button,\r\n TextField,\r\n CircularProgress,\r\n DialogContentText,\r\n Typography,\r\n useTheme,\r\n useMediaQuery,\r\n} from \"@material-ui/core\";\r\nimport { useSendFeedback } from \"../../../services/feedback.service\";\r\nimport Send from \"@material-ui/icons/Send\";\r\nimport { useTracker } from \"../../../analytics/trackerContext\";\r\nimport { PostState } from \"../../../services/useFetchPostApiData\";\r\nimport { SendQuestionFeedbackCommand } from \"../../../models/preplabModels\";\r\n\r\ninterface IQuestionFeedbackProps {\r\n questionName: string;\r\n questionId: string;\r\n open: boolean;\r\n onClose: () => void;\r\n}\r\n\r\nexport const QuestionFeedbackDialog = ({ questionName, questionId, open, onClose }: IQuestionFeedbackProps) => {\r\n const [message, setMessage] = useState(\"\");\r\n\r\n const track = useTracker();\r\n\r\n const [response, sendFeedback] = useSendFeedback();\r\n const onCloseCallback = React.useCallback(onClose, []);\r\n\r\n const progressStyle = {\r\n position: \"absolute\" as \"absolute\",\r\n top: \"50%\",\r\n left: \"50%\",\r\n marginTop: -12,\r\n marginLeft: -12,\r\n };\r\n\r\n const theme = useTheme();\r\n const fullScreen = useMediaQuery(theme.breakpoints.down(\"sm\"));\r\n\r\n useEffect(() => {\r\n if (response.status === PostState.Success && message !== \"\") {\r\n onCloseCallback();\r\n }\r\n }, [message, onCloseCallback, response.status]);\r\n\r\n const closeDialog = () => {\r\n onClose();\r\n };\r\n\r\n const handleChange = (event: React.ChangeEvent) => {\r\n setMessage(event.target.value);\r\n };\r\n\r\n const sendFeedbackHandler = (event: any) => {\r\n event.preventDefault();\r\n\r\n if (message) {\r\n let questionFeedback: SendQuestionFeedbackCommand = {\r\n QuestionId: questionId,\r\n FeedbackMessage: message,\r\n };\r\n\r\n sendFeedback(questionFeedback);\r\n\r\n track.trackAction({\r\n eventAction: \"Question Feedback Sent\",\r\n eventCategory: \"Feedback\",\r\n eventLabel: questionName,\r\n });\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n \r\n Question feedback\r\n \r\n Help us improve by sending us your feedback\r\n \r\n {response.status === PostState.Error && (\r\n \r\n {response.error}\r\n \r\n )}\r\n \r\n \r\n \r\n\r\n }\r\n >\r\n {response.status === PostState.Sending ? \"Sending...\" : \"Send\"}\r\n {response.status === PostState.Sending && }\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import { SendQuestionFeedbackCommand } from \"./../models/preplabModels\";\r\nimport { useFetchPostApiData } from \"./useFetchPostApiData\";\r\n\r\nexport const useSendFeedback = () => {\r\n return useFetchPostApiData(\"/api/TestSession/SendQuestionFeedback\");\r\n};\r\n","import React from \"react\";\r\nimport {\r\n Dialog,\r\n useTheme,\r\n useMediaQuery,\r\n DialogTitle,\r\n IconButton,\r\n Typography,\r\n createStyles,\r\n Theme,\r\n makeStyles,\r\n Divider,\r\n} from \"@material-ui/core\";\r\n\r\nimport CloseIcon from \"@material-ui/icons/Close\";\r\nimport { VideoPlayer } from \"./VideoPlayerComponent\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n root: {\r\n margin: 0,\r\n padding: theme.spacing(2),\r\n },\r\n closeButton: {\r\n position: \"absolute\",\r\n right: theme.spacing(1),\r\n top: theme.spacing(1),\r\n color: theme.palette.grey[500],\r\n },\r\n }),\r\n);\r\n\r\ninterface IPlayerDialogProps {\r\n title: string;\r\n videoUrl: string;\r\n open: boolean;\r\n onClose?: () => void;\r\n}\r\n\r\nexport const PlayerDialog = ({ open, title, videoUrl, onClose }: IPlayerDialogProps) => {\r\n const classes = useStyles();\r\n\r\n const theme = useTheme();\r\n const fullScreen = useMediaQuery(theme.breakpoints.down(\"sm\"));\r\n\r\n const handleClose = () => {\r\n if (onClose) onClose();\r\n };\r\n\r\n return (\r\n <>\r\n \r\n \r\n {title}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import React from \"react\";\r\nimport {\r\n Typography,\r\n AccordionSummary,\r\n AccordionDetails,\r\n AccordionActions,\r\n Card,\r\n CardContent,\r\n Button,\r\n Grid,\r\n FormLabel,\r\n makeStyles,\r\n Theme,\r\n createStyles,\r\n CardMedia,\r\n Tooltip,\r\n Accordion,\r\n} from \"@material-ui/core\";\r\nimport { TestSessionHelper } from \"../../common/testSessionHelper\";\r\nimport { QuestionFeedbackDialog } from \"../../components/Shared/QuestionFeedback/QuestionFeedbackComponent\";\r\nimport ExpandMoreIcon from \"@material-ui/icons/ExpandMore\";\r\nimport { SingleOptionSelectionList } from \"../practice/TestSession/SingleOptionSelectionList\";\r\nimport { MostLeastOptionSelectionList } from \"../practice/TestSession/MostLeastOptionSelectionList\";\r\nimport { useState } from \"react\";\r\nimport FeedbackOutlinedIcon from \"@material-ui/icons/FeedbackOutlined\";\r\nimport { green, yellow, red } from \"@material-ui/core/colors\";\r\nimport { PlayerDialog } from \"../../components/VideoPlayer/PlayerDialog\";\r\nimport { SessionResultCategoryViewModel } from \"../../models/preplabModels\";\r\n\r\nconst useStyles: any = makeStyles((theme: Theme) =>\r\n createStyles({\r\n appBar: {\r\n position: \"relative\",\r\n },\r\n title: {\r\n marginLeft: theme.spacing(2),\r\n flex: 1,\r\n },\r\n grid: {\r\n marginTop: theme.spacing(2),\r\n },\r\n card: {},\r\n media: {\r\n height: \"100%\",\r\n width: \"100%\",\r\n },\r\n textDefault: {\r\n color: theme.palette.primary.main,\r\n },\r\n textCorrect: {\r\n color: green.A700,\r\n },\r\n textIncorrect: {\r\n color: red.A700,\r\n },\r\n textPartial: {\r\n color: yellow.A700,\r\n },\r\n }),\r\n);\r\n\r\ninterface IResultQuestionsProps {\r\n testSessionResult: SessionResultCategoryViewModel;\r\n}\r\n\r\nexport const ResultQuestionsComponent = ({ testSessionResult }: IResultQuestionsProps) => {\r\n const classes = useStyles();\r\n\r\n const [openFeedback, setOpenFeedback] = useState({ open: false, questionId: \"\", questionName: \"\" });\r\n const [openVideoPlayer, setOpenVideoPlayer] = useState({ open: false, videoUrl: \"\" });\r\n\r\n const showFeedbackDialog = (questionId: string, questionName: string) => {\r\n setOpenFeedback({ open: true, questionId: questionId, questionName: questionName });\r\n };\r\n\r\n const showVideoPlayer = (videoUrl: string) => {\r\n setOpenVideoPlayer({ open: true, videoUrl: videoUrl });\r\n };\r\n\r\n const closeFeedbackDialog = () => {\r\n setOpenFeedback({ ...openFeedback, open: false });\r\n };\r\n\r\n const getColor = (state: number) => {\r\n switch (state) {\r\n case 0:\r\n return classes.textIncorrect;\r\n case 1:\r\n return classes.textCorrect;\r\n case 2:\r\n return classes.textPartial;\r\n default:\r\n return classes.textDefault;\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n {testSessionResult.Questions.map((question, index) => (\r\n \r\n }>\r\n \r\n \r\n <\\\"\\']*?(?:([\\\"\\']).*?\\1)?[^><\\'\\\"]*?)+(?:>|$)/g, \"\") //eslint-disable-line\r\n .slice(0, 60)\r\n .trim()}...`,\r\n }}\r\n >\r\n {question.IsViewed ? (\r\n question.IsAnswered ? (\r\n <>\r\n \r\n \r\n {TestSessionHelper.getQuestionLabelByState(question.State)}\r\n \r\n \r\n \r\n ) : (\r\n <>\r\n Question unanswered\r\n \r\n )\r\n ) : (\r\n <>\r\n Question not viewed\r\n \r\n )}\r\n \r\n \r\n \r\n Time\r\n \r\n \r\n {question.TimeSpentMs ? (\r\n <>{Math.round(question.TimeSpentMs / 1000)} s\r\n ) : (\r\n <>{0} s\r\n )}\r\n \r\n \r\n \r\n \r\n Avg. Time\r\n \r\n \r\n {question.AvgDuration ? <>{question.AvgDuration}s : <>{0}s}\r\n \r\n \r\n \r\n \r\n Other users\r\n \r\n \r\n {question.Percent ? <>{question.Percent}% : <>{0}%}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {question.Image && (\r\n \r\n {question.Title}\r\n \r\n )}\r\n \r\n \r\n \r\n {question && question.IsSingleCorrect && (\r\n null}\r\n onPlayVideo={showVideoPlayer}\r\n />\r\n )}\r\n\r\n {question && !question.IsSingleCorrect && (\r\n null}\r\n onSelectLeastEffective={() => null}\r\n onPlayVideo={showVideoPlayer}\r\n />\r\n )}\r\n \r\n \r\n \r\n \r\n showFeedbackDialog(question.Id, question.Title)}\r\n endIcon={}\r\n >\r\n Feedback\r\n \r\n \r\n \r\n ))}\r\n \r\n setOpenVideoPlayer({ ...openVideoPlayer, open: false })}\r\n />\r\n \r\n );\r\n};\r\n","import React from \"react\";\r\nimport { Card, CardContent, CardHeader, Grid, Box, Typography } from \"@material-ui/core\";\r\nimport { SessionResultCategoryViewModel } from \"../../models/preplabModels\";\r\n\r\ninterface ICategoryResultsComponent {\r\n categories: Array;\r\n}\r\n\r\nexport const CategoryResultsComponent = ({ categories }: ICategoryResultsComponent) => {\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n Score\r\n \r\n \r\n\r\n \r\n \r\n Time\r\n \r\n \r\n \r\n {categories.length > 0 &&\r\n categories.map((cat, index) => (\r\n \r\n \r\n \r\n {cat.DisplayName}\r\n \r\n \r\n \r\n \r\n {cat.CorrectNormalized}%\r\n \r\n \r\n \r\n \r\n {cat.TotalTimeSpentS}s\r\n \r\n \r\n \r\n ))}\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import React, { useEffect } from \"react\";\r\nimport { ResultAnswersComponent } from \"./ResultAnswersComponent\";\r\nimport { ResultTimeScoreComponent } from \"./ResultTimeScoreComponent\";\r\nimport { ResultQuestionsComponent } from \"./ResultQuestionsComponent\";\r\nimport { CategoryResultsComponent } from \"./CategoryResultsComponent\";\r\nimport { Grid, Typography } from \"@material-ui/core\";\r\nimport { ProgressComponent } from \"../../components/Shared/Progress/ProgressComponent\";\r\nimport { ErrorComponent } from \"../error/ErrorComponent\";\r\nimport { useParams } from \"react-router-dom\";\r\nimport { useGetTestSessionData } from \"../../services/testSession.service\";\r\nimport { StoreActions, useGlobalStoreDispatch } from \"../../storage/GlobalStoreContext\";\r\nimport { FetchStatus } from \"../../services/useFetchApiData\";\r\n\r\nexport const ResultContainer = () => {\r\n const { id } = useParams<{ id: string }>();\r\n\r\n let param = id ? id : \"\";\r\n\r\n const [status, error, testSessionResult] = useGetTestSessionData(param);\r\n\r\n const dispatch = useGlobalStoreDispatch();\r\n\r\n useEffect(() => {\r\n dispatch({ type: StoreActions.SetPageTitle, payload: \"Test Summary\" });\r\n }, [dispatch]);\r\n\r\n return (\r\n <>\r\n \r\n {status === FetchStatus.Loading ? (\r\n \r\n ) : status === FetchStatus.Error ? (\r\n \r\n ) : (\r\n <>\r\n \r\n {testSessionResult && Test session results}\r\n \r\n \r\n \r\n {testSessionResult && }\r\n \r\n \r\n {testSessionResult && (\r\n \r\n )}\r\n \r\n \r\n \r\n {testSessionResult && testSessionResult.Categories[0] && (\r\n null}\r\n />\r\n )}\r\n \r\n\r\n {testSessionResult &&\r\n testSessionResult.Categories.map((category, index) => (\r\n \r\n \r\n \r\n {category.DisplayName} details\r\n \r\n \r\n \r\n Score\r\n \r\n \r\n {category.CorrectNormalized}%\r\n \r\n \r\n \r\n \r\n Total time spent\r\n \r\n \r\n {category.TotalTimeSpentS}s\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ))}\r\n \r\n )}\r\n \r\n \r\n );\r\n};\r\n","import React, { useState, FunctionComponent } from \"react\";\r\nimport {\r\n Dialog,\r\n DialogContent,\r\n Button,\r\n useMediaQuery,\r\n useTheme,\r\n MobileStepper,\r\n makeStyles,\r\n createStyles,\r\n Theme,\r\n Grid,\r\n Typography,\r\n SvgIconProps,\r\n} from \"@material-ui/core\";\r\n\r\nimport { StoreActions, useGlobalStore, useGlobalStoreDispatch } from \"../../storage/GlobalStoreContext\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n stepper: {\r\n flexGrow: 1,\r\n backgroundColor: theme.palette.background.paper,\r\n },\r\n dialogPaper: {},\r\n slideRoot: {\r\n width: \"100%\",\r\n maxWidth: \"400px\",\r\n },\r\n sliderIcon: {\r\n width: 150,\r\n height: 150,\r\n },\r\n }),\r\n);\r\n\r\ninterface IOnBoardingDialogProps {\r\n settingsKey: string;\r\n onDismiss?: () => void;\r\n}\r\n\r\nexport const OnBoardingDialog: React.FunctionComponent = ({\r\n settingsKey,\r\n onDismiss,\r\n children,\r\n}) => {\r\n const classes = useStyles();\r\n\r\n const settingsName = `app.onboarding.show.${settingsKey}`;\r\n\r\n const { appSettings } = useGlobalStore();\r\n const dispatch = useGlobalStoreDispatch();\r\n\r\n const [isOpen, setOpen] = useState((appSettings[settingsName] as boolean) ?? true);\r\n const [activeStep, setActiveStep] = useState(0);\r\n\r\n const theme = useTheme();\r\n const fullScreen = useMediaQuery(theme.breakpoints.down(\"sm\"));\r\n\r\n let childrenCount = React.Children.count(children) - 1;\r\n\r\n const handleClose = () => {\r\n setOpen(false);\r\n\r\n dispatch({ type: StoreActions.SetAppSettings, payload: { [settingsName]: false } });\r\n\r\n if (onDismiss) onDismiss();\r\n };\r\n\r\n return (\r\n <>\r\n \r\n \r\n <>\r\n \r\n \r\n {React.Children.map(children, (child, index) => {\r\n if (activeStep === index) return child;\r\n })}\r\n \r\n \r\n \r\n \r\n \r\n {activeStep < childrenCount && (\r\n setActiveStep((prevActiveStep) => prevActiveStep + 1)}\r\n >\r\n Next\r\n \r\n )}\r\n {activeStep === childrenCount && (\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport const OnBoardingSlide: FunctionComponent<{\r\n title: string;\r\n text: string;\r\n svgIcon: React.ReactElement;\r\n}> = ({ title, text, svgIcon, children }) => {\r\n const classes = useStyles();\r\n\r\n return (\r\n
\r\n \r\n {React.cloneElement(svgIcon, { className: classes.sliderIcon })}\r\n \r\n {title}\r\n \r\n \r\n \r\n {text}\r\n \r\n \r\n {children}\r\n \r\n
\r\n );\r\n};\r\n","import React from \"react\";\r\nimport { SvgIcon, SvgIconProps } from \"@material-ui/core\";\r\n\r\nexport default (props: SvgIconProps) => (\r\n \r\n \r\n \r\n);\r\n","import React from \"react\";\r\nimport { SvgIcon, SvgIconProps } from \"@material-ui/core\";\r\n\r\nexport default (props: SvgIconProps) => (\r\n \r\n \r\n \r\n);\r\n","import React from \"react\";\r\nimport { SvgIcon, SvgIconProps } from \"@material-ui/core\";\r\n\r\nexport default (props: SvgIconProps) => (\r\n \r\n \r\n \r\n);\r\n","import React from \"react\";\r\nimport { OnBoardingDialog, OnBoardingSlide } from \"./OnBoardingDialog\";\r\nimport CreativeThinking from \"../../assets/icons/CreativeThinking\";\r\nimport TrainingVideo from \"../../assets/icons/TrainingVideo\";\r\nimport GraduationCap from \"../../assets/icons/GraduationCap\";\r\nimport TranslateIcon from \"@material-ui/icons/Translate\";\r\n\r\nexport const WelcomeDialog = () => {\r\n return (\r\n \r\n }\r\n title=\"Choose your language\"\r\n text=\"In the settings page you can choose which language you prefer to practice in, and how many questions to include per test\"\r\n />\r\n\r\n }\r\n title=\"Watch videos lessons\"\r\n text=\"Our educational video lessons are designed by experts in their respective field. Do not miss out on our free videos\"\r\n />\r\n\r\n }\r\n title=\"Build your own tests\"\r\n text=\"Build a complete timed or untimed tests and choose the categories you want to include in your tests\"\r\n />\r\n\r\n }\r\n title=\"Focus on your weaknesses\"\r\n text=\"Train smarter by only focusing on your weaknesses, repeat questions you have gotten wrong or spent too much time on.\"\r\n />\r\n \r\n );\r\n};\r\n","import React from \"react\";\r\nimport { makeStyles, Container } from \"@material-ui/core\";\r\nimport { Route, Redirect, Switch } from \"react-router-dom\";\r\nimport { AppBarComponent } from \"../components/AppBar/AppBarComponent\";\r\nimport { SideBarComponent } from \"../components/SideBar/SideBarComponent\";\r\nimport { InsightsContainer } from \"./insights/InsightsContainer\";\r\nimport { LessonPlayContainer } from \"./lessons/Play/LessonPlayContainer\";\r\nimport { LessonsContainer } from \"./lessons/LessonsContainer\";\r\nimport { SettingsContainer } from \"./settings/SettingsContainer\";\r\nimport { PracticeContainer } from \"./practice/PracticeContainer\";\r\nimport { TimelineContainer } from \"./timeline/TimelineContainer\";\r\nimport { ShopContainer } from \"./shop/ShopContainer\";\r\nimport { ReceiptContainer } from \"./shop/Receipt/ReceiptContainer\";\r\nimport { ResultContainer } from \"./result/ResultContainer\";\r\nimport { useGlobalStore } from \"../storage/GlobalStoreContext\";\r\nimport { WelcomeDialog } from \"../components/OnBoarding/WelcomeDialog\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n appBarSpacer: { ...theme.mixins.toolbar },\r\n\r\n content: {\r\n flex: 1,\r\n padding: theme.spacing(0),\r\n transition: theme.transitions.create(\"margin\", {\r\n easing: theme.transitions.easing.sharp,\r\n duration: theme.transitions.duration.leavingScreen,\r\n }),\r\n },\r\n\r\n container: {\r\n paddingTop: theme.spacing(1),\r\n paddingBottom: theme.spacing(1),\r\n },\r\n}));\r\n\r\nexport const CoreLayout = () => {\r\n const classes = useStyles();\r\n\r\n const globalStore = useGlobalStore();\r\n\r\n const logoPath = globalStore.settings.Logo;\r\n const [state, setState] = React.useState({ mobileSideBarOpen: false });\r\n\r\n const toggleMobileSideBar = (open: boolean) => () => {\r\n setState({ mobileSideBarOpen: open });\r\n };\r\n\r\n return (\r\n <>\r\n \r\n\r\n \r\n\r\n
\r\n
\r\n\r\n \r\n \r\n } />\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n // Redirect all 404's to home\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n","import React, { useEffect, useState } from \"react\";\r\nimport { useAuth0 } from \"../../auth/auth0Context\";\r\nimport { Redirect, useLocation } from \"react-router-dom\";\r\n\r\nexport const LoginContainer = () => {\r\n const { isAuthenticated } = useAuth0();\r\n const location = useLocation();\r\n\r\n const [origin, setOrigin] = useState(\"/practice\");\r\n\r\n useEffect(() => {\r\n let state = location.state as { origin: string };\r\n\r\n if (state?.origin) {\r\n setOrigin(state.origin);\r\n }\r\n }, [location]);\r\n\r\n return <>{isAuthenticated && };\r\n};\r\n","import React from \"react\";\r\nimport { Route, Redirect, useLocation } from \"react-router-dom\";\r\nimport { useAuth0 } from \"../../auth/auth0Context\";\r\n\r\nexport const AuthRoute = ({ component, ...rest }: any) => {\r\n const { isAuthenticated } = useAuth0();\r\n const location = useLocation();\r\n const routeComponent = (props: any) =>\r\n isAuthenticated ? (\r\n React.createElement(component, props)\r\n ) : (\r\n \r\n );\r\n\r\n return ;\r\n};\r\n","import indigo from \"@material-ui/core/colors/indigo\";\r\nimport pink from \"@material-ui/core/colors/pink\";\r\nimport blue from \"@material-ui/core/colors/blue\";\r\nimport blueGrey from \"@material-ui/core/colors/blueGrey\";\r\n\r\nexport class SettingsHelper {\r\n public static getThemePalette(name: string): any {\r\n switch (name.toLowerCase()) {\r\n case \"indigo\":\r\n return indigo;\r\n case \"pink\":\r\n return pink;\r\n case \"blue\":\r\n return blue;\r\n case \"blue-grey\":\r\n case \"bluegrey\":\r\n return blueGrey;\r\n default:\r\n return indigo;\r\n }\r\n }\r\n}\r\n","import React, { useEffect, useState } from \"react\";\r\nimport { Route, Switch, BrowserRouter } from \"react-router-dom\";\r\nimport { MuiThemeProvider, createMuiTheme } from \"@material-ui/core/styles\";\r\nimport { CoreLayout } from \"./pages/CoreLayout\";\r\nimport { LoginContainer } from \"./pages/login/LoginContainer\";\r\nimport { CssBaseline, makeStyles, Grid, Typography, LinearProgress } from \"@material-ui/core\";\r\nimport { AuthRoute } from \"./components/Auth/AuthRoute\";\r\nimport { useFavicon, useTitle } from \"react-use\";\r\nimport { Auth0Provider } from \"./auth/auth0Context\";\r\nimport { useGlobalStore } from \"./storage/GlobalStoreContext\";\r\nimport { TrackerProvider } from \"./analytics/trackerContext\";\r\nimport { SettingsHelper } from \"./common/settingsHelper\";\r\n\r\nconst useStyles = makeStyles(() => ({\r\n root: {\r\n display: \"flex\",\r\n },\r\n}));\r\n\r\nexport const App = () => {\r\n const classes = useStyles();\r\n\r\n const { loading, settings } = useGlobalStore();\r\n\r\n const [title, setTitle] = useState(\"App | Loading...\");\r\n const [theme, setTheme] = useState(createMuiTheme());\r\n\r\n useFavicon(`${settings.ImageRootPath}/favicon.png`);\r\n useTitle(title);\r\n\r\n useEffect(() => {\r\n if (settings.AppName) {\r\n setTitle(`App | ${settings.AppName}`);\r\n }\r\n }, [settings.AppName]);\r\n\r\n useEffect(() => {\r\n if (!loading) {\r\n setTheme(\r\n createMuiTheme({\r\n palette: {\r\n primary: SettingsHelper.getThemePalette(settings.PrimaryPalette ?? \"\"),\r\n secondary: SettingsHelper.getThemePalette(settings.SecondaryPalette ?? \"\"),\r\n },\r\n }),\r\n );\r\n }\r\n }, [loading, settings.PrimaryPalette, settings.SecondaryPalette]);\r\n\r\n const onRedirectCallback = (appState: any) => {\r\n window.history.replaceState(\r\n {},\r\n document.title,\r\n appState && appState.targetUrl ? appState.targetUrl : window.location.pathname,\r\n );\r\n };\r\n\r\n return (\r\n <>\r\n \r\n
\r\n \r\n {loading ? (\r\n \r\n \r\n Loading, Please Wait...\r\n \r\n \r\n \r\n ) : (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n
\r\n
\r\n \r\n );\r\n};\r\n","import \"react-app-polyfill/ie11\";\r\nimport \"react-app-polyfill/stable\";\r\nimport React from \"react\";\r\nimport ReactDOM from \"react-dom\";\r\nimport * as Sentry from \"@sentry/react\";\r\nimport { Integrations } from \"@sentry/tracing\";\r\nimport { App } from \"./App\";\r\nimport { GlobalStoreProvider } from \"./storage/GlobalStoreContext\";\r\nimport { BrowserRouter, Switch, Route } from \"react-router-dom\";\r\n\r\nif (process.env.NODE_ENV === \"production\") {\r\n Sentry.init({\r\n dsn: \"https://1f7319d9fcca43a98da95eb937e82214@o323433.ingest.sentry.io/1823820\",\r\n release: \"preplab-client@\" + process.env.REACT_APP_VERSION,\r\n environment: process.env.NODE_ENV,\r\n integrations: [new Integrations.BrowserTracing()],\r\n tracesSampleRate: 0.05,\r\n });\r\n}\r\n\r\nconst TenantRoot = () => (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n);\r\n\r\nReactDOM.render(, document.getElementById(\"root\"));\r\n"],"sourceRoot":""}