{"version":3,"sources":["components/hooks/envVariables.js","context/user/userContext.js","components/hooks/ProtectedRoute.js","components/hooks/getWindowDimensions.js","components/layout/Navbar.js","components/layout/Footer.js","components/pages/Home.js","components/pages/Community.js","components/pages/Forum.js","components/pages/Discover.js","components/pages/Settings.js","components/pages/Help.js","components/layout/Modals.js","context/user/userReducer.js","context/types.js","context/user/UserState.js","App.js","serviceWorker.js","index.js"],"names":["webEndPoint","communityEndPoint","guestToken","process","userContext","createContext","ProtectedRoute","Component","component","rest","useContext","UserContext","isAuthenticated","toggleLoginModal","isLogout","token","Cookies","get","hasValidCookie","render","props","to","useWindowDimensions","hasWindow","window","getWindowDimensions","winWidth","innerWidth","winHeight","innerHeight","useState","windowDimensions","setWindowDimensions","useEffect","handleResize","addEventListener","removeEventListener","Navbar","selProtectNav","setSelProtectNav","history","useHistory","toggleMobileNav","mobNavState","toggleRegisterModal","logout","navRedirect","doRedirect","redirectTo","setCommunityQuery","location","useLocation","onMenuBtnClick","onLoginBtnClick","isMobile","onLogoutBtnClick","onRegisterBtnClick","onClickNavigateTo","path","push","onClickNavigateProtected","pathname","className","exact","activeClassName","onClick","srcSet","src","alt","getRouteName","Footer","openExtLink","url","newTab","open","assign","Home","isDataReady","setIsDataReady","forumTotalStudents","forumTotalPosts","forumOnlineStudents","fetchForumData","user","getTagFromId","id","tags","find","item","UNID","tag","search","includes","tagsArr","examTag","substring","length","forEach","event","FN","usertags","map","option","idx","key","onClickCommunityWithTag","tagLookupUNID","Community","parsedData","setParsedData","lftColArr","setLftColArr","rgtColArr","setRgtColArr","useParams","onClickBtnChannel","uniqueCategoriesArr","category","midNum","Math","round","slice","divideColumns","tmpArr","tmpCatObj","tmpGrpObj","some","catObj","groups","grpObj","categorySubTitle","exams","title","parseExamData","optionA","idxA","optionB","idxB","optionC","idxC","Forum","showSpinner","setShowSpinner","showSelector","setShowSelector","selectorOption","setSelectorOption","setExamTag","communityQuery","onClickToggleSelector","qsValues","queryString","parse","et","selExam","selTag","indexOf","target","onClickAppPage","exam","frameBorder","seamless","scrolling","onLoad","studentsResultsArr","educatorsResultsArr","animationArr","name","searchFilter","tagUNID","date","isGuest","timer01","timer02","timer03","timer04","Discover","isMapReady","setIsMapReady","studentsFilterArr","setStudentsFilterArr","educatorsFilterArr","setEducatorsFilterArr","inpSearchStudents","setInpSearchStudents","inpSearchEducators","setInpSearchEducators","isStudentsFetching","setIsStudentsFetching","isEducatorsFetching","setIsEducatorsFetching","isMarkersFetching","setIsMarkersFetching","showStudentsSelector","setShowStudentsSelector","showEducatorsSelector","setShowEducatorsSelector","inpStudentsGo","setInpStudentsGo","inpEducatorsGo","setInpEducatorsGo","isMoreStudents","setIsMoreStudents","isMoreEducators","setIsMoreEducators","selectorStudentsOption","setSelectorStudentsOption","refCurStudentsOption","setRefCurStudentsOption","selectorEducatorsOption","setSelectorEducatorsOption","refCurEducatorsOption","setRefCurEducatorsOption","inpStudentsPlaceholder","setInpStudentsPlaceholder","inpEducatorsPlaceholder","setInpEducatorsPlaceholder","studentsListPoolArr","setStudentsListPoolArr","studentsListArr","setStudentsListArr","educatorsListPoolArr","setEducatorsListPoolArr","educatorsListArr","setEducatorsListArr","gMap","setGMap","resultsMapArr","setResultsMapArr","lat","lng","userCoords","setUserCoords","showMapSelector","setShowMapSelector","mapSelectorOption","setMapSelectorOption","mapSelectorArr","setMapSelectorArr","refreshMap","setRefreshMap","isMapAnimating","setIsMapAnimating","curAnimateName","setCurAnimateName","allowSelectorFetch","setAllowSelectorFetch","isMapKeyStudent","setIsMapKeyStudent","zoomLevelStudentsMsg","setZoomLevelStudentsMsg","zoomLevelEducatorsMsg","setZoomLevelEducatorsMsg","isBrandReady","setIsBrandReady","doFirstRun","setDoFirstRun","markersLoading","setMarkersLoading","zoomQuadOut","setZoomQuadOut","nextExamDate","setNextExamDate","sailOn","setSailOn","refMap","useRef","refInpStudents","refInpEducators","animateInterval","animateIndex","mapBounds","boundsChanged","curAnimateObj","markersArr","curSearchFilter","curTagUNID","getDiscoverData","getMarkersData","clearMarkersData","studentsData","educatorsData","markersData","errorStudents","errorEducators","errorMarkers","getSearchFilterData","searchFilterData","nowUnmountDiscover","callApiGuestUser","setDiscoverPreview","routeMatch","useRouteMatch","isPreview","isExact","renderMap","mapsApi","google","maps","mapOptions","center","mapTypeId","MapTypeId","ROADMAP","mapTypeControl","navigationControl","streetViewControl","disableDefaultUI","clickableIcons","panControl","zoomControl","scaleControl","zoom","minZoom","maxZoom","controlSize","zoomControlOptions","style","ZoomControlStyle","DEFAULT","position","ControlPosition","RIGHT_BOTTOM","styles","newMap","Map","current","overlay","OverlayView","draw","this","getPanes","markerLayer","setMap","DayNightOverlay","fillColor","renderMarkers","mkrArr","newMkrArr","tmpMkrArr","pinImg","i","pin","pinIcon","size","Size","scaledSize","origin","Point","anchor","marker","Marker","icon","optimized","typ","addListener","onClickPinSearch","cid","optionArr","filter","Tag","onClickSelectorOption","curSelector","computeRadius","radius","bounds","getBounds","getCenter","ne","getNorthEast","geometry","spherical","computeDistanceBetween","fetchMapData","mapCoords","qParams","nelat","neLng","swLat","getSouthWest","swLng","mapRadius","mapCenterLat","mapCenterLng","userLat","userLng","searchType","fetchListData","type","searchName","navigator","geolocation","getCurrentPosition","curPos","coords","latitude","longitude","error","console","log","enableHighAccuracy","maximumAge","timeout","onClickListSearch","focus","triggeredBy","onKeyupList","showMoreResults","nextStudents","splice","nextEducators","renderTagList","userTags","tagName","onClickMapToggleSelector","animateMarkers","delay","updateMarkers","hasStoredMarkers","setTimeout","setMapKeyMsgs","getZoom","initiateComponent","clearTimeout","newNeLat","newNeLng","newSwLat","newSwLng","curNeLat","curNeLng","curSwLat","curSwLng","studentIdx","findIndex","Title","examsArr","tagdate","updateMapSelectorArray","setOptions","brandDelay","drawBtnUserCntr","setZoom","panTo","drawMapSelector","today","Date","exDtArr","split","examDate","getTime","diffTime","numWeeks","abs","txtWeek","onClickMapSelectorOption","drawBtnAnimate","drawZoomKey","drawBrandScreen","drawCloudPilot","tgt","ref","maxLength","value","onKeyUp","onFocus","onChange","placeholder","tabIndex","ftn","st","cy","tn","disabled","typeStatus","showEducatorStatus","web","ct","Settings","recEmails","setRecEmails","showName","setShowName","showTags","setShowTags","showPin","setShowPin","inpStatusMsg","setInpStatusMsg","newPassword","setNewPassword","newConfirm","setNewConfirm","userTagsArr","setUserTagsArr","examTagsArr","setExamTagsArr","newPasswordValid","setNewPasswordValid","newConfirmValid","setNewConfirmValid","newPasswordVisible","setNewPasswordVisible","newConfirmVisible","setNewConfirmVisible","updateUserData","errorStatus","errorTag","errorChkbox","errorPassword","isStatusFetching","isTagFetching","isPasswordFetching","onChangeValidate","validate","maxValue","methods","test","update","compareTo","onChangeCheckbox","state","checked","updateType","updatetype","permissiondigest","permissions","setbit","applyServerDataToView","userData","examArr","uTagsIdArr","removeUsersTags","userExamArr","tagMatch","addTagNames","status","togglePwdVisibility","method","userFN","userSN","SN","getUserName","htmlFor","onClickRemoveTag","chosenItemArr","taglookupUNID","isWPM","minLength","pattern","newpassword","Help","address","href","Modals","currentYear","setCurrentYear","inpLoginEmail","setInpLoginEmail","inpLoginPassword","setInpLoginPassword","inpForgotId","setInpForgotId","inpForgotEmail","setInpForgotEmail","inpRegisterId","setInpRegisterId","inpRegisterDay","setInpRegisterDay","inpRegisterMonth","setInpRegisterMonth","inpRegisterYear","setInpRegisterYear","inpRegisterPassword","setInpRegisterPassword","inpRegisterConfirm","setInpRegisterConfirm","inpRememberMe","setInpRememberMe","switchToLogin","setSwitchToLogin","switchToRegister","setSwitchToRegister","isForgotPassword","setIsForgotPassword","loginEmailValid","setLoginEmailValid","loginPwdValid","setLoginPwdValid","forgotEmailValid","setForgotEmailValid","forgotIdValid","setForgotIdValid","registerIdValid","setRegisterIdValid","registerDayValid","setRegisterDayValid","registerMonthValid","setRegisterMonthValid","registerYearValid","setRegisterYearValid","registerPwdValid","setRegisterPwdValid","registerCfmValid","setRegisterCfmValid","btnLoginDisabled","setBtnLoginDisabled","btnForgotDisabled","setBtnForgotDisabled","btnRegisterDisabled","setBtnRegisterDisabled","loginPwdVisible","setLoginPwdVisible","registerPwdVisible","setRegisterPwdVisible","registerCfmVisible","setRegisterCfmVisible","refLoginEmail","refLoginPwd","refForgotEmail","refForgotId","refRegisterId","refRegisterDay","refRegisterMonth","refRegisterYear","refRegisterPwd","refRegisterCfm","showLogin","showRegister","showRegSuccessMsg","login","resetPassword","isFetching","forgotPwdMsg","resetForgotPwdMsg","register","toggleAttest","toggleAttestModal","toggleRegSuccessMsgModal","Modal","setAppElement","onKeyupFocusNext","nextInp","numArr","valArr","validNum","validity","valid","resetLoginInputs","resetRegisterInputs","hideLogin","hideRegister","onClickLogin","setInputErrorMsg","username","password","code","rememberMe","onClickRegister","onClickBackToLogin","onClickExtUrl","isValid","inpRef","msg","nextSibling","innerHTML","getFullYear","isOpen","overlayClassName","shouldCloseOnOverlayClick","shouldCloseOnEsc","onRequestClose","onAfterClose","closeTimeoutMS","RegistrationCode","Email","onKeyupLogin","rel","reqData","regId","dob","onKeyupRegister","action","payload","totalPosts","totalStudents","onlineStudents","isTagRemoveFetching","errorEmail","unmountDiscover","discoverPreview","UserState","useReducer","UserReducer","dispatch","cookies","setFetching","fetchingType","getFetchingType","getErrorType","callApiUser","a","axios","resObj","data","errorCode","errorDescription","reqObj","config","headers","post","authenticate","posts","postCounts","count","toLocaleString","usersCount","sessions","errorType","encodeURIComponent","put","queryObj","params","Id","list","types","Provider","query","children","App","Boolean","hostname","match","ReactDOM","document","getElementById","serviceWorker","ready","then","registration","unregister","catch","message"],"mappings":"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","file":"static/js/main.19c51d58.chunk.js","sourcesContent":["// Reference endpoints from environment file.\r\nlet webEndPoint;\r\nlet communityEndPoint;\r\nlet googleMapKey;\r\nlet guestToken;\r\n\r\nif ( process.env.NODE_ENV !== 'production' ) {\r\n \r\n webEndPoint = process.env.REACT_APP_WEB_ENDPOINT;\r\n communityEndPoint = process.env.REACT_APP_COMMUNITY_ENDPOINT;\r\n googleMapKey = process.env.REACT_APP_GOOGLE_MAP_KEY;\r\n guestToken = process.env.REACT_APP_GUEST_TOKEN;\r\n \r\n}\r\nelse {\r\n \r\n // TODO: Properly implement endpoints environent file.\r\n webEndPoint = process.env.REACT_APP_WEB_ENDPOINT;\r\n communityEndPoint = process.env.REACT_APP_COMMUNITY_ENDPOINT;\r\n googleMapKey = process.env.REACT_APP_GOOGLE_MAP_KEY;\r\n guestToken = process.env.REACT_APP_GUEST_TOKEN;\r\n \r\n}\r\n\r\nexport { webEndPoint, communityEndPoint, googleMapKey, guestToken };\r\n","import { createContext } from 'react';\r\n\r\n\r\nconst userContext = createContext();\r\n\r\nexport default userContext;","import React, { useContext } from 'react';\r\nimport { Route, Redirect } from 'react-router-dom';\r\nimport Cookies from 'universal-cookie';\r\n\r\nimport { guestToken } from '../hooks/envVariables';\r\nimport UserContext from '../../context/user/userContext';\r\n\r\n\r\nconst ProtectedRoute = ({ component: Component, ...rest }) => {\r\n \r\n // Reference context apis.\r\n const userContext = useContext(UserContext);\r\n \r\n // Destructure contexts.\r\n const { isAuthenticated, \r\n toggleLoginModal,\r\n isLogout } = userContext;\r\n \r\n // Check we have a valid 'learningcommunity' cookie (not a guest cookie).\r\n const cookies = new Cookies();\r\n const token = cookies.get('learningcommunity');\r\n const hasValidCookie = typeof token !== 'undefined' && token !== guestToken ? true : false;\r\n \r\n return { \r\n \r\n switch (isAuthenticated && hasValidCookie) {\r\n case true:\r\n return ;\r\n case false:\r\n \r\n // Open a login modal & redirect to home page.\r\n // Unless the user has just logged out.\r\n if ( !isLogout ) toggleLoginModal(true);\r\n \r\n return ;\r\n default:\r\n return null; \r\n }\r\n \r\n }}/>\r\n}\r\n\r\nexport default ProtectedRoute;\r\n","import { useState, useEffect } from 'react';\r\n\r\n\r\nconst useWindowDimensions = () => {\r\n\r\n const hasWindow = typeof window !== 'undefined';\r\n\r\n function getWindowDimensions() {\r\n \r\n const winWidth = hasWindow ? window.innerWidth : null;\r\n const winHeight = hasWindow ? window.innerHeight : null;\r\n \r\n return {\r\n winWidth,\r\n winHeight,\r\n };\r\n \r\n }\r\n\r\n const [windowDimensions, setWindowDimensions] = useState(getWindowDimensions());\r\n\r\n useEffect(() => {\r\n \r\n if (hasWindow) {\r\n \r\n function handleResize() {\r\n \r\n setWindowDimensions(getWindowDimensions());\r\n \r\n }\r\n\r\n window.addEventListener('resize', handleResize);\r\n \r\n return () => window.removeEventListener('resize', handleResize);\r\n \r\n }\r\n \r\n // The eslint comment below removes missing dependency warning from console.\r\n // eslint-disable-next-line\r\n }, [hasWindow]);\r\n\r\n return windowDimensions;\r\n \r\n}\r\n\r\nexport default useWindowDimensions;\r\n","import React, { useState, useContext, useEffect } from 'react';\r\nimport { NavLink, useLocation } from 'react-router-dom';\r\nimport { useHistory } from 'react-router-dom';\r\n\r\nimport UserContext from '../../context/user/userContext';\r\nimport useWindowDimensions from '../hooks/getWindowDimensions';\r\n\r\n\r\nconst Navbar = () => {\r\n \r\n // Define components state.\r\n const [selProtectNav, setSelProtectNav] = useState(null);\r\n \r\n // Reference hooks.\r\n const history = useHistory();\r\n \r\n // Reference context apis.\r\n const userContext = useContext(UserContext);\r\n \r\n // Destructure contexts.\r\n const { toggleMobileNav, \r\n mobNavState, \r\n toggleLoginModal, \r\n toggleRegisterModal, \r\n isAuthenticated, \r\n logout, \r\n navRedirect, \r\n doRedirect, \r\n redirectTo, \r\n setCommunityQuery } = userContext;\r\n \r\n // Get current route info.\r\n const location = useLocation();\r\n \r\n // Get window dimensions.\r\n const { winWidth } = useWindowDimensions();\r\n \r\n \r\n /*\r\n * Component methods.\r\n */\r\n \r\n // Method to return current route name.\r\n const getRouteName = (location) => {\r\n\r\n switch (location.pathname) {\r\n case '/':\r\n return 'Home';\r\n case '/community':\r\n return 'Community';\r\n case '/discover':\r\n return 'Discover';\r\n case '/settings':\r\n return 'Settings';\r\n case '/help':\r\n return 'Help';\r\n default:\r\n return 'Home';\r\n }\r\n \r\n }\r\n \r\n // Handle Menu button clicks.\r\n const onMenuBtnClick = () => {\r\n \r\n const newState = !mobNavState;\r\n \r\n toggleMobileNav(newState); \r\n \r\n }\r\n \r\n // Handle Login button clicks.\r\n const onLoginBtnClick = (isMobile) => {\r\n \r\n if ( isMobile ) onMenuBtnClick();\r\n \r\n // Open a login modal through the context api.\r\n toggleLoginModal(true);\r\n \r\n }\r\n \r\n // Handle Logout button clicks.\r\n const onLogoutBtnClick = (isMobile) => {\r\n \r\n if ( isMobile ) onMenuBtnClick();\r\n \r\n logout();\r\n \r\n // Navigate user to logout page.\r\n window.location = \"/home/logout\";\r\n \r\n }\r\n \r\n // Handle Register button clicks.\r\n const onRegisterBtnClick = (isMobile) => {\r\n \r\n if ( isMobile ) onMenuBtnClick();\r\n \r\n // Open a login modal through the context api.\r\n toggleRegisterModal(true);\r\n \r\n }\r\n \r\n // Handle app navigation clicks.\r\n const onClickNavigateTo = (path) => {\r\n \r\n // Reset Community tag.\r\n setCommunityQuery(null);\r\n \r\n // Navigate using history push.\r\n history.push('/' + path);\r\n \r\n toggleMobileNav(false); \r\n \r\n }\r\n \r\n // Before handling navigation check if isAuthenticated.\r\n const onClickNavigateProtected = (path, isMobile) => {\r\n \r\n // Reset Community tag.\r\n setCommunityQuery(null);\r\n \r\n // If user isAuthenticated navigate to page.\r\n if ( isAuthenticated ) onClickNavigateTo(path);\r\n \r\n // Else open Login modal, on login navigate to page.\r\n else {\r\n \r\n navRedirect({ doRedirect: true, redirectTo: path });\r\n toggleLoginModal(true);\r\n \r\n }\r\n \r\n if ( isMobile ) toggleMobileNav(false); \r\n \r\n }\r\n \r\n /*\r\n * Component hooks.\r\n */\r\n \r\n useEffect(() => {\r\n \r\n // Highlight protected navlinks.\r\n switch (location.pathname) {\r\n case '/community':\r\n setSelProtectNav('community');\r\n break;\r\n case '/discover':\r\n setSelProtectNav('discover');\r\n break;\r\n default:\r\n setSelProtectNav(null);\r\n }\r\n \r\n // Close mobile menu if user shrinks screen.\r\n if ( winWidth > 767 ) toggleMobileNav(false);\r\n \r\n // If user is authenticated and 'doRedirect'is true,\r\n // then navigate to preset route and reset context state.\r\n if ( doRedirect && isAuthenticated ) {\r\n \r\n onClickNavigateTo(redirectTo);\r\n navRedirect({ doRedirect: false, redirectTo: null });\r\n \r\n }\r\n \r\n // The eslint comment below removes missing dependency warning from console.\r\n // eslint-disable-next-line\r\n }, [location, winWidth, doRedirect, isAuthenticated]); \r\n \r\n \r\n /*\r\n * Component view.\r\n */\r\n return (\r\n \r\n );\r\n \r\n}\r\n\r\nexport default Navbar;\r\n","import React from 'react';\r\n\r\n\r\nconst Footer = () => {\r\n \r\n const openExtLink = (url, newTab) => {\r\n \r\n if ( newTab ) window.open(url);\r\n else window.location.assign(url);\r\n \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\nexport default Footer;\r\n","import React, { useContext, useEffect, useState } from 'react';\r\nimport { useHistory, useLocation } from 'react-router-dom';\r\nimport Cookies from 'universal-cookie';\r\n\r\nimport { guestToken } from '../hooks/envVariables';\r\nimport Footer from '../layout/Footer';\r\nimport UserContext from '../../context/user/userContext';\r\n\r\n\r\nconst Home = () => {\r\n \r\n // Define components state hooks.\r\n const [isDataReady, setIsDataReady] = useState(false);\r\n const [firstLoad, setFirstLoad] = useState(false);\r\n \r\n // Reference context apis.\r\n const userContext = useContext(UserContext);\r\n \r\n // Reference hooks.\r\n const history = useHistory();\r\n const location = useLocation();\r\n \r\n // Destructure contexts.\r\n const { toggleMobileNav, \r\n isAuthenticated, \r\n toggleLoginModal, \r\n toggleRegisterModal, \r\n forumTotalPosts, \r\n forumTotalStudents, \r\n forumOnlineStudents, \r\n fetchForumData, \r\n user, \r\n isLogout,\r\n navRedirect, \r\n setCommunityQuery } = userContext;\r\n \r\n\r\n /*\r\n * Component methods.\r\n */\r\n \r\n const onClickLogin = () => {\r\n \r\n // Open a login modal through the context api.\r\n toggleLoginModal(true);\r\n \r\n }\r\n \r\n const onClickRegister = () => {\r\n \r\n // Open a login modal through the context api.\r\n toggleRegisterModal(true);\r\n \r\n }\r\n \r\n const onClickNavigateTo = path => {\r\n \r\n // Reset Community tag.\r\n setCommunityQuery(null);\r\n \r\n // Navigate to the path using history push.\r\n history.push('/' + path);\r\n \r\n }\r\n \r\n const onClickAppPage = event => {\r\n \r\n // Hide the mobile nav, even if not open.\r\n toggleMobileNav(false);\r\n \r\n }\r\n \r\n // Before handling navigation check if isAuthenticated.\r\n const onClickNavigateProtected = (path) => {\r\n \r\n // Reset Community tag.\r\n setCommunityQuery(null);\r\n \r\n // If user isAuthenticated navigate to page.\r\n if ( isAuthenticated ) {\r\n \r\n history.push('/' + path);\r\n \r\n toggleMobileNav(false);\r\n \r\n }\r\n \r\n // Else open Login modal, on login navigate to page.\r\n else {\r\n \r\n navRedirect({ doRedirect: true, redirectTo: path });\r\n toggleLoginModal(true);\r\n \r\n }\r\n \r\n toggleMobileNav(false); \r\n \r\n }\r\n \r\n // Navigate to the Community with a defined tag.\r\n const onClickCommunityWithTag = id => {\r\n \r\n // Get tags acronym. \r\n const tag = getTagFromId(id);\r\n \r\n // Set tag.\r\n setCommunityQuery('/tag?et=' + tag);\r\n \r\n // Navigate to the Community/Forum page using history push.\r\n history.push('/community/forum');\r\n \r\n }\r\n \r\n // Return the tags acronym using the 'tagLookupUNID'.\r\n const getTagFromId = id => {\r\n \r\n const item = user.tags.find(item => item.UNID === id);\r\n \r\n return item.tag;\r\n \r\n }\r\n \r\n \r\n \r\n \r\n /*\r\n * Component hooks.\r\n */\r\n \r\n useEffect(() => {\r\n \r\n // Fetch forum data.\r\n fetchForumData();\r\n \r\n // Show the home page.\r\n setIsDataReady(true);\r\n\r\n // The eslint comment below removes missing dependency warning from console.\r\n // eslint-disable-next-line\r\n }, []);\r\n \r\n useEffect(() => {\r\n\r\n // If url is a DEEPLINK then direct user to either \r\n // Community home or an exam channel in the forum\r\n if ( location.search.includes('?et=') ) {\r\n \r\n // Check we have a valid 'learningcommunity' cookie (not a guest cookie).\r\n const cookies = new Cookies();\r\n const token = cookies.get('learningcommunity');\r\n const hasValidCookie = typeof token !== 'undefined' && token !== guestToken ? true : false;\r\n \r\n // If we have a valid cookie we\r\n // can go to the protected page.\r\n if ( hasValidCookie ) {\r\n \r\n // When we have User data we can \r\n // check if our url exam tag is valid.\r\n if ( user !== null ) {\r\n \r\n const tagsArr = [];\r\n const examTag = location.search.substring(4, location.search.length);\r\n \r\n // Array holding all valid tags.\r\n user.tags.forEach(item => tagsArr.push(item.tag));\r\n \r\n // Tag is VALID, set channel path & go to forum.\r\n if ( tagsArr.includes(examTag) ) {\r\n \r\n setCommunityQuery('/tag?et=' + examTag);\r\n history.push('/community/forum');\r\n \r\n }\r\n \r\n // Tag is INVALID, clear path & go to Community home.\r\n else navRedirect({ doRedirect: true, redirectTo: 'community' });\r\n \r\n }\r\n \r\n }\r\n \r\n // We don't have a valid cookie so redirect \r\n // user to Community home & allow them to log in.\r\n else {\r\n \r\n navRedirect({ doRedirect: true, redirectTo: 'community' });\r\n toggleLoginModal(true);\r\n \r\n }\r\n \r\n }\r\n\r\n }, [user]);\r\n \r\n \r\n /*\r\n * Component view.\r\n */\r\n return (\r\n <>\r\n { isDataReady ?\r\n
onClickAppPage(event)}>\r\n
\r\n
\r\n
\r\n Learning Community\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n { isAuthenticated ? \r\n <>\r\n

Welcome to the learning community {user.FN}

\r\n

\r\n Keep your up to date for more personalised content\r\n

\r\n \r\n :\r\n <>\r\n {/*

{forumTotalPosts} posts by {forumTotalStudents} students

*/}\r\n

\r\n or to get full access to the ACCA Learning Community\r\n

\r\n

\r\n We are aware of a problem that is impacting students trying to register for the ACCA Learning Community and we're working to resolve this as quickly as possible. We apologise for the disruption and will update you as soon as we can.\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 {forumOnlineStudents} students online now\r\n

\r\n

Share tips, ideas and questions with an international community of students.

\r\n { ( isAuthenticated && user.usertags.length > 0 ) &&\r\n <>\r\n
\r\n
    \r\n {user.usertags.map((option, idx) => {\r\n return (\r\n
  • \r\n \r\n
  • \r\n );\r\n })}\r\n
\r\n
\r\n \r\n }\r\n { isAuthenticated &&\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

Discover students and Approved Learning Partners near you.

\r\n { isAuthenticated &&\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\nexport default Home;\r\n","import React, { useState, useContext, useEffect } from 'react';\r\nimport { useParams, useHistory } from 'react-router-dom';\r\n\r\nimport Footer from '../layout/Footer';\r\nimport UserContext from '../../context/user/userContext';\r\n\r\n\r\nconst Community = () => {\r\n \r\n // Component state.\r\n const [parsedData, setParsedData] = useState([]);\r\n const [lftColArr, setLftColArr] = useState([]);\r\n const [rgtColArr, setRgtColArr] = useState([]);\r\n \r\n // Reference context apis.\r\n const userContext = useContext(UserContext);\r\n \r\n // Reference hooks.\r\n const history = useHistory();\r\n \r\n // Reference route params.\r\n let { id } = useParams();\r\n \r\n // Destructure contexts.\r\n const { user,\r\n toggleMobileNav, \r\n setCommunityQuery } = userContext;\r\n \r\n \r\n \r\n /*\r\n * Component methods.\r\n */\r\n \r\n const onClickAppPage = event => {\r\n \r\n // Hide the mobile nav, even if not open.\r\n toggleMobileNav(false);\r\n \r\n }\r\n \r\n const onClickBtnChannel = tag => {\r\n \r\n // Set tag.\r\n setCommunityQuery('/tag?et=' + tag);\r\n \r\n // Navigate to the Community/Forum page using history push.\r\n history.push('/community/forum');\r\n \r\n }\r\n \r\n const divideColumns= () => {\r\n \r\n // Reference all unique category names.\r\n const uniqueCategoriesArr = [];\r\n \r\n user.tags.forEach(item => {\r\n \r\n if ( !uniqueCategoriesArr.includes(item.category) ) uniqueCategoriesArr.push(item.category);\r\n \r\n });\r\n \r\n // Divide categories into right & left column arrays.\r\n const midNum = Math.round(uniqueCategoriesArr.length / 2);\r\n \r\n setLftColArr(uniqueCategoriesArr.slice(0, midNum));\r\n setRgtColArr(uniqueCategoriesArr.slice(midNum, uniqueCategoriesArr.length));\r\n \r\n }\r\n \r\n const parseExamData = () => {\r\n \r\n const tmpArr = [...parsedData];\r\n \r\n let tmpCatObj = null;\r\n let tmpGrpObj = null;\r\n \r\n user.tags.forEach(item => {\r\n \r\n // If Category already exists add item to it.\r\n if ( tmpArr.some( catObj => { tmpCatObj = catObj; return catObj.category === item.category; } ) ) {\r\n \r\n // If Group already exists add exam to it.\r\n if ( tmpCatObj.groups.some( grpObj => { tmpGrpObj = grpObj; return grpObj.categorySubTitle === item.categorySubTitle; } ) ) {\r\n \r\n tmpGrpObj.exams.push({\r\n UNID : item.UNID,\r\n tag : item.tag,\r\n title : item.title\r\n });\r\n \r\n }\r\n \r\n // Else create new Group & add exam.\r\n else {\r\n \r\n // Push new Group into the Groups array.\r\n tmpCatObj.groups.push({\r\n categorySubTitle : item.categorySubTitle,\r\n exams : [\r\n {\r\n UNID : item.UNID,\r\n tag : item.tag,\r\n title : item.title\r\n }\r\n ]\r\n });\r\n \r\n }\r\n \r\n }\r\n \r\n // Else create new Category & add item.\r\n else {\r\n \r\n // Push new Category into parsedData array.\r\n tmpArr.push({ \r\n category : item.category,\r\n groups : [\r\n {\r\n categorySubTitle : item.categorySubTitle,\r\n exams : [\r\n {\r\n UNID : item.UNID,\r\n tag : item.tag,\r\n title : item.title\r\n }\r\n ]\r\n }\r\n ]\r\n });\r\n \r\n }\r\n \r\n });\r\n \r\n setParsedData([...tmpArr]);\r\n \r\n }\r\n \r\n \r\n \r\n \r\n /*\r\n * Component hooks.\r\n */\r\n \r\n useEffect(() => {\r\n \r\n // Parse the data into grouped exams so it\r\n // can be printed to the DOM in 2 columns.\r\n if ( user.tags.length > 0 ) {\r\n \r\n divideColumns();\r\n parseExamData();\r\n \r\n }\r\n \r\n }, [user.tags]);\r\n \r\n \r\n \r\n \r\n /*\r\n * Component view.\r\n */\r\n return (\r\n
onClickAppPage(event)}>\r\n
\r\n
\r\n
\r\n Learning Community Channels\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n

Select a learning channel from the ACCA pathway:

\r\n
\r\n \r\n
\r\n
\r\n \r\n {parsedData.map((optionA, idxA) => {\r\n \r\n // Filter out 'Strategic Professional' category.\r\n if ( lftColArr.includes(optionA.category) ) {\r\n \r\n return (\r\n
\r\n
{optionA.category}
\r\n \r\n {optionA.groups.map((optionB, idxB) => {\r\n \r\n return (\r\n
\r\n

{optionB.categorySubTitle}

\r\n \r\n {optionB.exams.map((optionC, idxC) => {\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 {parsedData.map((optionA, idxA) => {\r\n \r\n // Filter just Strategic Professional' category.\r\n if ( rgtColArr.includes(optionA.category) ) {\r\n \r\n return (\r\n
\r\n
{optionA.category}
\r\n \r\n {optionA.groups.map((optionB, idxB) => {\r\n \r\n return (\r\n
\r\n

{optionB.categorySubTitle}

\r\n \r\n {optionB.exams.map((optionC, idxC) => {\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
\r\n
\r\n );\r\n \r\n}\r\n\r\nexport default Community;\r\n","import React, { useState, useContext, useEffect } from 'react';\r\nimport { useParams, useHistory, useLocation } from 'react-router-dom';\r\nimport queryString from 'query-string';\r\n\r\nimport { communityEndPoint } from '../hooks/envVariables';\r\nimport UserContext from '../../context/user/userContext';\r\n\r\n\r\nconst Forum = () => {\r\n \r\n // Component state.\r\n const [showSpinner, setShowSpinner] = useState(true);\r\n const [showSelector, setShowSelector] = useState(false);\r\n const [selectorOption, setSelectorOption] = useState({ title: 'Select', tag: '', UNID: 0 });\r\n const [examTag, setExamTag] = useState('');\r\n \r\n // Reference context apis.\r\n const userContext = useContext(UserContext);\r\n \r\n // Reference hooks.\r\n const history = useHistory();\r\n const location = useLocation();\r\n \r\n // Reference route params.\r\n let { id } = useParams();\r\n \r\n // Destructure contexts.\r\n const { user,\r\n toggleMobileNav, \r\n communityQuery,\r\n setCommunityQuery } = userContext;\r\n \r\n \r\n \r\n /*\r\n * Component methods.\r\n */\r\n \r\n const onClickAppPage = event => {\r\n \r\n const tgt = event.target;\r\n \r\n // If the drop down selector wasn't the target then hide it.\r\n if ( tgt.className !== 'btn-selector' ) setShowSelector(false);\r\n \r\n // Hide the mobile nav, even if not open.\r\n toggleMobileNav(false);\r\n \r\n }\r\n \r\n const onClickToggleSelector = () => {\r\n \r\n setShowSelector(!showSelector);\r\n \r\n }\r\n \r\n const onClickSelectorOption = (exam) => {\r\n \r\n // Call useState method to update user tag aray.\r\n setSelectorOption({ \r\n title : exam.title, \r\n tag : exam.tag,\r\n UNID : exam.tag \r\n });\r\n \r\n // Set tag.\r\n setCommunityQuery('/tag?et=' + exam.tag);\r\n \r\n // Navigate to the Community/Forum page using history push.\r\n history.push('/community/forum');\r\n \r\n // Hide the selector drop down.\r\n onClickToggleSelector();\r\n \r\n }\r\n \r\n \r\n \r\n \r\n /*\r\n * Component hooks.\r\n */\r\n \r\n useEffect(() => {\r\n \r\n // Bail if no querystring exists.\r\n if ( location.search === '' ) return;\r\n \r\n // Reference querystring values.\r\n const qsValues = queryString.parse(location.search);\r\n \r\n // Bail if no et key exists in the querystring.\r\n // For a deeplink will show the post but user won't be in the right channel.\r\n if ( typeof qsValues.et === 'undefined' ) return;\r\n \r\n // Set the exam tag passed in from the Digest deeplink url.\r\n setExamTag(qsValues.et);\r\n \r\n // Get exam data that corresponds with given tag.\r\n const selExam = user.tags.find(item => item.tag === qsValues.et);\r\n \r\n // Set current exam shown in the Channel selector.\r\n setSelectorOption({ \r\n title : selExam.title, \r\n tag : selExam.tag,\r\n UNID : selExam.tag \r\n });\r\n \r\n // The eslint comment below removes missing dependency warning from console.\r\n // eslint-disable-next-line\r\n }, []);\r\n \r\n useEffect(() => {\r\n\r\n // Set the initial exam the user selected.\r\n if ( communityQuery !== null && \r\n communityQuery !== '' ) {\r\n \r\n // Get the tag from the string.\r\n const selTag = communityQuery.substring(communityQuery.indexOf('=') + 1);\r\n const selExam = user.tags.find(item => item.tag === selTag);\r\n \r\n setSelectorOption({ \r\n title : selExam.title, \r\n tag : selExam.tag,\r\n UNID : selExam.tag \r\n });\r\n \r\n }\r\n \r\n }, [communityQuery]);\r\n \r\n \r\n /*\r\n * Component view.\r\n */\r\n return (\r\n
onClickAppPage(event)}>\r\n
\r\n
\r\n
\r\n \r\n
Learning Channels
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n { user.tags.length < 1 \r\n ?\r\n
    \r\n
  • There are no exams to select
  • \r\n
\r\n : \r\n
    \r\n {user.tags.map((option, idx) => {\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 { typeof id !== 'undefined' ?\r\n \r\n :\r\n \r\n }\r\n
\r\n
\r\n );\r\n \r\n}\r\n\r\nexport default Forum;\r\n","import React, { useContext, useState, useEffect, useRef } from 'react';\r\nimport { useHistory, useRouteMatch } from 'react-router-dom';\r\n\r\nimport { guestToken } from '../hooks/envVariables';\r\nimport UserContext from '../../context/user/userContext';\r\n\r\n\r\nlet studentsResultsArr = [];\r\nlet educatorsResultsArr = [];\r\n\r\n// Animation array.\r\nconst animationArr = [\r\n {\r\n name : 'All Students',\r\n searchFilter : 1024,\r\n tagUNID : 0,\r\n date : null\r\n },\r\n {\r\n name : 'All Learning Partners',\r\n searchFilter : 1,\r\n tagUNID : null,\r\n date : null\r\n}];\r\n\r\nconst studentsKeyPin = 'img/student_pin_key.png';\r\nconst educatorsKeyPin = 'img/educator_pin_key.png';\r\n\r\nlet isGuest = false;\r\n\r\nlet timer01 = null;\r\nlet timer02 = null;\r\nlet timer03 = null;\r\nlet timer04 = null;\r\nlet timer05 = null;\r\n\r\n\r\nconst Discover = () => {\r\n \r\n // Define component variables.\r\n const numMaxResults = 100;\r\n const numGetresults = 4;\r\n const initZoom = 2;\r\n const minZoom = 2; // Zoomed out, 0/whole world.\r\n const maxZoom = 10; // Zoomed in, changes at different locations.\r\n const studentsDelay = 30;\r\n const educatorsDelay = 30;\r\n const brandDelay = 3;\r\n \r\n \r\n // Define components state hooks.\r\n const [isMapReady, setIsMapReady] = useState(false);\r\n const [studentsFilterArr, setStudentsFilterArr] = useState([{ UNID: 0, tag: 'All', title: 'All exams' }, { UNID: -1, tag: 'Same', title: 'Students studying same exams' }]);\r\n const [educatorsFilterArr, setEducatorsFilterArr] = useState([]);\r\n const [inpSearchStudents, setInpSearchStudents] = useState('');\r\n const [inpSearchEducators, setInpSearchEducators] = useState('');\r\n const [isStudentsFetching, setIsStudentsFetching] = useState(false);\r\n const [isEducatorsFetching, setIsEducatorsFetching] = useState(false);\r\n const [isMarkersFetching, setIsMarkersFetching] = useState(false);\r\n const [showStudentsSelector, setShowStudentsSelector] = useState(false);\r\n const [showEducatorsSelector, setShowEducatorsSelector] = useState(false);\r\n const [inpStudentsGo, setInpStudentsGo] = useState(true);\r\n const [inpEducatorsGo, setInpEducatorsGo] = useState(true);\r\n const [isMoreStudents, setIsMoreStudents] = useState(true);\r\n const [isMoreEducators, setIsMoreEducators] = useState(true);\r\n const [selectorStudentsOption, setSelectorStudentsOption] = useState(null);\r\n const [refCurStudentsOption, setRefCurStudentsOption] = useState(null);\r\n const [selectorEducatorsOption, setSelectorEducatorsOption] = useState(null);\r\n const [refCurEducatorsOption, setRefCurEducatorsOption] = useState(null);\r\n const [inpStudentsPlaceholder, setInpStudentsPlaceholder] = useState(null);\r\n const [inpEducatorsPlaceholder, setInpEducatorsPlaceholder] = useState(null);\r\n const [studentsListPoolArr, setStudentsListPoolArr] = useState(null);\r\n const [studentsListArr, setStudentsListArr] = useState(null);\r\n const [educatorsListPoolArr, setEducatorsListPoolArr] = useState(null);\r\n const [educatorsListArr, setEducatorsListArr] = useState(null);\r\n const [gMap, setGMap] = useState(null);\r\n const [resultsMapArr, setResultsMapArr] = useState([]);\r\n const [userCoords, setUserCoords] = useState({ lat: 51.507351, lng: -0.127758 });\r\n const [showMapSelector, setShowMapSelector] = useState(false);\r\n const [mapSelectorOption, setMapSelectorOption] = useState({ name: 'All Students', searchFilter: 1024, tagUNID: 0 });\r\n const [mapSelectorArr, setMapSelectorArr] = useState([]);\r\n const [refreshMap, setRefreshMap] = useState(false);\r\n const [isMapAnimating, setIsMapAnimating] = useState(false);\r\n const [curAnimateName, setCurAnimateName] = useState(null);\r\n const [allowSelectorFetch, setAllowSelectorFetch] = useState(true);\r\n const [isMapKeyStudent, setIsMapKeyStudent] = useState(true);\r\n const [zoomLevelStudentsMsg, setZoomLevelStudentsMsg] = useState('');\r\n const [zoomLevelEducatorsMsg, setZoomLevelEducatorsMsg] = useState('');\r\n const [isBrandReady, setIsBrandReady] = useState(false);\r\n const [doFirstRun, setDoFirstRun] = useState(false);\r\n const [markersLoading, setMarkersLoading] = useState(false);\r\n const [zoomQuadOut, setZoomQuadOut] = useState(false);\r\n const [nextExamDate, setNextExamDate] = useState('');\r\n const [sailOn, setSailOn] = useState(false);\r\n\r\n \r\n // Reference context apis.\r\n const userContext = useContext(UserContext);\r\n \r\n \r\n // Reference hooks.\r\n const history = useHistory();\r\n \r\n \r\n // Element reference hooks.\r\n const refMap = useRef(null);\r\n const refInpStudents = useRef(null);\r\n const refInpEducators = useRef(null);\r\n const animateInterval = useRef(null);\r\n const animateIndex = useRef(1);\r\n const mapBounds = useRef(null);\r\n const boundsChanged = useRef(false);\r\n const curAnimateObj = useRef(null);\r\n const markersArr = useRef([]);\r\n const curSearchFilter = useRef(1024);\r\n const curTagUNID = useRef(0);\r\n \r\n \r\n // Destructure contexts.\r\n const { toggleMobileNav, \r\n toggleLoginModal, \r\n toggleRegisterModal, \r\n setCommunityQuery, \r\n getDiscoverData, \r\n getMarkersData, \r\n clearMarkersData, \r\n studentsData, \r\n educatorsData, \r\n markersData, \r\n errorStudents, \r\n errorEducators, \r\n errorMarkers, \r\n getSearchFilterData, \r\n searchFilterData, \r\n user, \r\n nowUnmountDiscover, \r\n isAuthenticated, \r\n callApiGuestUser, \r\n setDiscoverPreview } = userContext;\r\n \r\n \r\n \r\n /*\r\n * Component logic.\r\n */\r\n \r\n // Check the ROUTE this component is serving. If route is\r\n // PREVIEW then user is not logged in so don't fetch student data.\r\n const routeMatch = useRouteMatch('/preview/discover');\r\n const isPreview = routeMatch !== null && routeMatch.isExact ? true : false;\r\n \r\n \r\n \r\n \r\n \r\n /*\r\n * Component methods.\r\n */\r\n\r\n const onClickAppPage = event => {\r\n \r\n const tgt = event.target;\r\n \r\n // If the drop down selector wasn't the target then hide it.\r\n if ( tgt.className !== 'btn-selector students' ) setShowStudentsSelector(false);\r\n if ( tgt.className !== 'btn-selector educators' ) setShowEducatorsSelector(false);\r\n if ( tgt.className !== 'btn-selector map' ) setShowMapSelector(false);\r\n \r\n // Hide the mobile nav, even if not open.\r\n toggleMobileNav(false);\r\n \r\n }\r\n \r\n const renderMap = () => {\r\n\r\n const mapsApi = window.google.maps;\r\n const algeria = { lat: 27.929864, lng: 2.573023};\r\n \r\n const mapOptions = {\r\n center\t\t\t\t : algeria,\r\n mapTypeId\t\t\t : mapsApi.MapTypeId.ROADMAP,\r\n mapTypeControl\t\t : false,\r\n navigationControl\t : false,\r\n streetViewControl\t : false,\r\n disableDefaultUI\t : true,\r\n clickableIcons : false,\r\n panControl\t\t\t : false,\r\n zoomControl\t\t\t : false,\r\n scaleControl : false,\r\n zoom\t\t\t \t : initZoom,\r\n minZoom\t\t\t\t : minZoom,\r\n maxZoom\t\t\t\t : maxZoom,\r\n controlSize : 25,\r\n zoomControlOptions\t: {\r\n style\t\t\t : mapsApi.ZoomControlStyle.DEFAULT,\r\n position\t\t: mapsApi.ControlPosition.RIGHT_BOTTOM\r\n },\r\n styles : [\r\n {\r\n \"elementType\": \"geometry\",\r\n \"stylers\": [\r\n {\r\n \"color\": \"#f5f5f5\"\r\n }\r\n ]\r\n },\r\n {\r\n \"elementType\": \"labels\",\r\n \"stylers\": [\r\n {\r\n \"visibility\": \"off\"\r\n }\r\n ]\r\n },\r\n {\r\n \"elementType\": \"labels.icon\",\r\n \"stylers\": [\r\n {\r\n \"visibility\": \"off\"\r\n }\r\n ]\r\n },\r\n {\r\n \"elementType\": \"labels.text.fill\",\r\n \"stylers\": [\r\n {\r\n \"color\": \"#ff0000\"\r\n }\r\n ]\r\n },\r\n {\r\n \"elementType\": \"labels.text.stroke\",\r\n \"stylers\": [\r\n {\r\n \"color\": \"#ff0000\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"administrative\",\r\n \"elementType\": \"geometry\",\r\n \"stylers\": [\r\n {\r\n \"visibility\": \"off\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"administrative.land_parcel\",\r\n \"stylers\": [\r\n {\r\n \"visibility\": \"off\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"administrative.land_parcel\",\r\n \"elementType\": \"labels.text.fill\",\r\n \"stylers\": [\r\n {\r\n \"color\": \"#ff0000\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"administrative.neighborhood\",\r\n \"stylers\": [\r\n {\r\n \"visibility\": \"off\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"poi\",\r\n \"stylers\": [\r\n {\r\n \"visibility\": \"off\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"poi\",\r\n \"elementType\": \"geometry\",\r\n \"stylers\": [\r\n {\r\n \"color\": \"#ff0000\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"poi\",\r\n \"elementType\": \"labels.text.fill\",\r\n \"stylers\": [\r\n {\r\n \"color\": \"#ff0000\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"poi.park\",\r\n \"elementType\": \"geometry\",\r\n \"stylers\": [\r\n {\r\n \"color\": \"#ff0000\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"poi.park\",\r\n \"elementType\": \"labels.text.fill\",\r\n \"stylers\": [\r\n {\r\n \"color\": \"#ff0000\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"road\",\r\n \"stylers\": [\r\n {\r\n \"visibility\": \"off\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"road\",\r\n \"elementType\": \"geometry\",\r\n \"stylers\": [\r\n {\r\n \"color\": \"#ff0000\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"road\",\r\n \"elementType\": \"labels.icon\",\r\n \"stylers\": [\r\n {\r\n \"visibility\": \"off\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"road.arterial\",\r\n \"elementType\": \"labels.text.fill\",\r\n \"stylers\": [\r\n {\r\n \"color\": \"#ff0000\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"road.highway\",\r\n \"elementType\": \"geometry\",\r\n \"stylers\": [\r\n {\r\n \"color\": \"#ff0000\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"road.highway\",\r\n \"elementType\": \"labels.text.fill\",\r\n \"stylers\": [\r\n {\r\n \"color\": \"#ff0000\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"road.local\",\r\n \"elementType\": \"labels.text.fill\",\r\n \"stylers\": [\r\n {\r\n \"color\": \"#ff0000\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"transit\",\r\n \"stylers\": [\r\n {\r\n \"visibility\": \"off\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"transit.line\",\r\n \"elementType\": \"geometry\",\r\n \"stylers\": [\r\n {\r\n \"color\": \"#ff0000\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"transit.station\",\r\n \"elementType\": \"geometry\",\r\n \"stylers\": [\r\n {\r\n \"color\": \"#ff0000\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"water\",\r\n \"elementType\": \"geometry\",\r\n \"stylers\": [\r\n {\r\n \"color\": \"#cdd8de\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"water\",\r\n \"elementType\": \"labels.text.fill\",\r\n \"stylers\": [\r\n {\r\n \"color\": \"#ff0000\"\r\n }\r\n ]\r\n }\r\n ]\r\n };\r\n \r\n // Create map instance.\r\n const newMap = new mapsApi.Map(refMap.current, mapOptions);\r\n const overlay = new mapsApi.OverlayView();\r\n \r\n // Add a marker layer for custom markers.\r\n overlay.draw = function () {\r\n \r\n this.getPanes().markerLayer.id = 'marker-layer';\r\n \r\n }\r\n overlay.setMap(newMap);\r\n \r\n // Add day/night overlay.\r\n // http://js-tutorial.com/day-night-overlay-357\r\n // https://github.com/marmat/google-maps-api-addons\r\n if ( typeof window.DayNightOverlay !== 'undefined' && \r\n window.DayNightOverlay !== null ) {\r\n \r\n const sunShadow = new window.DayNightOverlay({ \r\n map: newMap,\r\n fillColor: 'rgba(0, 0, 0, 0.2)'\r\n });\r\n \r\n }\r\n\r\n // Reference google map.\r\n setGMap(newMap);\r\n\r\n }\r\n \r\n const addEventsToMap = () => {\r\n \r\n // Check gMap has been set.\r\n if ( gMap === null ) return;\r\n \r\n gMap.addListener('bounds_changed', () => {\r\n \r\n // Check we have some mapBounds to compare.\r\n if ( mapBounds.current === null ) return;\r\n \r\n // Check if bounds really changed, when at the limit of zooming \r\n // in or out, bounds chnaged is fired even when bounds haven't changed.\r\n const newNeLat = gMap.getBounds().getNorthEast().lat();\r\n const newNeLng = gMap.getBounds().getNorthEast().lng();\r\n const newSwLat = gMap.getBounds().getSouthWest().lat();\r\n const newSwLng = gMap.getBounds().getSouthWest().lng();\r\n \r\n const curNeLat = mapBounds.current.getNorthEast().lat();\r\n const curNeLng = mapBounds.current.getNorthEast().lng();\r\n const curSwLat = mapBounds.current.getSouthWest().lat();\r\n const curSwLng = mapBounds.current.getSouthWest().lng();\r\n \r\n if ( newNeLat !== curNeLat &&\r\n newNeLng !== curNeLng &&\r\n newSwLat !== curSwLat &&\r\n newSwLng !== curSwLng ) boundsChanged.current = true;\r\n else boundsChanged.current = false;\r\n \r\n });\r\n \r\n gMap.addListener('idle', () => {\r\n \r\n // Get & store new map bounds.\r\n mapBounds.current = gMap.getBounds();\r\n \r\n // Refresh the map to trigger marker fetch.\r\n if ( boundsChanged.current ) {\r\n \r\n // Stop the map animating.\r\n setIsMapAnimating(false);\r\n \r\n // Set refreshMap to trigger a data fetch.\r\n setRefreshMap(true);\r\n \r\n // Set map key messags on zoom.\r\n setMapKeyMsgs();\r\n \r\n }\r\n \r\n // Start initial animation.\r\n if ( !doFirstRun ) setDoFirstRun(true);\r\n \r\n });\r\n \r\n }\r\n \r\n const renderMarkers = (mkrArr) => {\r\n \r\n const mapsApi = window.google.maps;\r\n const newMkrArr = mkrArr !== null ? [ ...mkrArr ] : [ ...resultsMapArr ];\r\n \r\n let tmpMkrArr = [];\r\n let pinImg = null;\r\n \r\n // Update the map zoom key icon, students/educators. \r\n if ( curSearchFilter.current === 1024 ) setIsMapKeyStudent(true);\r\n else setIsMapKeyStudent(false);\r\n\r\n // Remove old markers from the map &\r\n // set markers array to an empty aray.\r\n if ( markersArr.current.length > 0 ) {\r\n \r\n for ( let i = 0; i < markersArr.current.length; i++ ) markersArr.current[i].setMap(null);\r\n \r\n markersArr.current = [];\r\n\r\n }\r\n \r\n // Define pin & how it is chosen.\r\n if ( mkrArr !== null ) pinImg = curAnimateObj.current.searchFilter === 1024 ? 'img/student_pin.png' : 'img/educator_pin.png';\r\n else pinImg = mapSelectorOption.searchFilter === 1024 ? 'img/student_pin.png' : 'img/educator_pin.png';\r\n\r\n if ( newMkrArr.length > 0 ) {\r\n \r\n // Define pin.\r\n let pin = null;\r\n \r\n // Set relevant students/educators pin.\r\n const pinIcon = {\r\n url : pinImg,\r\n size : new mapsApi.Size(10, 20),\r\n scaledSize : new mapsApi.Size(10, 20),\r\n origin : new mapsApi.Point(0, 0),\r\n anchor : new mapsApi.Point(5, 20)\r\n };\r\n \r\n // Add new markers to the map.\r\n newMkrArr.map((marker, idx) => {\r\n \r\n pin = new mapsApi.Marker({\r\n map : gMap,\r\n position : {\r\n lat: marker.lat,\r\n lng: marker.lng\r\n },\r\n icon : pinIcon,\r\n optimized : false\r\n });\r\n \r\n // Add click event to the pin, will display results in list view.\r\n // Don't add click event to student pins in PREVIEW/GUEST mode.\r\n if ( isGuest ) {\r\n \r\n if ( marker.typ !== 1024 ) pin.addListener('click', () => onClickPinSearch(marker.cid));\r\n \r\n }\r\n else pin.addListener('click', () => onClickPinSearch(marker.cid));\r\n \r\n tmpMkrArr.push(pin);\r\n \r\n });\r\n\r\n // Set markers array.\r\n markersArr.current = [ ...tmpMkrArr ];\r\n \r\n if ( isMapAnimating ) setCurAnimateName(curAnimateObj.current.name);\r\n \r\n }\r\n\r\n // Store students & educators markers in their arrays,\r\n // cycle between these marker arrays if bounds don't change.\r\n if ( curSearchFilter.current === 1024 && curTagUNID.current === 0 ) studentsResultsArr = [ ...newMkrArr ];\r\n else if ( mapSelectorOption.searchFilter === 1 ) educatorsResultsArr = [ ...newMkrArr ];\r\n \r\n // Includes markers fetching & markers rendering.\r\n setMarkersLoading(false);\r\n \r\n setRefreshMap(false);\r\n\r\n }\r\n \r\n const renderStoredMarkers = (searchFilter, tagUNID) => {\r\n \r\n if ( searchFilter === 1024 ) renderMarkers([ ...studentsResultsArr ]);\r\n else if ( searchFilter === 1 ) renderMarkers([ ...educatorsResultsArr ]);\r\n else renderMarkers(null);\r\n \r\n }\r\n \r\n const onClickPinSearch = cid => {\r\n \r\n // Stop the map animating.\r\n setIsMapAnimating(false);\r\n \r\n // If the map is currently showing 'All Learning Partners' markers.\r\n if ( mapSelectorOption.searchFilter === 1 ) {\r\n \r\n const optionArr = educatorsFilterArr.filter(option => option.Tag === 'ALP');\r\n \r\n // Add the cid, to return correct user/users from server.\r\n optionArr[0].cid = cid;\r\n \r\n onClickSelectorOption(optionArr[0], 'educators', 'map');\r\n \r\n }\r\n \r\n // Else if the map is showing 'All Students' or Students Exams markers.\r\n else {\r\n \r\n const curSelector = studentsFilterArr.filter(option => option.UNID === mapSelectorOption.tagUNID);\r\n \r\n // Add the cid, to return correct user/users from server.\r\n mapSelectorOption.cid = cid;\r\n \r\n setRefCurStudentsOption(curSelector[0]);\r\n onClickSelectorOption(mapSelectorOption, 'students', 'map');\r\n \r\n }\r\n \r\n }\r\n \r\n const setMapToUserPos = () => {\r\n \r\n // Stop the map animating.\r\n setIsMapAnimating(false);\r\n \r\n if ( gMap.getZoom() < 5 ) gMap.setZoom(5);\r\n gMap.panTo(userCoords);\r\n \r\n // Update 'refreshMap' to force a marker fetch.\r\n setRefreshMap(true);\r\n \r\n }\r\n \r\n const onClickNavigateTo = path => {\r\n \r\n // Reset Community tag.\r\n setCommunityQuery(null);\r\n \r\n // Navigate to the path using history push.\r\n history.push('/' + path);\r\n \r\n }\r\n \r\n const getInitialServerData = () => {\r\n\r\n // Get search filter data from the server.\r\n getSearchFilterData();\r\n \r\n // Fetch initial results for STUDENTS.\r\n fetchListData('students', 1024, 0, null);\r\n \r\n // Fetch initial results for EDUCATORS.\r\n fetchListData('educators', 1, null, null);\r\n \r\n }\r\n \r\n //let circle = null;\r\n const computeRadius = () => {\r\n \r\n let radius = 6371000;\r\n \r\n const bounds = gMap.getBounds();\r\n const center = gMap.getCenter();\r\n\r\n if ( typeof bounds !== 'undefined' && bounds !== null && typeof center !== 'undefined' && center !== null ) {\r\n \r\n const ne = bounds.getNorthEast();\r\n \r\n // Calculate radius (in meters).\r\n radius = window.google.maps.geometry.spherical.computeDistanceBetween(center, ne);\t\r\n\t\t\r\n }\r\n \r\n // if ( circle !== null ) {\r\n \r\n // circle.setMap(null);\r\n // circle = null;\r\n \r\n // }\r\n \r\n // circle = new window.google.maps.Circle({\r\n // strokeColor: '#FF0000',\r\n // strokeOpacity: 0.8,\r\n // strokeWeight: 2,\r\n // fillColor: '#FF0000',\r\n // fillOpacity: 0.35,\r\n // map: gMap,\r\n // center: center,\r\n // radius: radius\r\n // });\r\n \r\n return radius; \r\n \r\n }\r\n \r\n const fetchMapData = (searchFilter, tagUNID) => {\r\n \r\n // Check gMap has been set.\r\n if ( gMap === null ) return;\r\n \r\n // Set current vars for updating map zoom key & animating arrays.\r\n curSearchFilter.current = searchFilter;\r\n curTagUNID.current = tagUNID;\r\n \r\n // Get map center point.\r\n const mapCoords = gMap.getCenter();\r\n \r\n // Define query string params.\r\n let qParams = {\r\n nelat : mapBounds.current.getNorthEast().lat(),\r\n neLng : mapBounds.current.getNorthEast().lng(),\r\n swLat : mapBounds.current.getSouthWest().lat(),\r\n swLng : mapBounds.current.getSouthWest().lng(),\r\n mapRadius : computeRadius(),\r\n mapCenterLat : mapCoords.lat(),\r\n mapCenterLng : mapCoords.lng(),\r\n userLat : userCoords.lat,\r\n userLng : userCoords.lng, \r\n tagUNID : tagUNID,\r\n searchFilter : searchFilter,\r\n searchType : 0\r\n };\r\n \r\n // Update markers fetching state.\r\n setIsMarkersFetching(true);\r\n \r\n // Includes markers fetching & markers rendering.\r\n setMarkersLoading(true);\r\n \r\n // Fetch marker results.\r\n getMarkersData(qParams);\r\n\r\n }\r\n \r\n const fetchListData = (type, searchFilter, tagUNID, cid) => {\r\n \r\n if ( type === 'students' ) setIsStudentsFetching(true);\r\n else if ( type === 'educators' ) setIsEducatorsFetching(true);\r\n \r\n // Define query string params.\r\n let qParams = {\r\n nelat : 0.000000,\r\n neLng : 0.000000,\r\n swLat : 0.000000,\r\n swLng : 0.000000, \r\n mapRadius : 100000,\r\n mapCenterLat : 0.000000,\r\n mapCenterLng : 0.000000,\r\n userLat : 0.000000,\r\n userLng : 0.000000, \r\n cid : cid,\r\n tagUNID : tagUNID,\r\n searchFilter : searchFilter,\r\n searchType : type === 'students' ? 1 : 2,\r\n searchName : type === 'students' ? inpSearchStudents : inpSearchEducators\r\n };\r\n \r\n // If browser supports geolocation.\r\n if ( navigator.geolocation ) {\r\n \r\n navigator.geolocation.getCurrentPosition(curPos => {\r\n \r\n // Update coords with user location.\r\n qParams.mapCenterLat = curPos.coords.latitude;\r\n qParams.mapCenterLng = curPos.coords.longitude;\r\n qParams.userLat = curPos.coords.latitude;\r\n qParams.userLng = curPos.coords.longitude;\r\n \r\n getDiscoverData(qParams);\r\n \r\n },\r\n error => {\r\n \r\n console.log('Map location error: ', error);\r\n getDiscoverData(qParams);\r\n \r\n },\r\n {\r\n enableHighAccuracy : true,\r\n maximumAge : 60000,\r\n timeout : 10000\r\n });\r\n \r\n }\r\n \r\n // Else use a default global location.\r\n else getDiscoverData(qParams);\r\n\r\n }\r\n \r\n const onClickListSearch = type => {\r\n \r\n // Fetch STUDENTS data.\r\n if ( type === 'students' ) {\r\n \r\n if ( isStudentsFetching ) return false;\r\n \r\n if ( inpStudentsGo ) {\r\n \r\n setInpStudentsGo(false);\r\n fetchListData(type, 1024, selectorStudentsOption.UNID, null);\r\n \r\n }\r\n else {\r\n \r\n setInpStudentsGo(true);\r\n setInpSearchStudents('');\r\n \r\n refInpStudents.current.focus();\r\n \r\n }\r\n \r\n }\r\n \r\n // Fetch EDUCATORS data.\r\n else if ( type === 'educators' ) {\r\n \r\n if ( isEducatorsFetching ) return false;\r\n \r\n if ( inpEducatorsGo ) {\r\n \r\n setInpEducatorsGo(false);\r\n fetchListData(type, selectorEducatorsOption.UNID, null, null);\r\n \r\n }\r\n else {\r\n \r\n setInpEducatorsGo(true);\r\n setInpSearchEducators('');\r\n \r\n refInpEducators.current.focus();\r\n \r\n \r\n }\r\n \r\n }\r\n \r\n }\r\n \r\n const onClickSelectorOption = (option, type, triggeredBy) => {\r\n \r\n // Check if we have a cid, else set cid to null.\r\n const cid = option.cid ? option.cid : null;\r\n \r\n if ( type === 'students' ) {\r\n \r\n if ( isStudentsFetching ) return false;\r\n \r\n if ( triggeredBy === 'list' ) {\r\n \r\n setRefCurStudentsOption(option);\r\n fetchListData(type, 1024, option.UNID, cid);\r\n \r\n }\r\n else {\r\n \r\n fetchListData(type, 1024, option.tagUNID, cid);\r\n \r\n }\r\n\r\n }\r\n else if ( type === 'educators' ) {\r\n \r\n if ( isEducatorsFetching ) return false;\r\n \r\n setRefCurEducatorsOption(option);\r\n fetchListData(type, option.UNID, null, cid); \r\n\r\n }\r\n \r\n }\r\n \r\n const onClickToggleSelector = (type) => {\r\n\r\n if ( type === 'students' ) setShowStudentsSelector(!showStudentsSelector);\r\n else if ( type === 'educators' ) setShowEducatorsSelector(!showEducatorsSelector);\r\n \r\n }\r\n \r\n const onKeyupList = ( event, type ) => {\r\n \r\n if ( type === 'students' ) {\r\n \r\n if ( isStudentsFetching ) return false;\r\n \r\n if ( event.key === 'Enter' ) {\r\n \r\n setInpStudentsGo(false);\r\n fetchListData(type, 1024, selectorStudentsOption.UNID, null);\r\n \r\n }\r\n else if ( event.key === 'Backspace' ) setInpStudentsGo(true);\r\n\r\n }\r\n else if ( type === 'educators' ) {\r\n \r\n if ( isEducatorsFetching ) return false;\r\n \r\n if ( event.key === 'Enter' ) {\r\n \r\n setInpEducatorsGo(false);\r\n fetchListData(type, selectorEducatorsOption.UNID, null, null);\r\n \r\n }\r\n else if ( event.key === 'Backspace' ) setInpEducatorsGo(true);\r\n \r\n }\r\n \r\n }\r\n \r\n const showMoreResults = type => {\r\n \r\n if ( type === 'students' ) {\r\n \r\n const nextStudents = studentsListPoolArr.splice(0, 4);\r\n setStudentsListArr([ ...studentsListArr, ...nextStudents ]);\r\n \r\n if ( studentsListPoolArr.length < 1 ) setIsMoreStudents(false);\r\n \r\n }\r\n else if ( type === 'educators' ) {\r\n \r\n const nextEducators = educatorsListPoolArr.splice(0, 4);\r\n setEducatorsListArr([ ...educatorsListArr, ...nextEducators ]);\r\n \r\n if ( educatorsListPoolArr.length < 1 ) setIsMoreEducators(false);\r\n \r\n }\r\n \r\n }\r\n \r\n // Return the tags acronym using the 'tagLookupUNID'.\r\n const getTagFromId = id => {\r\n \r\n const item = user.tags.filter(item => item.UNID === id);\r\n \r\n return item[0].tag;\r\n \r\n }\r\n \r\n const renderTagList = (item) => {\r\n \r\n // If this student has tags.\r\n if ( item.userTags && item.userTags.length > 0 ) {\r\n \r\n return (\r\n item.userTags.map((tag, idx) => {\r\n \r\n const tagName = getTagFromId(tag.tagLookupUNID);\r\n \r\n return (
  • \r\n \r\n
  • \r\n );\r\n })\r\n );\r\n \r\n }\r\n // Else student has no tags.\r\n else return;\r\n\r\n }\r\n \r\n // Navigate to the Community with a defined tag.\r\n const onClickCommunityWithTag = tag => {\r\n \r\n // Set tag.\r\n setCommunityQuery('/tag?et=' + tag);\r\n \r\n // Navigate to the Community/Forum page using history push.\r\n history.push('/community/forum');\r\n \r\n }\r\n \r\n // Navigate to the Comunity with students name.\r\n const onClickCommunityWithName = name => {\r\n \r\n // Replace spaces with '+'.\r\n const parsedName = name.replace(/\\s+/g, '+');\r\n \r\n // Set name.\r\n setCommunityQuery('/user/' + parsedName);\r\n \r\n // Navigate to the Community/Forum page using history push.\r\n history.push('/community/forum');\r\n \r\n }\r\n \r\n const showEducatorStatus = item => {\r\n \r\n if ( item.typeStatus && item.typeStatus === 1 ) {\r\n \r\n return
    Gold Approved Learning Partner
    ;\r\n \r\n }\r\n else if ( item.typeStatus && item.typeStatus === 2 ) {\r\n \r\n return
    Platinum Approved Learning Partner
    ;\r\n \r\n }\r\n else if ( item.typeStatus && item.typeStatus === 4 ) {\r\n \r\n return
    Silver Approved Learning Partner
    ;\r\n \r\n }\r\n else return;\r\n \r\n }\r\n \r\n const openExtLink = (url, newTab) => {\r\n \r\n if ( newTab ) window.open(url);\r\n else window.location.assign(url);\r\n \r\n }\r\n \r\n const onClickMapToggleSelector = () => {\r\n \r\n setShowMapSelector(!showMapSelector);\r\n \r\n }\r\n \r\n const onClickMapSelectorOption = (option) => {\r\n \r\n // Re-allow fetches, stopped when map is animating.\r\n setAllowSelectorFetch(true);\r\n \r\n // Stop the map animating.\r\n setIsMapAnimating(false);\r\n \r\n // Call useState method to update user tag aray.\r\n setMapSelectorOption(option);\r\n \r\n // Hide the selector drop down.\r\n onClickMapToggleSelector();\r\n \r\n // If exam selected, Set date to next exam.\r\n if ( option.tagUNID !== null && option.tagUNID !== 0 ) {\r\n \r\n const today = new Date();\r\n \r\n // Split exam date into an array.\r\n const exDtArr = option.date.split('-');\r\n \r\n // Reformat the date from UK into US format.\r\n const examDate = new Date(exDtArr[1] + '-' + exDtArr[0] + '-' + exDtArr[2]);\r\n \r\n // Update next exams message.\r\n if ( examDate.getTime() <= today.getTime() ) setNextExamDate('');\r\n else {\r\n \r\n let diffTime = (examDate.getTime() - today.getTime()) / 1000;\r\n \r\n diffTime /= (60 * 60 * 24 * 7);\r\n\r\n const numWeeks = Math.abs(Math.round(diffTime));\r\n const txtWeek = numWeeks > 1 ? 'weeks' : 'week';\r\n \r\n if ( numWeeks === 0 ) setNextExamDate(' - Next exam this week');\r\n else setNextExamDate(` - Next exam in ${numWeeks} ${txtWeek}`);\r\n \r\n }\r\n\r\n }\r\n else setNextExamDate('');\r\n \r\n\r\n }\r\n \r\n const updateMapSelectorArray = () => {\r\n \r\n const examsArr = user.tags.map(item => {\r\n \r\n return {\r\n name : 'Students tagged #' + item.tag,\r\n searchFilter : 1024,\r\n tagUNID : item.UNID,\r\n date : item.tagdate\r\n };\r\n \r\n });\r\n \r\n const tmpArr = [\r\n ...animationArr,\r\n ...examsArr,\r\n ];\r\n \r\n setMapSelectorArr([...tmpArr]);\r\n \r\n }\r\n \r\n const animateMarkers = () => {\r\n \r\n // Check gMap has been set.\r\n if ( gMap === null ) return;\r\n\r\n // Educators should animate for a shorter period than students.\r\n let delay = studentsDelay;\r\n \r\n if ( animateIndex.current === 0 ) setCurAnimateName(animationArr[1].name);\r\n else setCurAnimateName(animationArr[0].name);\r\n\r\n function updateMarkers () {\r\n \r\n let idx = animateIndex.current === 0 ? 1 : 0;\r\n\r\n // Update animation index for next pass.\r\n animateIndex.current = idx;\r\n \r\n // Update animation delay variable. \r\n if ( idx === 1 ) delay = educatorsDelay;\r\n else delay = studentsDelay;\r\n \r\n curAnimateObj.current = animationArr[idx]; \r\n \r\n setMapSelectorOption(animationArr[idx]);\r\n \r\n // Set current vars for updating map zoom key & animating arrays.\r\n curSearchFilter.current = animationArr[idx].searchFilter;\r\n curTagUNID.current = animationArr[idx].tagUNID;\r\n\r\n // Define whether we have stored markers set to false initially.\r\n let hasStoredMarkers = false;\r\n\r\n // Do we have stored educators markers?\r\n if ( animationArr[idx].searchFilter === 1024 && studentsResultsArr.length > 0 ) hasStoredMarkers = true;\r\n \r\n // Do we have stored educators markers?\r\n if ( animationArr[idx].searchFilter === 1 && educatorsResultsArr.length > 0 ) hasStoredMarkers = true;\r\n \r\n if ( !boundsChanged.current && hasStoredMarkers ) renderStoredMarkers(animationArr[idx].searchFilter, animationArr[idx].tagUNID);\r\n else {\r\n \r\n // Update markers fetching state.\r\n setIsMarkersFetching(true);\r\n \r\n // Fetch map marker results.\r\n fetchMapData(animationArr[idx].searchFilter, animationArr[idx].tagUNID);\r\n \r\n }\r\n \r\n // Start new lopop.\r\n animateInterval.current = setTimeout(updateMarkers, delay * 1000);\r\n \r\n }\r\n updateMarkers();\r\n \r\n }\r\n \r\n const setMapKeyMsgs = () => {\r\n \r\n // Get current map zoom level.\r\n const zoom = gMap.getZoom();\r\n \r\n // Update map key messages.\r\n if ( zoom === 10 || zoom === 9 || zoom === 8 || zoom === 7 ) {\r\n \r\n setZoomLevelStudentsMsg('Students');\r\n setZoomLevelEducatorsMsg('Learning Partners');\r\n \r\n }\r\n else if ( zoom === 6 || zoom === 5 ) {\r\n \r\n setZoomLevelStudentsMsg('Local spotlights');\r\n setZoomLevelEducatorsMsg('Local spotlights');\r\n \r\n }\r\n else if ( zoom === 4 || zoom === 3 ) {\r\n \r\n setZoomLevelStudentsMsg('Country spotlights');\r\n setZoomLevelEducatorsMsg('Country spotlights');\r\n \r\n }\r\n else {\r\n \r\n setZoomLevelStudentsMsg('Global spotlights');\r\n setZoomLevelEducatorsMsg('Global spotlights');\r\n \r\n }\r\n \r\n }\r\n \r\n const onClickAnimateMap = () => {\r\n \r\n boundsChanged.current = false;\r\n \r\n studentsResultsArr = [];\r\n educatorsResultsArr = [];\r\n \r\n setNextExamDate('');\r\n \r\n setIsMapAnimating(!isMapAnimating)\r\n \r\n }\r\n \r\n const onClickCloudPilot = () => {\r\n \r\n // Display OLP resuts in list view.\r\n const optionArr = educatorsFilterArr.filter(option => option.Tag === 'OLP');\r\n \r\n onClickSelectorOption(optionArr[0], 'educators', 'map');\r\n \r\n }\r\n \r\n const initiateComponent = () => {\r\n \r\n // Check that the Google Maps API has loaded.\r\n if ( typeof window.google === 'object' &&\r\n typeof window.google.maps === 'object' ) {\r\n \r\n // Set whether the browser support geolocation.\r\n if ( navigator.geolocation ) {\r\n \r\n navigator.geolocation.getCurrentPosition(curPos => {\r\n \r\n setUserCoords({\r\n lat: curPos.coords.latitude,\r\n lng: curPos.coords.longitude\r\n });\r\n \r\n // Render the map, user has location data.\r\n renderMap();\r\n \r\n },\r\n error => {\r\n \r\n console.log('Map location error: ', error);\r\n \r\n // If the user has denied allowing browser location\r\n // then render map using default coords (London).\r\n renderMap();\r\n \r\n });\r\n\r\n }\r\n // If the browser doesn't support geolocation then render the map\r\n // using default coords (London).\r\n else renderMap();\r\n \r\n }\r\n \r\n // Populate all local states with server data.\r\n getInitialServerData();\r\n \r\n // Set placeholder text.\r\n setInpStudentsPlaceholder('Search for students or select a filter');\r\n setInpEducatorsPlaceholder('Search ALPs or select a filter');\r\n \r\n // Set the index to start map animating from, if 0 will show 1.\r\n // As the animation toggles between 'ALl Students' & 'All Educators'.\r\n //animateIndex.current = 1;\r\n \r\n // Update zoom key messages.\r\n setZoomLevelStudentsMsg('Global spotlights');\r\n setZoomLevelEducatorsMsg('Global spotlights');\r\n \r\n }\r\n \r\n const onClickLogin = () => {\r\n \r\n // Open a login modal through the context api.\r\n toggleLoginModal(true);\r\n \r\n }\r\n \r\n const onClickRegister = () => {\r\n \r\n // Navigate to 'home'.\r\n history.push('/');\r\n \r\n // Open a register modal through the context api.\r\n timer05 = setTimeout(() => toggleRegisterModal(true), 500);\r\n \r\n }\r\n \r\n\r\n \r\n /*\r\n * Component hooks.\r\n */\r\n \r\n useEffect(() => {\r\n \r\n // If PREVIEW mode & user is logged out then we need to fetch a GUEST context using a guest token.\r\n if ( isPreview && !isAuthenticated ) {\r\n \r\n isGuest = true;\r\n \r\n // If in PREVIEW mode then we should start animating with Learning Partners not students.\r\n // By setting the index to 0 it gets flipped in the code and we will get 1/Learning Partners first.\r\n animateIndex.current = 0;\r\n \r\n // Set context api to discoverPreview, true.\r\n setDiscoverPreview(true);\r\n \r\n // Call API user with a guest token.\r\n callApiGuestUser(guestToken);\r\n \r\n }\r\n \r\n // Else create the page as a logged in user.\r\n else initiateComponent();\r\n\r\n // Clean up event listeners.\r\n return () => {\r\n \r\n // Clear external component arrays.\r\n studentsResultsArr = [];\r\n educatorsResultsArr = [];\r\n \r\n // Clear interval loop.\r\n clearTimeout(animateInterval.current);\r\n \r\n // Clear any timers.\r\n clearTimeout(timer01);\r\n clearTimeout(timer02);\r\n clearTimeout(timer03);\r\n clearTimeout(timer04);\r\n \r\n // Tell Context API that this component is now unmounted.\r\n nowUnmountDiscover(true);\r\n \r\n }\r\n \r\n // The eslint comment below removes missing dependency warning from console.\r\n // eslint-disable-next-line\r\n }, []);\r\n \r\n useEffect(() => {\r\n \r\n if ( user !== null && user.FN === 'Guest' ) {\r\n \r\n initiateComponent();\r\n \r\n }\r\n \r\n }, [user]);\r\n \r\n useEffect(() => {\r\n \r\n if ( isAuthenticated ) {\r\n \r\n isGuest = false;\r\n \r\n // Set context api to discoverPreview, true.\r\n setDiscoverPreview(false);\r\n \r\n }\r\n\r\n }, [isAuthenticated]);\r\n \r\n useEffect(() => {\r\n \r\n // Check gMap has been set.\r\n if ( gMap === null ) return;\r\n \r\n // Add map event handlers.\r\n addEventsToMap();\r\n\r\n // Show brand screen.\r\n setIsBrandReady(true);\r\n \r\n }, [gMap]);\r\n \r\n useEffect(() => {\r\n \r\n // Refresh the map to trigger marker fetch.\r\n if ( doFirstRun ) setIsMapAnimating(true);\r\n \r\n // Trigger cloud pilots journey.\r\n timer04 = setTimeout(() => setSailOn(true), 15000);\r\n \r\n }, [doFirstRun]);\r\n \r\n useEffect(() => {\r\n \r\n // Splice 'Students' item from 'searchFilterData' array, the UNID of this\r\n // will be used in the API request. Only run code once by checking educators option is null.\r\n if ( searchFilterData !== null && selectorEducatorsOption === null ) {\r\n \r\n const studentIdx = searchFilterData.findIndex(item => item.Title === 'Student');\r\n \r\n if ( studentIdx !== -1 ) {\r\n \r\n searchFilterData.splice(studentIdx, 1);\r\n \r\n }\r\n \r\n // Populate EDUCATORS filter array from 'searchFilterData' array.\r\n setEducatorsFilterArr([ ...searchFilterData ]);\r\n \r\n // Set initial EDUCATORS selector option.\r\n if ( searchFilterData.length ) {\r\n \r\n setRefCurEducatorsOption(searchFilterData[0]);\r\n setSelectorEducatorsOption(searchFilterData[0]);\r\n \r\n }\r\n \r\n // Update map selector array.\r\n updateMapSelectorArray();\r\n\r\n }\r\n \r\n // If we have a user context & the students option is still null (else this will run on every refresh).\r\n if ( user !== null && selectorStudentsOption === null ) {\r\n \r\n // Populate STUDENTS filter array from the tags list in the users api.\r\n if ( user.tags !== null ) setStudentsFilterArr([ ...studentsFilterArr, ...user.tags ]);\r\n \r\n // Set initial STUDENTS selector option.\r\n if ( studentsFilterArr.length ) {\r\n \r\n setRefCurStudentsOption(studentsFilterArr[0]);\r\n setSelectorStudentsOption(studentsFilterArr[0]);\r\n \r\n }\r\n \r\n }\r\n \r\n }, [searchFilterData, user]);\r\n \r\n useEffect(() => {\r\n \r\n if ( studentsData !== null && isStudentsFetching === true ) {\r\n \r\n setIsStudentsFetching(false);\r\n setSelectorStudentsOption(refCurStudentsOption);\r\n \r\n if ( inpSearchStudents === '' ) setInpStudentsGo(true);\r\n \r\n // Put first 4 students into current array and following 96 into pool.\r\n setStudentsListArr(studentsData.slice(0, numGetresults));\r\n setStudentsListPoolArr(studentsData.slice(numGetresults, numMaxResults));\r\n \r\n // Re-enable 'More' button. \r\n setIsMoreStudents(true);\r\n \r\n }\r\n \r\n if ( errorStudents !== null ) setIsStudentsFetching(false);\r\n \r\n }, [studentsData, errorStudents]);\r\n \r\n useEffect(() => {\r\n \r\n if ( educatorsData !== null && isEducatorsFetching === true ) {\r\n\r\n setIsEducatorsFetching(false);\r\n setSelectorEducatorsOption(refCurEducatorsOption);\r\n \r\n if ( inpSearchEducators === '' ) setInpEducatorsGo(true);\r\n \r\n // Put first 4 educators into current array and following 96 into pool.\r\n setEducatorsListArr(educatorsData.slice(0, numGetresults));\r\n setEducatorsListPoolArr(educatorsData.slice(numGetresults, numMaxResults));\r\n \r\n // Re-enable 'More' button. \r\n setIsMoreEducators(true);\r\n \r\n }\r\n \r\n if ( errorEducators !== null ) setIsEducatorsFetching(false);\r\n \r\n }, [educatorsData, errorEducators]);\r\n \r\n useEffect(() => {\r\n \r\n if ( markersData !== null && isMarkersFetching === true ) {\r\n \r\n // Populate the results map array with fetched server data.\r\n setResultsMapArr([ ...markersData ]); \r\n\r\n }\r\n \r\n }, [markersData, errorMarkers]);\r\n \r\n useEffect(() => {\r\n \r\n // Check gMap has been set.\r\n if ( gMap === null ) return;\r\n \r\n // Clear the markers data array.\r\n clearMarkersData();\r\n \r\n setIsMarkersFetching(false);\r\n \r\n // On subsequent marker fetch...\r\n if ( isMapReady ) renderMarkers(null);\r\n \r\n // First marker fetch after branding screen.\r\n else {\r\n\r\n timer01 = setTimeout(() => {\r\n \r\n timer02 = setTimeout(() => renderMarkers(null), 600);\r\n setZoomQuadOut(true);\r\n setIsBrandReady(false);\r\n timer03 = setTimeout(() => setIsMapReady(true), 1000);\r\n \r\n gMap.setOptions({ zoomControl: true });\r\n \r\n }, brandDelay * 1000);\r\n \r\n }\r\n \r\n }, [resultsMapArr]);\r\n \r\n useEffect(() => {\r\n \r\n if ( allowSelectorFetch ) fetchMapData(mapSelectorOption.searchFilter, mapSelectorOption.tagUNID);\r\n \r\n }, [mapSelectorOption]);\r\n\r\n useEffect(() => {\r\n\r\n if ( isMapAnimating ) {\r\n \r\n setAllowSelectorFetch(false);\r\n \r\n animateMarkers();\r\n \r\n }\r\n else {\r\n \r\n // Stop animation by clearing setInterval.\r\n clearTimeout(animateInterval.current);\r\n \r\n }\r\n \r\n }, [isMapAnimating]);\r\n \r\n useEffect(() => {\r\n \r\n if ( inpSearchStudents === '' &&\r\n selectorStudentsOption !== null ) fetchListData('students', 1024, selectorStudentsOption.UNID, null);\r\n \r\n }, [inpSearchStudents]);\r\n \r\n useEffect(() => {\r\n \r\n if ( inpSearchEducators === '' &&\r\n selectorEducatorsOption !== null ) fetchListData('educators', selectorEducatorsOption.UNID, null, null);\r\n \r\n }, [inpSearchEducators]);\r\n \r\n useEffect(() => {\r\n \r\n if ( refreshMap ) fetchMapData(mapSelectorOption.searchFilter, mapSelectorOption.tagUNID);\r\n \r\n }, [refreshMap]);\r\n \r\n \r\n \r\n \r\n /*\r\n * JSX elements.\r\n */\r\n \r\n const drawBtnUserCntr = (\r\n \r\n ); \r\n \r\n const drawMapSelector = (\r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n { mapSelectorArr.length < 1 \r\n ?\r\n
      \r\n
    • There are no tags to select
    • \r\n
    \r\n : \r\n
      \r\n {mapSelectorArr.map((option, idx) => {\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 const drawBtnAnimate = (\r\n \r\n );\r\n \r\n const drawZoomKey = (\r\n
    \r\n
    \r\n { markersLoading ?\r\n <>\r\n \r\n { isMapKeyStudent ? zoomLevelStudentsMsg + nextExamDate : zoomLevelEducatorsMsg }\r\n \r\n :\r\n <>\r\n \"\"\r\n \"\"\r\n { isMapKeyStudent ? zoomLevelStudentsMsg + nextExamDate : zoomLevelEducatorsMsg }\r\n \r\n }\r\n \r\n
    \r\n
    \r\n );\r\n \r\n const drawBrandScreen = (\r\n
    \r\n
    \r\n
    Discover the community
    \r\n
    \r\n
    \r\n
    A world of ACCA students and learning providers
    \r\n
    \r\n
    \r\n
    \r\n );\r\n \r\n const drawCloudPilot = (\r\n \r\n );\r\n \r\n \r\n \r\n \r\n \r\n /*\r\n * Component view.\r\n */\r\n return (\r\n
    onClickAppPage(event)}>\r\n
    \r\n
    \r\n
    \r\n {drawBtnUserCntr}\r\n {drawMapSelector}\r\n {drawBtnAnimate}\r\n {drawZoomKey}\r\n { !isMapReady && drawBrandScreen }\r\n
    \r\n
    \r\n {drawCloudPilot}\r\n
    \r\n
    \r\n
    \r\n
    \r\n { !isGuest &&\r\n
    \r\n

    \r\n Add exam tags to and use the map, or search below, to discover the community.\r\n

    \r\n
    \r\n }\r\n
    \r\n
    \r\n \r\n

    Discover Students

    \r\n \r\n { isGuest ?\r\n <>\r\n

    \r\n or to get full access to the ACCA Learning Community\r\n

    \r\n \r\n :\r\n <>\r\n
    \r\n
    \r\n onKeyupList(event, 'students')}\r\n onFocus={() => setInpStudentsGo(true)}\r\n onChange={event => setInpSearchStudents(event.target.value)}\r\n placeholder={inpStudentsPlaceholder} />\r\n \r\n
    \r\n
    \r\n
    \r\n { selectorStudentsOption &&\r\n \r\n }\r\n
    \r\n
    \r\n
    \r\n { studentsFilterArr.length < 1 \r\n ?\r\n
      \r\n
    • There are no options to select
    • \r\n
    \r\n : \r\n
      \r\n {studentsFilterArr.map((option, idx) => {\r\n return (\r\n
    • \r\n );\r\n })}\r\n
    \r\n }\r\n
    \r\n
    \r\n
    \r\n
    \r\n { errorStudents !== null &&
    {errorStudents}
    }\r\n { studentsListArr &&\r\n
      \r\n { studentsListArr.length < 1 &&\r\n
    • No students match your search, please try again.
    • \r\n }\r\n { studentsListArr.map((item, idx) => {\r\n return (\r\n
    • \r\n
      \r\n
      \r\n

      {item.ftn}

      \r\n
        \r\n { item.st !== '' &&\r\n
      • \r\n {item.st}\r\n
      • \r\n }\r\n {renderTagList(item)}\r\n
      \r\n
      \r\n
      \r\n
      \r\n
      {item.cy}
      \r\n
      {item.tn}
      \r\n
      \r\n
      \r\n
    • \r\n );\r\n })}\r\n
    \r\n }\r\n { studentsListArr && studentsListArr.length > 0 &&\r\n
    \r\n { ( !isMoreStudents && studentsListArr.length >= 100 ) &&
    First {numMaxResults} results shown
    }\r\n
    \r\n \r\n
    \r\n
    \r\n }\r\n \r\n }\r\n
    \r\n
    \r\n \r\n

    Discover Learning Partners

    \r\n
    \r\n
    \r\n setInpEducatorsGo(true)}\r\n onKeyUp={event => onKeyupList(event, 'educators')}\r\n onChange={event => setInpSearchEducators(event.target.value)}\r\n placeholder={inpEducatorsPlaceholder} />\r\n \r\n
    \r\n
    \r\n
    \r\n { selectorEducatorsOption &&\r\n \r\n }\r\n
    \r\n
    \r\n
    \r\n { educatorsFilterArr.length < 1 \r\n ?\r\n
      \r\n
    • There are no options to select
    • \r\n
    \r\n : \r\n
      \r\n {educatorsFilterArr.map((option, idx) => {\r\n return (\r\n
    • \r\n );\r\n })}\r\n
    \r\n }\r\n
    \r\n
    \r\n
    \r\n
    \r\n { errorEducators !== null &&
    {errorEducators}
    }\r\n { educatorsListArr &&\r\n
      \r\n { educatorsListArr.length < 1 &&\r\n
    • No Approved Learning Partners match your search, please try again.
    • \r\n }\r\n { educatorsListArr.map((item, idx) => {\r\n return (\r\n
    • \r\n
      \r\n
      \r\n

      {item.ftn}

      \r\n {showEducatorStatus(item)}\r\n
      \r\n
      \r\n
      \r\n { item.web &&\r\n \r\n }\r\n
      \r\n
      {item.cy}
      \r\n
      {item.ct}
      \r\n
      \r\n
      \r\n
    • \r\n );\r\n })}\r\n
    \r\n }\r\n { educatorsListArr && educatorsListArr.length > 0 &&\r\n
    \r\n { ( !isMoreEducators && educatorsListArr.length >= 100 ) &&
    First {numMaxResults} results shown
    }\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\nexport default Discover;\r\n","import React, { useState, useContext, useEffect } from 'react';\r\nimport { useHistory } from 'react-router-dom';\r\n\r\nimport Footer from '../layout/Footer';\r\nimport UserContext from '../../context/user/userContext';\r\nimport useWindowDimensions from '../hooks/getWindowDimensions';\r\n\r\n\r\nconst Settings = () => {\r\n \r\n // Define components state hooks.\r\n const [recEmails, setRecEmails] = useState(true);\r\n const [showName, setShowName] = useState(true);\r\n const [showTags, setShowTags] = useState(true);\r\n const [showPin, setShowPin] = useState(true); \r\n const [showSelector, setShowSelector] = useState(false);\r\n const [inpStatusMsg, setInpStatusMsg] = useState('');\r\n const [newPassword, setNewPassword] = useState('');\r\n const [newConfirm, setNewConfirm] = useState('');\r\n const [selectorOption, setSelectorOption] = useState({ tag: 'Select', UNID: 0 });\r\n const [userTagsArr, setUserTagsArr] = useState([]);\r\n const [examTagsArr, setExamTagsArr] = useState([]);\r\n const [newPasswordValid, setNewPasswordValid] = useState(false);\r\n const [newConfirmValid, setNewConfirmValid] = useState(false);\r\n const [newPasswordVisible, setNewPasswordVisible] = useState(false);\r\n const [newConfirmVisible, setNewConfirmVisible] = useState(false);\r\n \r\n // Reference hooks.\r\n const history = useHistory();\r\n \r\n // Get window dimensions.\r\n const { winWidth } = useWindowDimensions();\r\n \r\n // Reference context apis.\r\n const userContext = useContext(UserContext);\r\n \r\n // Destructure contexts.\r\n const { toggleMobileNav, \r\n user, \r\n updateUserData, \r\n errorStatus, \r\n errorTag, \r\n errorChkbox, \r\n errorPassword, \r\n isStatusFetching, \r\n isTagFetching, \r\n isPasswordFetching } = userContext;\r\n \r\n \r\n \r\n /*\r\n * Component methods.\r\n */\r\n \r\n const onChangeValidate = (event, type, validate, maxValue, methods) => {\r\n \r\n const tgt = event.target;\r\n const pwdRegex = /(?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).{6,}/;\r\n \r\n // If validation requested validate value, this will\r\n // enable/disable submit button.\r\n if ( validate ) {\r\n \r\n switch (type) {\r\n case 'password':\r\n methods.validate(tgt.value !== '' && pwdRegex.test(tgt.value) ? true : false);\r\n methods.update(tgt.value);\r\n break;\r\n case 'compare':\r\n methods.validate(tgt.value !== '' && tgt.value === methods.compareTo ? true : false);\r\n methods.update(tgt.value);\r\n break;\r\n default:\r\n methods.validate(tgt.value !== '' ? false : true);\r\n methods.update(tgt.value);\r\n }\r\n \r\n }\r\n \r\n // No validation requested, update value.\r\n else methods.update(tgt.value);\r\n \r\n }\r\n \r\n const onClickExtUrl = url => {\r\n \r\n window.open(url);\r\n \r\n }\r\n \r\n const onChangeCheckbox = (event, state) => {\r\n \r\n const checked = event.target.checked;\r\n \r\n // Send 'receive emails' update to server.\r\n if ( state.updateType === 11 ) {\r\n \r\n updateUserData({ \r\n updatetype: state.updateType,\r\n permissiondigest: checked ? 1 : 0\r\n }, 'email');\r\n \r\n }\r\n \r\n // Else send bitwise checkbox updates to server.\r\n else {\r\n \r\n updateUserData({ \r\n updatetype: state.updateType,\r\n permissions: user.permissions ^ state.setbit\r\n }, 'chkbox');\r\n \r\n }\r\n \r\n }\r\n \r\n const onClickUpdateStatusMsg = () => {\r\n \r\n // PUT new status message onto server.\r\n updateUserData({ \r\n updatetype: 1,\r\n status: inpStatusMsg\r\n }, 'status');\r\n \r\n }\r\n \r\n const onClickUpdatePassword = () => {\r\n \r\n // PUT new status message onto server.\r\n updateUserData({ \r\n updatetype: 2,\r\n newpassword: newPassword\r\n }, 'password');\r\n \r\n }\r\n \r\n const onClickToggleSelector = () => {\r\n \r\n setShowSelector(!showSelector);\r\n \r\n }\r\n \r\n const onClickSelectorOption = ({ tag, UNID }) => {\r\n \r\n // Call useState method to update user tag aray.\r\n setSelectorOption({ tag, UNID });\r\n \r\n // Hide the selector drop down.\r\n onClickToggleSelector();\r\n \r\n }\r\n \r\n const onClickAddTag = () => {\r\n\r\n if ( selectorOption.tag === 'Select' ) return false;\r\n else {\r\n \r\n let chosenItemArr;\r\n \r\n // Splice/Remove element from SELECT TAGS array.\r\n examTagsArr.forEach((item, idx) => {\r\n \r\n if ( item.tag === selectorOption.tag ) chosenItemArr = examTagsArr.splice(idx, 1);\r\n \r\n });\r\n \r\n // When adding a new tag we need to pass 0 as the UNID & then use the tag's real UNID\r\n // as the value for a new property called 'tagLookupUNID'\r\n const tmpArr = [ ...userTagsArr, { UNID: 0, taglookupUNID: chosenItemArr[0].UNID } ];\r\n \r\n // PUT user tags onto server.\r\n updateUserData({ \r\n updatetype: 12,\r\n usertags: tmpArr\r\n }, 'tag');\r\n \r\n // Reset selector to show Select label.\r\n setSelectorOption({ tag: 'Select', UNID: 0 });\r\n \r\n }\r\n\r\n }\r\n \r\n const onClickRemoveTag = option => {\r\n \r\n // Splice element from USER TAGS array.\r\n userTagsArr.forEach((item, idx) => {\r\n \r\n if ( item.tag === option.tag ) userTagsArr.splice(idx, 1);\r\n \r\n });\r\n\r\n const tmpArr = [ ...userTagsArr ];\r\n \r\n // PUT user tags onto server.\r\n updateUserData({ \r\n updatetype: 12,\r\n usertags: tmpArr\r\n }, 'tagRemove');\r\n \r\n }\r\n \r\n const onClickNavigateTo = path => {\r\n \r\n // Navigate to the Settings page using history push.\r\n history.push('/' + path);\r\n \r\n }\r\n \r\n const onClickAppPage = event => {\r\n \r\n const tgt = event.target;\r\n \r\n // If the drop down selector wasn't the target then hide it.\r\n if ( tgt.className !== 'btn-selector' ) setShowSelector(false);\r\n \r\n // Hide the mobile nav, even if not open.\r\n toggleMobileNav(false);\r\n \r\n }\r\n \r\n const getUserName = () => {\r\n \r\n const userFN = user.FN;\r\n const userSN = user.SN;\r\n \r\n if ( userFN !== '' && userSN !== '' ) return userFN + ' ' + userSN + '\\'s ';\r\n else if ( userFN !== '' && userSN === '' ) return userFN + '\\'s ';\r\n else if ( userFN === '' && userSN !== '' ) return userSN + '\\'s ';\r\n else return '';\r\n \r\n }\r\n \r\n const removeUsersTags = (examArr) => {\r\n\r\n const uTagsIdArr = user.usertags.map(item => item.tagLookupUNID);\r\n\r\n return examArr.filter(item => !uTagsIdArr.includes(item.UNID));\r\n\r\n }\r\n \r\n const addTagNames = (userExamArr) => {\r\n \r\n let tmpArr = [];\r\n \r\n userExamArr.forEach(item => {\r\n \r\n const tagMatch = user.tags.filter( tag => tag.UNID === item.tagLookupUNID );\r\n \r\n tmpArr.push({ ...item, tag: tagMatch[0].tag });\r\n \r\n });\r\n \r\n return tmpArr;\r\n \r\n }\r\n \r\n const applyServerDataToView = (userData) => {\r\n \r\n // Remove any tags that the user already has then populate exam tags array.\r\n const tmpArr = removeUsersTags([ ...userData.tags ]);\r\n setExamTagsArr([ selectorOption, ...tmpArr ]);\r\n \r\n // Add tag name to item then populate users tags array.\r\n setUserTagsArr(addTagNames(userData.usertags));\r\n \r\n // Set state of checkboxes from server data flags.\r\n setRecEmails(userData.permissiondigest === 1 ? true : false);\r\n setShowName(userData.permissions & 2 ? true : false);\r\n setShowTags(userData.permissions & 256 ? true : false);\r\n setShowPin(userData.permissions & 128 ? true : false);\r\n \r\n // Set status message from server\r\n if ( userData.status === null ) setInpStatusMsg('');\r\n else setInpStatusMsg(userData.status);\r\n \r\n // Clear password fields.\r\n setNewPassword('');\r\n setNewConfirm('');\r\n setNewPasswordVisible(false);\r\n setNewConfirmVisible(false);\r\n \r\n }\r\n \r\n const togglePwdVisibility = state => state.method(!state.value);\r\n \r\n \r\n \r\n \r\n /*\r\n * Component hooks.\r\n */\r\n \r\n useEffect(() => {\r\n\r\n applyServerDataToView(user);\r\n \r\n // The eslint comment below removes missing dependency warning from console.\r\n // eslint-disable-next-line\r\n }, [user]);\r\n \r\n \r\n \r\n \r\n /*\r\n * Component view.\r\n */\r\n return (\r\n
    onClickAppPage(event)}>\r\n
    \r\n \r\n
    \r\n

    {getUserName()}Public Profile Settings

    \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n

    This will appear on your Discover profile.

    \r\n
    \r\n setInpStatusMsg(event.target.value)}\r\n placeholder=\"max. 72 chars\" />\r\n \r\n
    \r\n
    \r\n { errorStatus !== null &&
    {errorStatus}
    }\r\n
    \r\n \r\n
    \r\n
    \r\n \r\n

    Add exam/session tags to your profile for more relevant content.

    \r\n
    \r\n {userTagsArr.length < 1 \r\n ?\r\n
    You haven't added any tags yet
    \r\n :\r\n
      \r\n {userTagsArr.map((option, idx) => {\r\n return (\r\n
    • \r\n
      {option.tag}
      \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 { examTagsArr.length < 1 \r\n ?\r\n
      \r\n
    • There are no tags to select
    • \r\n
    \r\n : \r\n
      \r\n {examTagsArr.map((option, idx) => {\r\n return (\r\n
    • \r\n );\r\n })}\r\n
    \r\n }\r\n
    \r\n
    \r\n
    \r\n
    \r\n { errorTag !== null &&
    {errorTag}
    }\r\n
    \r\n \r\n
    \r\n
    \r\n \r\n

    Decide what details to display on your public community profile.

    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n { !user.isWPM &&\r\n
    \r\n \r\n
    \r\n }\r\n
    \r\n
    \r\n { errorChkbox !== null &&
    {errorChkbox}
    }\r\n
    \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n onChangeValidate(event, 'password', true, null, { update: setNewPassword, validate: setNewPasswordValid, compareTo: null })}\r\n placeholder=\"New password\" />\r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n onChangeValidate(event, 'compare', true, null, { update: setNewConfirm, validate: setNewConfirmValid, compareTo: newPassword })}\r\n placeholder=\"Confirm new password\" />\r\n \r\n
    \r\n \r\n
    \r\n
    \r\n { errorPassword !== null &&
    {errorPassword}
    }\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\nexport default Settings;\r\n","import React, { useContext } from 'react';\r\n\r\nimport Footer from '../layout/Footer';\r\nimport UserContext from '../../context/user/userContext';\r\n\r\n\r\nconst Help = () => {\r\n \r\n // Reference context apis.\r\n const userContext = useContext(UserContext);\r\n \r\n // Destructure contexts.\r\n const { toggleMobileNav } = userContext;\r\n \r\n \r\n /*\r\n * Component methods.\r\n */\r\n \r\n const onClickMailto = (address) => {\r\n \r\n window.location.href = 'mailto:' + address;\r\n \r\n }\r\n \r\n const onClickAppPage = event => {\r\n \r\n // Hide the mobile nav, even if not open.\r\n toggleMobileNav(false);\r\n \r\n }\r\n \r\n \r\n /*\r\n * Component view.\r\n */\r\n return (\r\n
    onClickAppPage(event)}>\r\n
    \r\n \r\n
    \r\n

    Useful information

    \r\n
    \r\n \r\n
    \r\n
    \r\n

    Welcome to the ACCA Learning Community

    \r\n

    Here you can connect with fellow students around the world. It's a great place to ask questions about your studies, share tips and support each other during exams.

    \r\n

    Below are some guidelines on how to get the most out of it.

    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n

    How to create and share posts

    \r\n

    Before you add a new post, check to see if anyone has already started a thread on the same subject. It's a quick way to find information and you can also add to the discussion.

    \r\n

    If you can't find what you need, create your own post in the relevant learning channel. Make sure your subject title is as clear as possible, it should be short and easy to understand. Please don’t write in ALL CAPS.

    \r\n

    You can add general study topic tags to a post, which helps other students search for it in the learning channel.

    \r\n

    Help attract attention to useful threads by using the voting buttons to the left of all posts.

    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n

    Community standards

    \r\n

    The Learning Community is here to allow students to engage, solve problems and provide advice. To ensure that it is a safe, enjoyable and valuable resource, there are some rules on how to behave.

    \r\n
      \r\n
    • \r\n Be kind and support each other. Something that seems simple to you might be harder for others to understand – this is a space for them to reach out and ask for help. Please don’t insult or abuse another member of the community. \r\n
    • \r\n
    • \r\n Stick to relevant topics. Any post which includes inappropriate or offensive content will be removed. This includes:\r\n
        \r\n
      • Advertising. Any type of commercial activity, such as the sale of study materials, is not allowed.
      • \r\n
      • Spam and scams. Do not attempt to disrupt the community or share harmful content. Be aware that repetitive or excessive posting is considered spam and will be removed.
      • \r\n
      \r\n
    • \r\n
    • \r\n Stay safe. Remember that anything you post will be visible to the rest of the community. Avoid sharing sensitive personal details or confidential information about employers and clients. \r\n
    • \r\n
    • \r\n Help to moderate the community. If you see a post that contains offensive material or incorrect information, please report it. An ACCA Community Manager is on hand to deal with these issues. \r\n
    • \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n

    Still have questions?

    \r\n

    If you have a question or feedback that can’t be resolved by the community, please email .

    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n );\r\n \r\n}\r\n\r\nexport default Help;\r\n","import React, { useState, useContext, useRef, useEffect } from 'react';\r\nimport Modal from 'react-modal';\r\n\r\nimport UserContext from '../../context/user/userContext';\r\n\r\n\r\nconst Modals = () => {\r\n \r\n // Define components state hooks.\r\n const [currentYear, setCurrentYear] = useState(2020);\r\n const [inpLoginEmail, setInpLoginEmail] = useState('');\r\n const [inpLoginPassword, setInpLoginPassword] = useState('');\r\n const [inpForgotId, setInpForgotId] = useState('');\r\n const [inpForgotEmail, setInpForgotEmail] = useState('');\r\n const [inpRegisterId, setInpRegisterId] = useState('');\r\n const [inpRegisterDay, setInpRegisterDay] = useState('');\r\n const [inpRegisterMonth, setInpRegisterMonth] = useState('');\r\n const [inpRegisterYear, setInpRegisterYear] = useState('');\r\n const [inpRegisterPassword, setInpRegisterPassword] = useState('');\r\n const [inpRegisterConfirm, setInpRegisterConfirm] = useState(''); \r\n const [inpRememberMe, setInpRememberMe] = useState(true);\r\n const [switchToLogin, setSwitchToLogin] = useState(false);\r\n const [switchToRegister, setSwitchToRegister] = useState(false);\r\n const [isForgotPassword, setIsForgotPassword] = useState(false);\r\n const [loginEmailValid, setLoginEmailValid] = useState(false);\r\n const [loginPwdValid, setLoginPwdValid] = useState(false);\r\n const [forgotEmailValid, setForgotEmailValid] = useState(false);\r\n const [forgotIdValid, setForgotIdValid] = useState(false);\r\n const [registerIdValid, setRegisterIdValid] = useState(false);\r\n const [registerDayValid, setRegisterDayValid] = useState(false);\r\n const [registerMonthValid, setRegisterMonthValid] = useState(false);\r\n const [registerYearValid, setRegisterYearValid] = useState(false);\r\n const [registerPwdValid, setRegisterPwdValid] = useState(false);\r\n const [registerCfmValid, setRegisterCfmValid] = useState(false);\r\n const [btnLoginDisabled, setBtnLoginDisabled] = useState(true);\r\n const [btnForgotDisabled, setBtnForgotDisabled] = useState(true);\r\n const [btnRegisterDisabled, setBtnRegisterDisabled] = useState(true);\r\n const [loginPwdVisible, setLoginPwdVisible] = useState(false);\r\n const [registerPwdVisible, setRegisterPwdVisible] = useState(false);\r\n const [registerCfmVisible, setRegisterCfmVisible] = useState(false);\r\n \r\n // Element reference hooks.\r\n const refLoginEmail = useRef(null);\r\n const refLoginPwd = useRef(null);\r\n const refForgotEmail = useRef(null);\r\n const refForgotId = useRef(null);\r\n const refRegisterId = useRef(null);\r\n const refRegisterDay = useRef(null);\r\n const refRegisterMonth = useRef(null);\r\n const refRegisterYear = useRef(null);\r\n const refRegisterPwd = useRef(null);\r\n const refRegisterCfm = useRef(null);\r\n \r\n // Reference context apis.\r\n const userContext = useContext(UserContext);\r\n \r\n // Destructure contexts.\r\n const { showLogin, \r\n showRegister, \r\n showRegSuccessMsg, \r\n toggleLoginModal, \r\n toggleRegisterModal, \r\n login, \r\n resetPassword, \r\n isFetching, \r\n error, \r\n forgotPwdMsg, \r\n resetForgotPwdMsg, \r\n register, \r\n toggleAttest, \r\n toggleAttestModal, \r\n navRedirect, \r\n toggleRegSuccessMsgModal } = userContext;\r\n \r\n // Set modal to body for accessibility.\r\n Modal.setAppElement('body');\r\n \r\n\r\n \r\n /*\r\n * Component methods.\r\n */\r\n \r\n const onKeyupFocusNext = (event, props) => {\r\n \r\n const tgt = event.target;\r\n\r\n if ( event.key === 'Tab' || \r\n event.key === 'Shift' || \r\n event.key === 'ArrowLeft' ||\r\n event.key === 'ArrowRight' ) {\r\n\r\n // Do nothing...\r\n \r\n }\r\n else {\r\n \r\n if ( tgt.value.length >= tgt.maxLength ) props.nextInp.current.focus();\r\n \r\n }\r\n\r\n }\r\n \r\n const onChangeValidate = (event, type, validate, maxValue, methods) => {\r\n \r\n const tgt = event.target;\r\n const numArr = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];\r\n const valArr = [...tgt.value];\r\n const pwdRegex = /(?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).{6,}/;\r\n \r\n let validNum = true;\r\n \r\n // If validation requested validate value, this will\r\n // enable/disable submit button.\r\n if ( validate ) {\r\n \r\n switch (type) {\r\n case 'email':\r\n methods.validate(tgt.value !== '' && ( tgt.validity !== null && tgt.validity.valid ) ? true : false); \r\n methods.update(tgt.value); \r\n break;\r\n case 'number':\r\n \r\n valArr.forEach((item, idx) => {\r\n \r\n if ( !numArr.includes(item) ) validNum = false;\r\n \r\n });\r\n \r\n if ( validNum ) {\r\n \r\n methods.validate(tgt.value !== '' ? true : false);\r\n methods.update(tgt.value);\r\n \r\n }\r\n\r\n break;\r\n case 'date':\r\n \r\n valArr.forEach((item, idx) => {\r\n \r\n if ( !numArr.includes(item) ) validNum = false;\r\n \r\n });\r\n \r\n if ( validNum ) {\r\n \r\n methods.validate(tgt.value !== '' && tgt.value <= maxValue ? true : false);\r\n methods.update(tgt.value);\r\n \r\n }\r\n\r\n break;\r\n case 'password':\r\n methods.validate(tgt.value !== '' && pwdRegex.test(tgt.value) ? true : false);\r\n methods.update(tgt.value);\r\n break;\r\n case 'compare':\r\n methods.validate(tgt.value !== '' && tgt.value === methods.compareTo ? true : false);\r\n methods.update(tgt.value);\r\n break;\r\n default:\r\n methods.validate(tgt.value !== '' ? true : false);\r\n methods.update(tgt.value);\r\n }\r\n \r\n }\r\n \r\n // No validation requested, update value.\r\n else methods.update(tgt.value);\r\n \r\n }\r\n \r\n const resetLoginInputs = () => {\r\n \r\n setInpLoginEmail('');\r\n setInpLoginPassword('');\r\n\r\n }\r\n \r\n const resetRegisterInputs = () => {\r\n \r\n // Add delay to resetting to give modal time to fade out.\r\n setTimeout(() => {\r\n \r\n setInpRegisterId('');\r\n setInpRegisterDay('');\r\n setInpRegisterMonth('');\r\n setInpRegisterYear('');\r\n setInpRegisterPassword('');\r\n setInpRegisterConfirm('');\r\n \r\n toggleAttestModal(false);\r\n toggleRegSuccessMsgModal(false);\r\n \r\n }, 500);\r\n \r\n \r\n }\r\n \r\n const hideLogin = () => {\r\n \r\n // Open a login modal through the context api.\r\n toggleLoginModal(false);\r\n \r\n // Clear form inputs.\r\n resetLoginInputs();\r\n \r\n // Reset redirect prop.\r\n navRedirect({ doRedirect: false, redirectTo: null });\r\n \r\n }\r\n \r\n const hideRegister = () => {\r\n \r\n // Open a login modal through the context api.\r\n toggleRegisterModal(false);\r\n \r\n // Clear form inputs.\r\n resetRegisterInputs();\r\n \r\n // Reset redirect prop.\r\n navRedirect({ doRedirect: false, redirectTo: null });\r\n \r\n }\r\n\r\n const onClickLogin = () => {\r\n \r\n // Show error msg.\r\n setInputErrorMsg(loginEmailValid, refLoginEmail, 'Please check your email address and try again');\r\n setInputErrorMsg(loginPwdValid, refLoginPwd, 'Please check your password and try again');\r\n \r\n // If we have valid data post it to the server.\r\n if ( loginEmailValid && loginPwdValid ) {\r\n \r\n // Collect request data.\r\n const reqData = {\r\n username : inpLoginEmail,\r\n password : inpLoginPassword,\r\n code : inpLoginPassword,\r\n rememberMe : inpRememberMe\r\n };\r\n \r\n login(reqData);\r\n \r\n }\r\n\r\n }\r\n \r\n const onClickResetPassword = () => {\r\n \r\n // Show error msg.\r\n setInputErrorMsg(forgotEmailValid, refForgotEmail, 'Please check your email address and try again');\r\n setInputErrorMsg(forgotIdValid, refForgotId, 'Please check your id and try again');\r\n \r\n // If we have valid data post it to the server.\r\n if ( forgotEmailValid && forgotIdValid ) {\r\n \r\n // Collect request data.\r\n const reqData = { \r\n RegistrationCode : inpForgotId, \r\n Email : inpForgotEmail \r\n };\r\n \r\n resetPassword(reqData);\r\n \r\n }\r\n \r\n }\r\n \r\n const onClickRegister = () => {\r\n \r\n // If passwords are not the requred length & don't match inform user.\r\n if ( inpRegisterPassword.length < 6 ) setInputErrorMsg(registerPwdValid, refRegisterPwd, 'Your password must be between 6 and 12 characters');\r\n if ( inpRegisterConfirm.length < 6 ) setInputErrorMsg(registerCfmValid, refRegisterCfm, 'Your password must be between 6 and 12 characters');\r\n \r\n // Send data to server... \r\n // If we have valid data show ATTEST modal, where user can attest to register.\r\n if ( registerIdValid && registerDayValid && \r\n registerMonthValid && registerYearValid && \r\n registerPwdValid && registerCfmValid ) {\r\n \r\n toggleAttestModal(true);\r\n \r\n }\r\n \r\n }\r\n \r\n const onClickTermsAccept = () => {\r\n \r\n // Collect request data.\r\n const reqData = {\r\n regId : inpRegisterId,\r\n dob : inpRegisterDay + '-' + inpRegisterMonth + '-' + inpRegisterYear,\r\n password : inpRegisterPassword\r\n };\r\n \r\n navRedirect({ doRedirect: true, redirectTo: 'settings' });\r\n register(reqData);\r\n \r\n }\r\n \r\n const onClickSwitchToRegister = () => {\r\n \r\n // Set a flag to open Register modal when Login modal has closed.\r\n setSwitchToRegister(true);\r\n \r\n // Close Login modal.\r\n toggleLoginModal(false);\r\n \r\n }\r\n \r\n const onClickSwitchToLogin = () => {\r\n \r\n // Set a flag to open Login modal when Register modal has closed.\r\n setSwitchToLogin(true);\r\n \r\n // Close Register modal.\r\n toggleRegisterModal(false);\r\n \r\n }\r\n \r\n const onLoginClosed = () => {\r\n \r\n // If requested open Register modal.\r\n if ( switchToRegister ) toggleRegisterModal(true);\r\n \r\n // Remove flag to open Register modal when Login modal has closed.\r\n setSwitchToRegister(false);\r\n \r\n }\r\n \r\n const onRegisterClosed = () => {\r\n \r\n // If requested open Login modal.\r\n if ( switchToLogin ) toggleLoginModal(true);\r\n \r\n // Remove flag to open Login modal when Register modal has closed.\r\n setSwitchToLogin(false);\r\n \r\n }\r\n \r\n const onClickForgottenPassword = () => {\r\n \r\n // Reset forgot pasword message, even if now set.\r\n resetForgotPwdMsg();\r\n \r\n // Switch to forgot password modal.\r\n setIsForgotPassword(true);\r\n \r\n }\r\n \r\n const onClickBackToLogin = () => {\r\n \r\n // Switch to Login form.\r\n setIsForgotPassword(false);\r\n \r\n // Clear Forgot form inputs.\r\n setInpForgotId('');\r\n setInpForgotEmail('');\r\n \r\n // Reset forgot pasword message, even if now set.\r\n resetForgotPwdMsg();\r\n \r\n }\r\n \r\n const onClickExtUrl = (url) => {\r\n \r\n window.open(url);\r\n \r\n }\r\n \r\n const setInputErrorMsg = (isValid, inpRef, msg) => {\r\n \r\n if ( inpRef.current.nextSibling === null ) return false;\r\n \r\n if ( isValid ) inpRef.current.nextSibling.innerHTML = '';\r\n else inpRef.current.nextSibling.innerHTML = msg;\r\n \r\n }\r\n \r\n const togglePwdVisibility = state => state.method(!state.value);\r\n \r\n const onKeyupLogin = event => {\r\n \r\n if ( event.key === 'Enter' && loginEmailValid && loginPwdValid ) onClickLogin();\r\n \r\n }\r\n \r\n const onKeyupRegister = event => {\r\n \r\n if ( event.key === 'Enter' &&\r\n registerIdValid && \r\n registerDayValid && \r\n registerMonthValid && \r\n registerYearValid && \r\n registerPwdValid && \r\n registerCfmValid ) onClickRegister();\r\n \r\n }\r\n\r\n \r\n \r\n \r\n /*\r\n * Component hooks.\r\n */\r\n \r\n useEffect(() => {\r\n\r\n // Set current year variable.\r\n const date = new Date();\r\n setCurrentYear(date.getFullYear());\r\n \r\n // The eslint comment below removes missing dependency warning from console.\r\n // eslint-disable-next-line\r\n }, []);\r\n \r\n useEffect(() => {\r\n \r\n // Toggle LOGIN button.\r\n if ( loginEmailValid && loginPwdValid ) setBtnLoginDisabled(false);\r\n else setBtnLoginDisabled(true);\r\n\r\n // Toggle FORGOT button.\r\n if ( forgotEmailValid && forgotIdValid ) setBtnForgotDisabled(false);\r\n else setBtnForgotDisabled(true);\r\n \r\n // Toggle REGISTER button.\r\n if ( registerIdValid && \r\n registerDayValid && \r\n registerMonthValid && \r\n registerYearValid && \r\n registerPwdValid && \r\n registerCfmValid ) setBtnRegisterDisabled(false);\r\n else setBtnRegisterDisabled(true);\r\n \r\n if ( !showLogin ) resetLoginInputs();\r\n if ( !showRegister ) resetRegisterInputs();\r\n \r\n // The eslint comment below removes missing dependency warning from console.\r\n // eslint-disable-next-line\r\n }, [loginEmailValid, loginPwdValid, forgotEmailValid, forgotIdValid, registerIdValid, registerDayValid, registerMonthValid, registerYearValid, registerPwdValid, registerCfmValid, showLogin, showRegister]);\r\n \r\n \r\n \r\n\r\n \r\n /*\r\n * Component view.\r\n */\r\n return (\r\n <>\r\n \r\n \r\n { isForgotPassword ? \r\n <> \r\n

    Forgotten password?

    \r\n { forgotPwdMsg !== null ?\r\n <>\r\n

    {forgotPwdMsg}

    \r\n
    \r\n \r\n
    \r\n \r\n :\r\n <>\r\n

    Enter your details and click on reset below and we will send you a password reset email.

    \r\n
    \r\n \r\n onChangeValidate(event, 'text', true, null, { update: setInpForgotId, validate: setForgotIdValid, compareTo: null })} />\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n \r\n onChangeValidate(event, 'email', true, null, { update: setInpForgotEmail, validate: setForgotEmailValid, compareTo: null })}\r\n placeholder=\"e.g. user@email.com\" />\r\n
    \r\n
    \r\n
    {error}
    \r\n
    \r\n \r\n \r\n
    \r\n \r\n }\r\n \r\n :\r\n <>\r\n

    Log in to the Learning Community

    \r\n

    You need to be to join the community.

    \r\n
    \r\n \r\n onChangeValidate(event, 'email', true, null, { update: setInpLoginEmail, validate: setLoginEmailValid, compareTo: null })}\r\n placeholder=\"e.g. user@email.com\" />\r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n onKeyupLogin(event)}\r\n onChange={event => onChangeValidate(event, 'text', true, null, { update: setInpLoginPassword, validate: setLoginPwdValid, compareTo: null })} />\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
    {error}
    \r\n
    \r\n \r\n \r\n
    \r\n \r\n }\r\n \r\n
    \r\n \r\n { toggleAttest ?\r\n <>\r\n { showRegSuccessMsg ?\r\n <> \r\n

    You are now registered

    \r\n

    \r\n {`Please log in with your ACCA registered email and the password you just entered. Click the button below to go to the login screen.`}\r\n

    \r\n
    \r\n \r\n \r\n
    \r\n \r\n :\r\n <>\r\n

    Confirm terms

    \r\n

    \r\n By clicking the 'I accept' button below, all users of this site agree to be bound by ACCA's website terms of use and accept that they must act professionally in all their discussions and interactions with others on this site.\r\n

    \r\n

    \r\n {`The views expressed on the forums are not necessarily those of ACCA. In addition, site users acknowledge that whilst ACCA is \r\n the provider of this interactive service, we are under no obligation to oversee, monitor or moderate the service, and we expressly \r\n exclude our liability for any loss or damage arising from the use of any interactive service by a user in contravention of our \r\n website terms of use, whether it is moderated or not.`}\r\n

    \r\n
    \r\n \r\n \r\n
    \r\n \r\n }\r\n \r\n :\r\n <>\r\n

    Register with the Learning Community

    \r\n

    \r\n You need an ACCA registered email address to create and log in to your Learning Community account.\r\n

    \r\n

    \r\n Please note that it may take up to 7 days from the date of your initial registration with ACCA to register for a Learning Community account.\r\n

    \r\n
    \r\n \r\n onKeyupFocusNext(event, { nextInp: refRegisterDay })}\r\n onChange={event => onChangeValidate(event, 'number', true, null, { update: setInpRegisterId, validate: setRegisterIdValid, compareTo: null })}\r\n placeholder=\"e.g. 1234567\" />\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n onKeyupFocusNext(event, { nextInp: refRegisterMonth })}\r\n onChange={event => onChangeValidate(event, 'date', true, 31, { update: setInpRegisterDay, validate: setRegisterDayValid, compareTo: null })} />\r\n /\r\n onKeyupFocusNext(event, { nextInp: refRegisterYear })}\r\n onChange={event => onChangeValidate(event, 'date', true, 12, { update: setInpRegisterMonth, validate: setRegisterMonthValid, compareTo: null })} />\r\n /\r\n onKeyupFocusNext(event, { nextInp: refRegisterPwd })}\r\n onChange={event => onChangeValidate(event, 'date', true, currentYear, { update: setInpRegisterYear, validate: setRegisterYearValid, compareTo: null })} />\r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n onChangeValidate(event, 'password', true, null, { update: setInpRegisterPassword, validate: setRegisterPwdValid, compareTo: null })} />\r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n onKeyupRegister(event)}\r\n onChange={event => onChangeValidate(event, 'compare', true, null, { update: setInpRegisterConfirm, validate: setRegisterCfmValid, compareTo: inpRegisterPassword })} />\r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n By clicking the \"Register\" button you agree to the .\r\n
    \r\n
    {error}
    \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\nexport default Modals;\r\n","import {\r\n TOGGLE_LOGIN_MODAL,\r\n TOGGLE_REGISTER_MODAL,\r\n TOGGLE_ATTEST,\r\n TOGGLE_REG_SUCCESS_MSG,\r\n SET_FETCHING,\r\n LOGIN_SUCCESS,\r\n LOGIN_ERROR,\r\n LOGOUT,\r\n USER_SUCCESS,\r\n USER_ERROR,\r\n GUEST_USER_SUCCESS,\r\n GUEST_USER_ERROR,\r\n NAV_REDIRECT,\r\n RESET_PWD_SUCCESS,\r\n RESET_PWD_ERROR,\r\n RESET_FORGOT_PWD_MSG,\r\n REGISTER_SUCCESS,\r\n REGISTER_ERROR,\r\n FORUM_DATA_SUCCESS,\r\n FORUM_DATA_ERROR,\r\n UPDATE_USER_SUCCESS,\r\n UPDATE_EMAIL_ERROR, \r\n UPDATE_STATUS_ERROR,\r\n UPDATE_TAG_ERROR,\r\n UPDATE_CHKBOX_ERROR,\r\n UPDATE_PASSWORD_ERROR,\r\n SET_STATUS_FETCHING,\r\n SET_TAG_FETCHING,\r\n SET_TAG_REMOVE_FETCHING,\r\n SET_PASSWORD_FETCHING,\r\n TOGGLE_MOBILE_NAV,\r\n SET_COMMUNITY_QUERY,\r\n GET_STUDENTS_DATA,\r\n STUDENTS_DATA_SUCCESS,\r\n STUDENTS_DATA_ERROR,\r\n GET_EDUCATORS_DATA,\r\n EDUCATORS_DATA_SUCCESS,\r\n EDUCATORS_DATA_ERROR,\r\n GET_MARKERS_DATA,\r\n CLEAR_MARKERS_DATA,\r\n MARKERS_DATA_SUCCESS,\r\n MARKERS_DATA_ERROR,\r\n GET_SEARCH_FILTER_DATA,\r\n SEARCH_FILTER_DATA_SUCCESS,\r\n SEARCH_FILTER_DATA_ERROR,\r\n UNMOUNT_DISCOVER,\r\n SET_DISCOVER_PREVIEW\r\n} from '../types';\r\n\r\n\r\nexport default (state, action) => {\r\n \r\n switch (action.type) {\r\n case TOGGLE_MOBILE_NAV:\r\n return {\r\n ...state,\r\n mobNavState: action.payload\r\n };\r\n case TOGGLE_LOGIN_MODAL:\r\n return {\r\n ...state,\r\n showLogin: action.payload,\r\n error: null\r\n };\r\n case TOGGLE_REGISTER_MODAL:\r\n return {\r\n ...state,\r\n showRegister: action.payload,\r\n error: null\r\n };\r\n case TOGGLE_ATTEST:\r\n return {\r\n ...state,\r\n toggleAttest: action.payload,\r\n error: null\r\n };\r\n case TOGGLE_REG_SUCCESS_MSG:\r\n return {\r\n ...state,\r\n showRegSuccessMsg: action.payload\r\n };\r\n case NAV_REDIRECT:\r\n return {\r\n ...state,\r\n doRedirect: action.payload.doRedirect,\r\n redirectTo: action.payload.redirectTo\r\n };\r\n case SET_FETCHING:\r\n return {\r\n ...state,\r\n isFetching: true,\r\n error: null\r\n };\r\n case LOGIN_SUCCESS:\r\n return {\r\n ...state,\r\n isLogout: false,\r\n token: action.payload.code,\r\n error: null\r\n };\r\n case USER_SUCCESS:\r\n return {\r\n ...state,\r\n user: action.payload,\r\n isAuthenticated: true,\r\n isFetching: false,\r\n showLogin: false,\r\n error: null\r\n };\r\n case GUEST_USER_SUCCESS:\r\n return {\r\n ...state,\r\n user: action.payload,\r\n error: null\r\n };\r\n case GUEST_USER_ERROR:\r\n return {\r\n ...state,\r\n error: action.payload\r\n };\r\n case RESET_PWD_SUCCESS:\r\n return { \r\n ...state,\r\n forgotPwdMsg: action.payload.code,\r\n isFetching: false,\r\n };\r\n case RESET_PWD_ERROR:\r\n return { \r\n ...state,\r\n isFetching: false,\r\n };\r\n case RESET_FORGOT_PWD_MSG:\r\n return {\r\n ...state,\r\n forgotPwdMsg: null\r\n };\r\n case REGISTER_SUCCESS:\r\n return {\r\n ...state,\r\n // user: action.payload,\r\n // isAuthenticated: true,\r\n isFetching: false,\r\n // showRegister: false,\r\n showRegSuccessMsg: true,\r\n error: null\r\n };\r\n case REGISTER_ERROR:\r\n return {\r\n ...state,\r\n showRegSuccessMsg: false,\r\n toggleAttest: false,\r\n isFetching: false,\r\n error: action.payload\r\n };\r\n case LOGIN_ERROR:\r\n case USER_ERROR:\r\n case LOGOUT:\r\n return {\r\n ...state,\r\n isLogout: true,\r\n token: null,\r\n isAuthenticated: false,\r\n isFetching: false,\r\n user: null,\r\n error: action.payload\r\n };\r\n case FORUM_DATA_SUCCESS:\r\n return {\r\n ...state,\r\n forumTotalPosts: action.payload.totalPosts,\r\n forumTotalStudents: action.payload.totalStudents,\r\n forumOnlineStudents: action.payload.onlineStudents,\r\n error: null\r\n };\r\n case FORUM_DATA_ERROR:\r\n return {\r\n ...state,\r\n forumTotalPosts: null,\r\n forumTotalStudents: null,\r\n forumOnlineStudents: null,\r\n error: action.payload\r\n };\r\n case UPDATE_USER_SUCCESS:\r\n return {\r\n ...state,\r\n user: action.payload,\r\n isStatusFetching: false,\r\n isTagFetching: false,\r\n isTagRemoveFetching: false,\r\n isPasswordFetching: false,\r\n error: null\r\n };\r\n case UPDATE_EMAIL_ERROR:\r\n return {\r\n ...state,\r\n isStatusFetching: false,\r\n isTagFetching: false,\r\n isTagRemoveFetching: false,\r\n isPasswordFetching: false,\r\n errorEmail: action.payload\r\n };\r\n case UPDATE_STATUS_ERROR:\r\n return {\r\n ...state,\r\n isStatusFetching: false,\r\n isTagFetching: false,\r\n isTagRemoveFetching: false,\r\n isPasswordFetching: false,\r\n errorStatus: action.payload\r\n };\r\n case UPDATE_TAG_ERROR:\r\n return {\r\n ...state,\r\n isStatusFetching: false,\r\n isTagFetching: false,\r\n isTagRemoveFetching: false,\r\n isPasswordFetching: false,\r\n errorTag: action.payload\r\n };\r\n case UPDATE_CHKBOX_ERROR:\r\n return {\r\n ...state,\r\n isStatusFetching: false,\r\n isTagFetching: false,\r\n isTagRemoveFetching: false,\r\n isPasswordFetching: false,\r\n errorChkbox: action.payload\r\n };\r\n case UPDATE_PASSWORD_ERROR:\r\n return {\r\n ...state,\r\n isStatusFetching: false,\r\n isTagFetching: false,\r\n isTagRemoveFetching: false,\r\n isPasswordFetching: false,\r\n errorPassword: action.payload\r\n };\r\n case SET_STATUS_FETCHING:\r\n return {\r\n ...state,\r\n isStatusFetching: true\r\n };\r\n case SET_TAG_FETCHING:\r\n return {\r\n ...state,\r\n isTagFetching: true\r\n };\r\n case SET_TAG_REMOVE_FETCHING:\r\n return {\r\n ...state,\r\n isTagRemoveFetching: true\r\n };\r\n case SET_PASSWORD_FETCHING:\r\n return {\r\n ...state,\r\n isPasswordFetching: true\r\n };\r\n case SET_COMMUNITY_QUERY:\r\n return {\r\n ...state,\r\n communityQuery: action.payload\r\n };\r\n case GET_STUDENTS_DATA:\r\n return {\r\n ...state,\r\n errorStudents: null\r\n };\r\n case STUDENTS_DATA_SUCCESS:\r\n return {\r\n ...state,\r\n studentsData: action.payload,\r\n errorStudents: null\r\n };\r\n case STUDENTS_DATA_ERROR:\r\n return {\r\n ...state,\r\n errorStudents: action.payload\r\n };\r\n case GET_EDUCATORS_DATA:\r\n return {\r\n ...state,\r\n errorEducators: null\r\n };\r\n case EDUCATORS_DATA_SUCCESS:\r\n return {\r\n ...state,\r\n educatorsData: action.payload,\r\n errorEducators: null\r\n };\r\n case EDUCATORS_DATA_ERROR:\r\n return {\r\n ...state,\r\n errorEducators: action.payload\r\n }; \r\n case GET_MARKERS_DATA:\r\n return {\r\n ...state,\r\n errorMarkers: null\r\n };\r\n case CLEAR_MARKERS_DATA:\r\n return {\r\n ...state,\r\n markersData: null\r\n };\r\n case MARKERS_DATA_SUCCESS:\r\n return {\r\n ...state,\r\n markersData: action.payload,\r\n errorMarkers: null\r\n };\r\n case MARKERS_DATA_ERROR:\r\n return {\r\n ...state,\r\n errorMarkers: action.payload\r\n };\r\n case GET_SEARCH_FILTER_DATA:\r\n return {\r\n ...state,\r\n error: null\r\n };\r\n case SEARCH_FILTER_DATA_SUCCESS:\r\n return {\r\n ...state,\r\n searchFilterData: action.payload,\r\n error: null\r\n };\r\n case SEARCH_FILTER_DATA_ERROR:\r\n return {\r\n ...state,\r\n error: action.payload\r\n };\r\n case UNMOUNT_DISCOVER:\r\n return {\r\n ...state,\r\n unmountDiscover: action.payload\r\n };\r\n case SET_DISCOVER_PREVIEW:\r\n return {\r\n ...state,\r\n discoverPreview: action.payload\r\n };\r\n default:\r\n return state;\r\n }\r\n \r\n}\r\n ","export const SET_FETCHING = 'SET_FETCHING';\r\nexport const LOGIN_USER = 'LOGIN_USER';\r\nexport const LOGIN_SUCCESS = 'LOGIN_SUCCESS';\r\nexport const LOGIN_ERROR = 'LOGIN_ERROR';\r\nexport const LOGOUT = 'LOGOUT';\r\nexport const USER_SUCCESS = 'USER_SUCCESS';\r\nexport const USER_ERROR = 'USER_ERROR';\r\nexport const GUEST_USER_SUCCESS = 'GUEST_USER_SUCCESS';\r\nexport const GUEST_USER_ERROR = 'GUEST_USER_ERROR';\r\nexport const NAV_REDIRECT = 'NAV_REDIRECT';\r\nexport const RESET_PWD_SUCCESS = 'RESET_PWD_SUCCESS';\r\nexport const RESET_PWD_ERROR = 'RESET_PWD_ERROR';\r\nexport const RESET_FORGOT_PWD_MSG = 'RESET_FORGOT_PWD_MSG';\r\nexport const REGISTER_SUCCESS = 'REGISTER_SUCCESS';\r\nexport const REGISTER_ERROR = 'REGISTER_ERROR';\r\nexport const TOGGLE_LOGIN_MODAL = 'TOGGLE_LOGIN_MODAL';\r\nexport const TOGGLE_REGISTER_MODAL = 'TOGGLE_REGISTER_MODAL';\r\nexport const TOGGLE_ATTEST = 'TOGGLE_ATTEST';\r\nexport const TOGGLE_REG_SUCCESS_MSG = 'TOGGLE_REG_SUCCESS_MSG';\r\nexport const FORUM_DATA_SUCCESS = 'FORUM_DATA_SUCCESS';\r\nexport const FORUM_DATA_ERROR = 'FORUM_DATA_ERROR';\r\nexport const UPDATE_USER_SUCCESS = 'UPDATE_USER_SUCCESS';\r\nexport const UPDATE_EMAIL_ERROR = 'UPDATE_EMAIL_ERROR';\r\nexport const UPDATE_STATUS_ERROR = 'UPDATE_STATUS_ERROR';\r\nexport const UPDATE_TAG_ERROR = 'UPDATE_TAG_ERROR';\r\nexport const UPDATE_CHKBOX_ERROR = 'UPDATE_CHKBOX_ERROR';\r\nexport const UPDATE_PASSWORD_ERROR = 'UPDATE_PASSWORD_ERROR';\r\nexport const SET_STATUS_FETCHING = 'SET_STATUS_FETCHING';\r\nexport const SET_TAG_FETCHING = 'SET_TAG_FETCHING';\r\nexport const SET_TAG_REMOVE_FETCHING = 'SET_TAG_REMOVE_FETCHING';\r\nexport const SET_PASSWORD_FETCHING = 'SET_PASSWORD_FETCHING';\r\nexport const TOGGLE_MOBILE_NAV = 'TOGGLE_MOBILE_NAV';\r\nexport const SET_COMMUNITY_QUERY = 'SET_COMMUNITY_QUERY';\r\nexport const GET_STUDENTS_DATA = 'GET_STUDENTS_DATA';\r\nexport const STUDENTS_DATA_SUCCESS = 'STUDENTS_DATA_SUCCESS';\r\nexport const STUDENTS_DATA_ERROR = 'STUDENTS_DATA_ERROR';\r\nexport const GET_EDUCATORS_DATA = 'GET_EDUCATORS_DATA';\r\nexport const EDUCATORS_DATA_SUCCESS = 'EDUCATORS_DATA_SUCCESS';\r\nexport const EDUCATORS_DATA_ERROR = 'EDUCATORS_DATA_ERROR';\r\nexport const GET_MARKERS_DATA = 'GET_MARKERS_DATA';\r\nexport const CLEAR_MARKERS_DATA = 'CLEAR_MARKERS_DATA';\r\nexport const MARKERS_DATA_SUCCESS = 'MARKERS_DATA_SUCCESS';\r\nexport const MARKERS_DATA_ERROR = 'MARKERS_DATA_ERROR';\r\nexport const GET_SEARCH_FILTER_DATA = 'GET_SEARCH_FILTER_DATA';\r\nexport const SEARCH_FILTER_DATA_SUCCESS = 'SEARCH_FILTER_DATA_SUCCESS';\r\nexport const SEARCH_FILTER_DATA_ERROR = 'SEARCH_FILTER_DATA_ERROR';\r\nexport const UNMOUNT_DISCOVER = 'UNMOUNT_DISCOVER';\r\nexport const SET_DISCOVER_PREVIEW = 'SET_DISCOVER_PREVIEW'; \r\n","import React, { useReducer, useEffect } from 'react';\r\nimport Cookies from 'universal-cookie';\r\nimport axios from 'axios';\r\n\r\nimport { webEndPoint, communityEndPoint, guestToken } from '../../components/hooks/envVariables';\r\nimport UserContext from './userContext';\r\nimport UserReducer from './userReducer';\r\nimport {\r\n TOGGLE_LOGIN_MODAL,\r\n TOGGLE_REGISTER_MODAL,\r\n TOGGLE_ATTEST,\r\n TOGGLE_REG_SUCCESS_MSG,\r\n SET_FETCHING,\r\n LOGIN_SUCCESS,\r\n LOGIN_ERROR,\r\n LOGOUT,\r\n USER_SUCCESS,\r\n USER_ERROR,\r\n GUEST_USER_SUCCESS,\r\n GUEST_USER_ERROR,\r\n NAV_REDIRECT,\r\n RESET_PWD_SUCCESS,\r\n RESET_PWD_ERROR,\r\n RESET_FORGOT_PWD_MSG,\r\n REGISTER_SUCCESS,\r\n REGISTER_ERROR,\r\n FORUM_DATA_SUCCESS,\r\n FORUM_DATA_ERROR,\r\n UPDATE_USER_SUCCESS,\r\n UPDATE_EMAIL_ERROR, \r\n UPDATE_STATUS_ERROR,\r\n UPDATE_TAG_ERROR,\r\n UPDATE_CHKBOX_ERROR,\r\n UPDATE_PASSWORD_ERROR,\r\n SET_STATUS_FETCHING,\r\n SET_TAG_FETCHING,\r\n SET_TAG_REMOVE_FETCHING,\r\n SET_PASSWORD_FETCHING,\r\n TOGGLE_MOBILE_NAV,\r\n SET_COMMUNITY_QUERY,\r\n GET_STUDENTS_DATA,\r\n STUDENTS_DATA_SUCCESS,\r\n STUDENTS_DATA_ERROR,\r\n GET_EDUCATORS_DATA,\r\n EDUCATORS_DATA_SUCCESS,\r\n EDUCATORS_DATA_ERROR,\r\n GET_MARKERS_DATA,\r\n CLEAR_MARKERS_DATA,\r\n MARKERS_DATA_SUCCESS,\r\n MARKERS_DATA_ERROR,\r\n SEARCH_FILTER_DATA_SUCCESS,\r\n SEARCH_FILTER_DATA_ERROR,\r\n UNMOUNT_DISCOVER,\r\n SET_DISCOVER_PREVIEW\r\n} from '../types';\r\n\r\n\r\nconst UserState = props => {\r\n\r\n // Define initial app state.\r\n const initialState = {\r\n mobNavState : false,\r\n showLogin : false,\r\n showRegister : false,\r\n showRegSuccessMsg : false,\r\n toggleAttest : false,\r\n token : null,\r\n isAuthenticated : null,\r\n isFetching : false,\r\n isLogout : false,\r\n user : null,\r\n error : null,\r\n doRedirect : false,\r\n redirectTo : null,\r\n forgotPwdMsg : null,\r\n forumTotalPosts : null,\r\n forumTotalStudents : null,\r\n forumOnlineStudents : null,\r\n errorEmail : null,\r\n errorStatus : null,\r\n errorTag : null,\r\n errorChkbox : null,\r\n errorPassword : null,\r\n isStatusFetching : false,\r\n isTagFetching : false,\r\n isTagRemoveFetching : false,\r\n isPasswordFetching : false,\r\n communityQuery : null,\r\n studentsData : null,\r\n educatorsData : null,\r\n errorStudents : null,\r\n errorEducators : null,\r\n markersData : null,\r\n errorMarkers : null,\r\n searchFilterData : null,\r\n unmountDiscover : false,\r\n discoverPreview : false\r\n }\r\n \r\n // Initialize reducer hook.\r\n const [state, dispatch] = useReducer(UserReducer, initialState);\r\n \r\n // Initialize cookies context.\r\n const cookies = new Cookies();\r\n\r\n \r\n\r\n \r\n /*\r\n * App methods.\r\n */\r\n \r\n // Set mobile nav state (hide/show).\r\n const toggleMobileNav = state => {\r\n \r\n dispatch({ \r\n type: TOGGLE_MOBILE_NAV, \r\n payload: state\r\n });\r\n \r\n }\r\n \r\n // Set Login modal state.\r\n const toggleLoginModal = state => {\r\n \r\n dispatch({ \r\n type: TOGGLE_LOGIN_MODAL, \r\n payload: state\r\n });\r\n \r\n }\r\n\r\n // Set Register modal state.\r\n const toggleRegisterModal = state => {\r\n \r\n dispatch({ \r\n type: TOGGLE_REGISTER_MODAL, \r\n payload: state\r\n });\r\n \r\n }\r\n \r\n // Toggle Attest modal.\r\n const toggleAttestModal = state => {\r\n \r\n dispatch({ \r\n type: TOGGLE_ATTEST, \r\n payload: state\r\n });\r\n \r\n }\r\n \r\n const toggleRegSuccessMsgModal = state => {\r\n \r\n dispatch({ \r\n type: TOGGLE_REG_SUCCESS_MSG, \r\n payload: state\r\n });\r\n \r\n }\r\n \r\n // Set fetching to show spinner on submit buttons.\r\n const setFetching = (fetchingType) => dispatch({ type: fetchingType });\r\n \r\n // Return the fetching type used on the settings page.\r\n const getFetchingType = type => {\r\n \r\n switch (type) {\r\n case 'email':\r\n return null;\r\n case 'status':\r\n return SET_STATUS_FETCHING;\r\n case 'tag':\r\n return SET_TAG_FETCHING;\r\n case 'tagRemove':\r\n return SET_TAG_REMOVE_FETCHING;\r\n case 'chkbox':\r\n return null;\r\n case 'password':\r\n return SET_PASSWORD_FETCHING;\r\n default:\r\n return null;\r\n }\r\n \r\n }\r\n \r\n // Return the error type used on the settings page.\r\n const getErrorType = type => {\r\n \r\n switch (type) {\r\n case 'email':\r\n return UPDATE_EMAIL_ERROR;\r\n case 'status':\r\n return UPDATE_STATUS_ERROR;\r\n case 'tag':\r\n return UPDATE_TAG_ERROR;\r\n case 'tagRemove':\r\n return UPDATE_TAG_ERROR;\r\n case 'chkbox':\r\n return UPDATE_CHKBOX_ERROR;\r\n case 'password':\r\n return UPDATE_PASSWORD_ERROR;\r\n default:\r\n return null;\r\n }\r\n \r\n }\r\n \r\n // Set query string to be appended to the community url.\r\n const setCommunityQuery = query => {\r\n \r\n dispatch({ \r\n type: SET_COMMUNITY_QUERY, \r\n payload: query\r\n });\r\n \r\n }\r\n \r\n // Clear markers data.\r\n const clearMarkersData = () => {\r\n \r\n dispatch({ type: CLEAR_MARKERS_DATA });\r\n \r\n }\r\n \r\n // Reference if Discover Page is unmounted, and \r\n // let marker fetch know, else an error is thrown.\r\n const nowUnmountDiscover = state => {\r\n \r\n dispatch({ \r\n type: UNMOUNT_DISCOVER,\r\n payload: state\r\n });\r\n \r\n }\r\n \r\n // Set state that DISCOVER is in PREVIEW mode.\r\n const setDiscoverPreview = state => {\r\n \r\n dispatch({ \r\n type: SET_DISCOVER_PREVIEW,\r\n payload: state\r\n });\r\n \r\n }\r\n\r\n \r\n \r\n \r\n /*\r\n * Component methods.\r\n */\r\n \r\n // API: Call the User.\r\n const callApiUser = async token => {\r\n \r\n try {\r\n \r\n const resObj = await axios.get(`${webEndPoint}/api/user?id=${token}`);\r\n \r\n // On success.\r\n if ( resObj.data.errorCode === 0 ) {\r\n \r\n dispatch({\r\n type: USER_SUCCESS,\r\n payload: resObj.data.payload\r\n });\r\n \r\n }\r\n \r\n // On Error.\r\n // Error msg is in 'data.code'\r\n else {\r\n \r\n dispatch({\r\n type: USER_ERROR,\r\n payload: resObj.data.errorDescription\r\n });\r\n \r\n }\r\n \r\n }\r\n catch (error) {\r\n \r\n console.log('error', error);\r\n dispatch({\r\n type: USER_ERROR,\r\n payload: 'Network error' // error.statusText ???\r\n });\r\n \r\n }\r\n \r\n }\r\n \r\n // API: Call the Guest User.\r\n const callApiGuestUser = async token => {\r\n \r\n try {\r\n \r\n const resObj = await axios.get(`${webEndPoint}/api/user?id=${token}`);\r\n \r\n // On success.\r\n if ( resObj.data.errorCode === 0 ) {\r\n \r\n dispatch({\r\n type: GUEST_USER_SUCCESS,\r\n payload: resObj.data.payload\r\n });\r\n \r\n }\r\n \r\n // On Error.\r\n // Error msg is in 'data.code'\r\n else {\r\n \r\n dispatch({\r\n type: GUEST_USER_ERROR,\r\n payload: resObj.data.errorDescription\r\n });\r\n \r\n }\r\n \r\n }\r\n catch (error) {\r\n \r\n console.log('error', error);\r\n dispatch({\r\n type: GUEST_USER_ERROR,\r\n payload: 'Network error' // error.statusText ???\r\n });\r\n \r\n }\r\n \r\n }\r\n \r\n // API: Login user.\r\n const login = async reqObj => {\r\n \r\n setFetching(SET_FETCHING);\r\n \r\n const config = {\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n }\r\n };\r\n\r\n try {\r\n \r\n const resObj = await axios.post(`${webEndPoint}/api/userlogin`, reqObj, config);\r\n \r\n // On success.\r\n if ( resObj.data.errorCode === 0 ) {\r\n\r\n // const dnm = window.location.hostname;\r\n // const tld = dnm === 'localhost' ? 'localhost' : dnm.match(/[^.\\s/]+\\.([a-z]{3,}|[a-z]{2}.[a-z]{2})$/)[0];\r\n // const dte = new Date();\r\n // const exp = dte.setFullYear(dte.getFullYear + 1);\r\n // const max = 30 * 24 * 60 * 60;\r\n \r\n //if ( reqObj.rememberMe ) cookies.set('learningcommunity', resObj.data.code, { path: '/', domain: tld, expires: exp, maxAge: max });\r\n \r\n dispatch({\r\n type: LOGIN_SUCCESS,\r\n payload: resObj.data\r\n });\r\n \r\n callApiUser(resObj.data.code);\r\n \r\n }\r\n \r\n // On Error.\r\n // Error msg is in data.code\r\n else {\r\n \r\n dispatch({\r\n type: LOGIN_ERROR,\r\n payload: resObj.data.code\r\n });\r\n \r\n }\r\n \r\n }\r\n catch (error) {\r\n \r\n console.log('error', error);\r\n dispatch({\r\n type: LOGIN_ERROR,\r\n payload: 'Network error' // error.statusText ???\r\n });\r\n \r\n }\r\n \r\n }\r\n \r\n // Logout user.\r\n const logout = () => {\r\n \r\n //cookies.remove('learningcommunity', { path: '/' });\r\n\r\n dispatch({ type: LOGOUT });\r\n \r\n }\r\n \r\n // On app load if we have a cookie token then we can\r\n // send LOGIN_SUCCESS & test that token by calling 'api/user'.\r\n const authenticate = token => {\r\n \r\n dispatch({\r\n type: LOGIN_SUCCESS,\r\n payload: token\r\n });\r\n \r\n callApiUser(token);\r\n \r\n }\r\n \r\n // After a protected navlink login the user should be redirected\r\n // to their original page.\r\n const navRedirect = state => {\r\n \r\n dispatch({\r\n type: NAV_REDIRECT,\r\n payload: state\r\n });\r\n \r\n }\r\n \r\n // API: Request a new password.\r\n const resetPassword = async reqObj => {\r\n \r\n setFetching(SET_FETCHING);\r\n \r\n const config = {\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n }\r\n };\r\n\r\n try {\r\n \r\n const resObj = await axios.post(`${webEndPoint}/api/resetpassword`, reqObj, config);\r\n \r\n console.log('resObj.data.code', resObj.data.code);\r\n \r\n // On success.\r\n if ( resObj.data.errorCode === 0 ) {\r\n \r\n dispatch({\r\n type: RESET_PWD_SUCCESS,\r\n payload: resObj.data\r\n });\r\n \r\n }\r\n \r\n // On Error.\r\n // Error msg is in data.code\r\n else {\r\n \r\n dispatch({\r\n type: RESET_PWD_ERROR,\r\n payload: resObj.data.code\r\n });\r\n \r\n }\r\n \r\n }\r\n catch (error) {\r\n \r\n console.log('error', error);\r\n dispatch({\r\n type: RESET_PWD_ERROR,\r\n payload: 'Network error' // error.statusText ???\r\n });\r\n \r\n }\r\n \r\n }\r\n \r\n const resetForgotPwdMsg = () => dispatch({ type: RESET_FORGOT_PWD_MSG });\r\n \r\n // API: Register a new user.\r\n const register = async reqObj => {\r\n \r\n setFetching(SET_FETCHING);\r\n \r\n const config = {\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n }\r\n }; \r\n\r\n try {\r\n \r\n const resObj = await axios.post(`${webEndPoint}/api/user`, reqObj, config);\r\n \r\n // On success.\r\n if ( resObj.data.errorCode === 0 ) {\r\n \r\n dispatch({\r\n type: REGISTER_SUCCESS,\r\n payload: resObj.data.payload\r\n });\r\n \r\n }\r\n \r\n // On Error.\r\n // Error msg is in data.code\r\n else {\r\n \r\n dispatch({\r\n type: REGISTER_ERROR,\r\n payload: resObj.data.errorDescription\r\n });\r\n \r\n }\r\n \r\n }\r\n catch (error) {\r\n \r\n console.log('error', error);\r\n dispatch({\r\n type: REGISTER_ERROR,\r\n payload: 'Network error' // error.statusText ???\r\n });\r\n \r\n }\r\n \r\n }\r\n \r\n // API: Get Forum data.\r\n const fetchForumData = async () => {\r\n \r\n try {\r\n \r\n const resObj = await axios.get(`${communityEndPoint}/api/Metrics.php`);\r\n\r\n // On success.\r\n if ( resObj.status === 200 ) {\r\n \r\n const posts = resObj.data.postCounts.filter(item => item.type === 'Q' )[0];\r\n \r\n dispatch({\r\n type: FORUM_DATA_SUCCESS,\r\n payload: {\r\n totalPosts : posts.count.toLocaleString(),\r\n totalStudents : resObj.data.usersCount.toLocaleString(),\r\n onlineStudents : resObj.data.sessions.toLocaleString()\r\n }\r\n });\r\n \r\n }\r\n \r\n // On Error.\r\n // Error msg is in 'data.code'\r\n else {\r\n \r\n dispatch({\r\n type: FORUM_DATA_ERROR\r\n });\r\n \r\n }\r\n \r\n }\r\n catch (error) {\r\n \r\n console.log('error', error);\r\n dispatch({\r\n type: FORUM_DATA_ERROR\r\n });\r\n \r\n }\r\n \r\n }\r\n \r\n // API: Put updated user data on the server.\r\n const updateUserData = async (reqObj, updateType) => {\r\n \r\n const fetchingType = getFetchingType(updateType);\r\n const errorType = getErrorType(updateType);\r\n \r\n if ( fetchingType !== null ) setFetching(fetchingType);\r\n \r\n const config = {\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n }\r\n };\r\n \r\n // Grab logged in user cookie token.\r\n let token = cookies.get('learningcommunity');\r\n token = encodeURIComponent(token);\r\n\r\n try {\r\n \r\n const resObj = await axios.put(`${webEndPoint}/api/user?id=${token}`, reqObj, config);\r\n \r\n // On success.\r\n if ( resObj.data.errorCode === 0 ) {\r\n \r\n dispatch({\r\n type: UPDATE_USER_SUCCESS,\r\n payload: resObj.data.payload\r\n });\r\n \r\n }\r\n \r\n // On Error.\r\n // Error msg is in data.code\r\n else {\r\n \r\n dispatch({\r\n type: errorType,\r\n payload: resObj.data.errorDescription\r\n });\r\n \r\n }\r\n \r\n }\r\n catch (error) {\r\n \r\n console.log('error', error);\r\n dispatch({\r\n type: errorType,\r\n payload: 'Network error' // error.statusText ???\r\n });\r\n \r\n }\r\n \r\n }\r\n \r\n // API: Fetch STUDENTS or EDUCATORS data from server.\r\n const getDiscoverData = async queryObj => {\r\n \r\n let token = '';\r\n \r\n // Grab logged in user cookie token.\r\n if ( !state.discoverPreview ) {\r\n \r\n token = cookies.get('learningcommunity');\r\n token = encodeURIComponent(token);\r\n \r\n }\r\n // Else use guest token.\r\n else token = guestToken; \r\n \r\n // Deconstruct query string parameters.\r\n const params = {\r\n Id: token,\r\n ...queryObj\r\n }\r\n \r\n // Reset data error props.\r\n dispatch({\r\n type: params.searchType === 1 ? GET_STUDENTS_DATA : GET_EDUCATORS_DATA\r\n });\r\n \r\n // Fetch data.\r\n try {\r\n \r\n const resObj = await axios.get(`${webEndPoint}/api/learning`, { params });\r\n \r\n // If Discover Component has been unmounted return null\r\n // else we will get an error thrown.\r\n // if ( state.unmountDiscover ) {\r\n \r\n // nowUnmountDiscover(false);\r\n // return null;\r\n \r\n // }\r\n\r\n // On success.\r\n if ( resObj.data.errorCode === 0 ) {\r\n\r\n dispatch({\r\n type: params.searchType === 1 ? STUDENTS_DATA_SUCCESS : EDUCATORS_DATA_SUCCESS,\r\n payload: resObj.data.payload.list\r\n });\r\n \r\n }\r\n \r\n // On Error.\r\n // Error msg is in 'data.errorDescription'\r\n else {\r\n \r\n dispatch({\r\n type: params.searchType === 1 ? STUDENTS_DATA_ERROR : EDUCATORS_DATA_ERROR,\r\n payload: resObj.data.errorDescription\r\n });\r\n \r\n }\r\n \r\n }\r\n catch (error) {\r\n \r\n console.log('error', error);\r\n dispatch({\r\n type: params.searchType === 1 ? STUDENTS_DATA_ERROR : EDUCATORS_DATA_ERROR,\r\n payload: 'Network error' // error.statusText ???\r\n });\r\n \r\n }\r\n \r\n }\r\n \r\n // API: Fetch MARKERS data from the server.\r\n const getMarkersData = async queryObj => {\r\n \r\n let token = '';\r\n \r\n // Grab logged in user cookie token.\r\n if ( !state.discoverPreview ) {\r\n \r\n token = cookies.get('learningcommunity');\r\n token = encodeURIComponent(token);\r\n \r\n }\r\n // Else use guest token.\r\n else token = guestToken; \r\n \r\n // Deconstruct query string parameters.\r\n const params = {\r\n Id: token,\r\n ...queryObj\r\n }\r\n \r\n // Reset data error props.\r\n dispatch({\r\n type: GET_MARKERS_DATA\r\n });\r\n \r\n // Fetch data.\r\n try {\r\n \r\n const resObj = await axios.get(`${webEndPoint}/api/learning`, { params });\r\n \r\n // If Discover Component has been unmounted return null\r\n // else we will get an error thrown.\r\n // if ( state.unmountDiscover ) {\r\n \r\n // nowUnmountDiscover(false);\r\n // return null;\r\n \r\n // }\r\n \r\n // On success.\r\n if ( resObj.data.errorCode === 0 ) {\r\n \r\n dispatch({\r\n type: MARKERS_DATA_SUCCESS,\r\n payload: resObj.data.payload.list\r\n });\r\n \r\n }\r\n \r\n // On Error.\r\n // Error msg is in 'data.errorDescription'\r\n else {\r\n \r\n dispatch({\r\n type: MARKERS_DATA_ERROR,\r\n payload: resObj.data.errorDescription\r\n });\r\n \r\n }\r\n \r\n }\r\n catch (error) {\r\n \r\n console.log('error', error);\r\n dispatch({\r\n type: MARKERS_DATA_ERROR,\r\n payload: 'Network error' // error.statusText ???\r\n });\r\n \r\n }\r\n \r\n }\r\n \r\n // API: Fetch Search type data, which is students & list of educators.\r\n const getSearchFilterData = async () => {\r\n \r\n let token = '';\r\n \r\n // Grab logged in user cookie token.\r\n if ( !state.discoverPreview ) {\r\n \r\n token = cookies.get('learningcommunity');\r\n token = encodeURIComponent(token);\r\n \r\n }\r\n // Else use guest token.\r\n else token = guestToken; \r\n \r\n try {\r\n \r\n const resObj = await axios.get(`${webEndPoint}/api/searchfilter?fromId=${token}`);\r\n \r\n // If Discover Component has been unmounted return null\r\n // else we will get an error thrown.\r\n // if ( state.unmountDiscover ) {\r\n \r\n // nowUnmountDiscover(false);\r\n // return null;\r\n \r\n // }\r\n \r\n // On success.\r\n if ( resObj.data.errorCode === 0 ) {\r\n \r\n dispatch({\r\n type: SEARCH_FILTER_DATA_SUCCESS,\r\n payload: resObj.data.payload.types\r\n });\r\n \r\n }\r\n \r\n // On Error.\r\n // Error msg is in 'data.errorDescription'\r\n else {\r\n \r\n dispatch({\r\n type: SEARCH_FILTER_DATA_ERROR,\r\n payload: resObj.data.errorDescription\r\n });\r\n \r\n }\r\n \r\n }\r\n catch (error) {\r\n \r\n console.log('error', error);\r\n dispatch({\r\n type: SEARCH_FILTER_DATA_ERROR,\r\n payload: 'Network error' // error.statusText ???\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 * Component hooks.\r\n */\r\n \r\n useEffect(() => {\r\n \r\n // Check to see if we have a token cookie.\r\n const token = cookies.get('learningcommunity');\r\n const hasValidCookie = typeof token !== 'undefined' && token !== guestToken ? true : false;\r\n \r\n // If we have a token cookie then validate it\r\n // by calling 'api/user' & fetching user data.\r\n if ( hasValidCookie ) {\r\n \r\n authenticate(encodeURIComponent(token));\r\n \r\n }\r\n else {\r\n \r\n dispatch({\r\n type: LOGIN_ERROR,\r\n payload: 'User not logged in'\r\n });\r\n \r\n }\r\n \r\n // The eslint comment below removes missing dependency warning from console.\r\n // eslint-disable-next-line\r\n }, []);\r\n \r\n \r\n \r\n /*\r\n * Return context state & methods.\r\n */\r\n \r\n return \r\n {props.children}\r\n \r\n \r\n}\r\n\r\nexport default UserState;","import React from 'react';\r\nimport { BrowserRouter as Router, Switch, Route } from 'react-router-dom';\r\n\r\nimport ProtectedRoute from './components/hooks/ProtectedRoute';\r\nimport Navbar from './components/layout/Navbar';\r\nimport Home from './components/pages/Home';\r\nimport Community from './components/pages/Community';\r\nimport Forum from './components/pages/Forum';\r\nimport Discover from './components/pages/Discover';\r\nimport Settings from './components/pages/Settings';\r\nimport Help from './components/pages/Help';\r\nimport Modals from './components/layout/Modals';\r\n\r\nimport UserState from './context/user/UserState';\r\n\r\nimport './App.css';\r\n\r\n\r\nfunction App() {\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 \r\n}\r\n\r\nexport default App;\r\n","// This optional code is used to register a service worker.\r\n// register() is not called by default.\r\n\r\n// This lets the app load faster on subsequent visits in production, and gives\r\n// it offline capabilities. However, it also means that developers (and users)\r\n// will only see deployed updates on subsequent visits to a page, after all the\r\n// existing tabs open on the page have been closed, since previously cached\r\n// resources are updated in the background.\r\n\r\n// To learn more about the benefits of this model and instructions on how to\r\n// opt-in, read https://bit.ly/CRA-PWA\r\n\r\nconst isLocalhost = Boolean(\r\n window.location.hostname === 'localhost' ||\r\n // [::1] is the IPv6 localhost address.\r\n window.location.hostname === '[::1]' ||\r\n // 127.0.0.0/8 are considered localhost for IPv4.\r\n window.location.hostname.match(\r\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\r\n )\r\n);\r\n\r\nexport function register(config) {\r\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\r\n // The URL constructor is available in all browsers that support SW.\r\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\r\n if (publicUrl.origin !== window.location.origin) {\r\n // Our service worker won't work if PUBLIC_URL is on a different origin\r\n // from what our page is served on. This might happen if a CDN is used to\r\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\r\n return;\r\n }\r\n\r\n window.addEventListener('load', () => {\r\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\r\n\r\n if (isLocalhost) {\r\n // This is running on localhost. Let's check if a service worker still exists or not.\r\n checkValidServiceWorker(swUrl, config);\r\n\r\n // Add some additional logging to localhost, pointing developers to the\r\n // service worker/PWA documentation.\r\n navigator.serviceWorker.ready.then(() => {\r\n console.log(\r\n 'This web app is being served cache-first by a service ' +\r\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\r\n );\r\n });\r\n } else {\r\n // Is not localhost. Just register service worker\r\n registerValidSW(swUrl, config);\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction registerValidSW(swUrl, config) {\r\n navigator.serviceWorker\r\n .register(swUrl)\r\n .then(registration => {\r\n registration.onupdatefound = () => {\r\n const installingWorker = registration.installing;\r\n if (installingWorker == null) {\r\n return;\r\n }\r\n installingWorker.onstatechange = () => {\r\n if (installingWorker.state === 'installed') {\r\n if (navigator.serviceWorker.controller) {\r\n // At this point, the updated precached content has been fetched,\r\n // but the previous service worker will still serve the older\r\n // content until all client tabs are closed.\r\n console.log(\r\n 'New content is available and will be used when all ' +\r\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\r\n );\r\n\r\n // Execute callback\r\n if (config && config.onUpdate) {\r\n config.onUpdate(registration);\r\n }\r\n } else {\r\n // At this point, everything has been precached.\r\n // It's the perfect time to display a\r\n // \"Content is cached for offline use.\" message.\r\n console.log('Content is cached for offline use.');\r\n\r\n // Execute callback\r\n if (config && config.onSuccess) {\r\n config.onSuccess(registration);\r\n }\r\n }\r\n }\r\n };\r\n };\r\n })\r\n .catch(error => {\r\n console.error('Error during service worker registration:', error);\r\n });\r\n}\r\n\r\nfunction checkValidServiceWorker(swUrl, config) {\r\n // Check if the service worker can be found. If it can't reload the page.\r\n fetch(swUrl, {\r\n headers: { 'Service-Worker': 'script' },\r\n })\r\n .then(response => {\r\n // Ensure service worker exists, and that we really are getting a JS file.\r\n const contentType = response.headers.get('content-type');\r\n if (\r\n response.status === 404 ||\r\n (contentType != null && contentType.indexOf('javascript') === -1)\r\n ) {\r\n // No service worker found. Probably a different app. Reload the page.\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister().then(() => {\r\n window.location.reload();\r\n });\r\n });\r\n } else {\r\n // Service worker found. Proceed as normal.\r\n registerValidSW(swUrl, config);\r\n }\r\n })\r\n .catch(() => {\r\n console.log(\r\n 'No internet connection found. App is running in offline mode.'\r\n );\r\n });\r\n}\r\n\r\nexport function unregister() {\r\n if ('serviceWorker' in navigator) {\r\n navigator.serviceWorker.ready\r\n .then(registration => {\r\n registration.unregister();\r\n })\r\n .catch(error => {\r\n console.error(error.message);\r\n });\r\n }\r\n}\r\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\n\r\nimport App from './App';\r\nimport * as serviceWorker from './serviceWorker';\r\n\r\n\r\nReactDOM.render(\r\n ,\r\n document.getElementById('root')\r\n);\r\n\r\n// If you want your app to work offline and load faster, you can change\r\n// unregister() to register() below. Note this comes with some pitfalls.\r\n// Learn more about service workers: https://bit.ly/CRA-PWA\r\nserviceWorker.unregister();\r\n"],"sourceRoot":""}