{"version":3,"sources":["utilities/withChangeAnimation.tsx","components/Notifications/index.tsx","generated/globalTypes.ts","components/AccountSettings/Editable.tsx","components/AccountSettings/ChangeAvatarURL.tsx","components/AccountSettings/PasswordChangeForm.tsx","components/AccountSettings/index.tsx","graphql/addMultipleToGame.tsx","graphql/getGroups.tsx","graphql/removeMultipleFromGame.tsx","components/GenerateInviteLinkModal.tsx","components/ScrollbarWrapper.tsx","components/TableComponent/CheckboxForTable.tsx","components/TableComponent/index.tsx","components/TableComponent/ColumnFilter.tsx","components/AddPlayersToGame.tsx","context/FocusActivityContext.tsx","utilities/Storage.ts","graphql/challengeStatusUpdatedSub.tsx","utilities/ErrorMessages.ts","graphql/findChallenge.tsx","graphql/getActivityById.tsx","graphql/rewardReceivedStudentSub.tsx","components/BreadcrumbComponent.tsx","components/Error.tsx","graphql/getLatestSubmissionAndValidation.tsx","graphql/getSubmissionById.tsx","graphql/getValidationById.tsx","utilities/Encryption.ts","graphql/getChallengesByGame.tsx","graphql/getGamePlayers.tsx","graphql/getPlayerFullSubmissions.tsx","graphql/getPlayerFullValidations.tsx","graphql/getPlayerRewards.tsx","components/ExportGameCsvModal.tsx","components/Exercise/helpers/defaultProgrammingLanguage.ts","components/Exercise/helpers/EditorMenu.ts","components/Exercise/helpers/isFullMenuAvailable.ts","context/ZoomContext.tsx","components/Exercise/SettingsContext.tsx","components/Exercise/Settings.tsx","components/Exercise/TextareaModal.tsx","components/Exercise/EditorMenu.tsx","components/Exercise/useHotKeys.tsx","components/CodeEditor.tsx","components/Exercise/editors/FillInGapsEditor.tsx","components/Exercise/editors/SortBlocksEditor.tsx","components/Exercise/editors/SpotTheBugEditor.tsx","components/Exercise/helpers/EditorSwitcher.tsx","components/Exercise/helpers/python.ts","graphql/getPlayerHints.tsx","components/Exercise/HintsModal.tsx","components/Exercise/Hints.tsx","components/Exercise/SanitizeHTML.tsx","components/Exercise/Statement.tsx","components/Exercise/Terminal.tsx","components/Exercise/index.tsx","components/MainLoading.tsx","components/Challenge.tsx","images/erasmus.png","images/logo.svg","components/HomePage.tsx","graphql/autoAssignGroups.tsx","graphql/gameDetailsGetGameById.tsx","graphql/getOverallStats.tsx","graphql/removeMultipleFromGroup.tsx","components/DetailsCard.tsx","components/RefreshCacheMenu.tsx","graphql/getActivityStatsAndChallengeNames.tsx","components/InstructorGame/ActivitiesStats.tsx","components/StartAndEndDateInput.tsx","graphql/changeGameEndDate.tsx","graphql/changeGameStartDate.tsx","graphql/setGameAvailability.tsx","graphql/setGameArchival.tsx","components/InstructorGame/ChangeDetailsModal.tsx","graphql/getStudentsDetails.tsx","components/InstructorGame/AddGroupModal.tsx","graphql/setGroupForMultiple.tsx","components/InstructorGame/SetGroupModal.tsx","components/InstructorGame/Students.tsx","components/InstructorGame/index.tsx","graphql/joinGameWithEnrollToken.tsx","graphql/joinGroupWithToken.tsx","components/JoinGameByToken.tsx","utilities/useQueryParams.tsx","components/LtiCallback.tsx","graphql/unassignInstructor.tsx","components/AddGameModal.tsx","components/ManageGames.tsx","context/NavContext.tsx","components/ChangeLanguageModal.tsx","components/Navbar.tsx","components/NotFound.tsx","graphql/getPlayer.tsx","graphql/removeSingleFromGame.tsx","components/PlayerDetails/AttemptModal.tsx","components/PlayerDetails/PlayerRewards.tsx","components/PlayerDetails/ProgressModal.tsx","components/PlayerDetails/SetGroupForSingleModal.tsx","graphql/getPlayerSubmissions.tsx","components/PlayerDetails/Utils/sortByDate.ts","components/PlayerDetails/PlayerAttemptsTable.tsx","components/Profile.tsx","components/PlayerDetails/SubmissionsTable.tsx","graphql/getPlayerValidations.tsx","components/PlayerDetails/ValidationsTable.tsx","components/PlayerDetails/index.tsx","graphql/getTeacherGamesQuery.tsx","components/InstructorGames.tsx","components/GamesList.tsx","graphql/enroll.tsx","components/PublicGames.tsx","components/Rewards.tsx","components/StudentProfile.tsx","graphql/getTeacherStudentsDetails.tsx","components/TeacherStudents.tsx","components/TeacherProfile.tsx","components/TableComponent/TableNoSorting.tsx","components/RankingTable.tsx","components/ProfileInGame.tsx","components/ToS.tsx","graphql/getAllGameProfiles.tsx","graphql/getUserDetails.tsx","components/UserDetails.tsx","utilities/PrivateRoute.tsx","App.tsx","i18n/config.ts","keycloak.ts","styles/theme/themes.ts","utilities/ClearLocalStorage.ts","service-worker-registration.ts","index.tsx"],"names":["withChangeAnimation","Component","props","motion","div","initial","opacity","y","animate","exit","transition","duration","Ctx","React","createContext","add","value","remove","id","ToastContainer","position","top","left","transform","zIndex","Toast","content","onDismiss","rewardRef","useRef","useEffect","showFireworks","current","rewardMe","ref","type","config","angle","decay","spread","startVelocity","elementCount","elementSize","lifetime","springAnimation","NotificationContent","status","variant","flexDirection","alignItems","justifyContent","textAlign","width","maxWidth","minWidth","marginTop","padding","rewardImage","RewardImage","src","mt","mb","fontSize","title","description","right","onClick","styled","img","toastCount","NotificationsProvider","children","useState","toasts","setToasts","newToasts","filter","t","Provider","toast","map","rest","EvaluationEngine","GameStateEnum","Mode","Result","RewardType","State","useNotifications","useContext","Editable","defaultValue","label","onChange","cleanOnEdit","isEditing","setIsEditing","setValue","loading","setLoading","e","target","disabled","isLoading","marginLeft","icon","ChangeAvatarURL","changeAvatar","avatarURL","colorMode","useColorMode","useTranslation","marginBottom","fontWeight","border","borderColor","borderRadius","PasswordInput","isInvalid","show","setShow","PasswordChangeForm","onSubmit","currentPassword","setCurrentPassword","newPassword","setNewPassword","confirmationPassword","setConfirmationPassword","submitPasswordChange","confirmation","err","console","log","paddingTop","spacing","length","isDisabled","addNotification","keycloak","useKeycloak","userProfile","setUserProfile","loadUserProfile","keycloakUserProfile","axios","defaults","headers","post","token","email","changePassword","process","realm","editUserDetails","firstName","lastName","changeAvatarURL","params","attributes","margin","as","size","ADD_MULTIPLE_TO_GAME","gql","GET_GROUPS","REMOVE_MULTIPLE_FROM_GAME","GENERATE_GROUP_TOKEN","GENERATE_GAME_TOKEN","GenerateInviteLinkModal","isOpen","onClose","groupsData","gameId","groupId","setGroupId","link","setLink","useMutation","generateGameToken","generateGroupToken","generateTokens","gameToken","groupToken","variables","generatedGameToken","data","generatedGroupToken","generatedLink","window","location","origin","placeholder","groups","group","i","displayName","name","AnimatePresence","maxHeight","readOnly","navigator","clipboard","writeText","mr","colorScheme","ScrollbarStyled","span","thin","ScrollbarWrapper","CheckboxForTable","forwardRef","indeterminate","defaultRef","resolvedRef","isChecked","checked","PaginationStyled","AnimatedSortIcon","isVisible","TableComponent","columnsProp","columns","dontRecomputeChange","onRowClick","selectableRows","setIsAnythingSelected","setSelectedStudents","contextMenu","tableHeader","refreshData","isCsvLoading","setCsvLoading","isCsvReady","setCsvReady","i18n","useMemo","language","tableInstance","useTable","useFilters","useSortBy","usePagination","useRowState","useRowSelect","hooks","visibleColumns","push","Header","getToggleAllRowsSelectedProps","disableSortBy","Cell","row","getToggleRowSelectedProps","getTableProps","getTableBodyProps","headerGroups","prepareRow","selectedFlatRows","page","state","gotoPage","pageSize","flatRows","pageIndex","original","overflowX","float","keys","allColumns","column","prepared","filteredRows","row1","cells","cell","renderedCell","toString","replace","unshift","key","indexOf","prepareForCsv","alert","style","isIndeterminate","color","pointerEvents","userSelect","headerGroup","getHeaderGroupProps","getHeaderProps","getSortByToggleProps","isSorted","render","isSortedDesc","canFilter","getRowProps","cursor","_hover","bg","getCellProps","substring","activePage","itemsCountPerPage","totalItemsCount","pageRangeDisplayed","pageNumber","ColumnSelectFilter","options","filterValue","setFilter","height","optionObj","text","ColumnFilter","GAME_QUERY","USERS_BY_ROLE_QUERY","isUserSelected","setIsUserSelected","selectedUsersRef","useDisclosure","isGenerateInviteModalOpen","onGenerateInviteModalOpen","onOpen","onGenerateInviteModalClose","useParams","addUsersToGame","removeUsersFromGame","useQuery","fetchPolicy","dataGame","loadingGame","refetchGame","refetch","dataGroups","loadingGroups","role","dataUsers","loadingUsers","getSelectedUsersIds","user","getSelectedUsersAndRemoveFromGame","selectedUsersIds","usersIds","getSelectedUsersAndAddToGame","game","marginRight","to","pathname","Button","rightIcon","rows","accessor","players","find","gamePlayer","isEnrolled","Filter","usersByRole","FocusActivityContext","FocusActivityContextProvider","history","useHistory","focusActivity","sessionStorage","getItem","JSON","parse","restoreFocusMode","setFocusActivity","deactivate","challenge","challengeId","activity","activityId","Authorization","ltik","removeItem","localStorage","close","toPath","activate","setItem","stringify","saveFocusMode","SERVER_ERRORS","CHALLENGE_STATUS_UPDATED_STUDENT_SUB","FIND_CHALLENGE","GET_ACTIVITY_BY_ID","REWARD_RECEIVED_STUDENT_SUB","checkIfConnectionAborted","error","graphQLErrors","message","includes","ECONNABORTED","Wrapper","challengeView","BreadcrumbComponent","gameName","challengeName","isChallengeActive","separator","Link","overflow","whiteSpace","textOverflow","isCurrentPage","Error","errorContent","refreshTimeout","serverConnectionError","errorCopied","setErrorCopied","refresh","setTimeout","reload","clearTimeout","boxSize","flexDir","placement","graphQLError","extensions","code","path","join","exitBeforeEnter","overflowY","onFocus","select","GET_LATEST_SUBMISSION_AND_VALIDATION","GET_SUBMISSION_BY_ID","GET_VALIDATION_BY_ID","salt","encryptWithAES","userEmail","passphrase","CryptoJS","AES","encrypt","GET_CHALLENGES_BY_GAME","GET_GAME_PLAYERS","GET_PLAYER_FULL_SUBMISSIONS","GET_PLAYER_FULL_VALIDATIONS","GET_PLAYER_REWARDS","escapeQuote","v","objectKeys","Object","String","useLazyQuery","query","client","useApolloClient","useCallback","preparePlayersForCSV","player","convertedPlayer","userId","username","ExportGameCsvModal","validations","submissions","rewards","challenges","readyToDownload","setReadyToDownload","setPlayers","playersValidations","setPlayersValidations","playersSubmissions","setPlayersSubmissions","playersRewards","setPlayersRewards","gameChallenges","setGameChallenges","getGameChallenges","getUserGameRewards","getGamePlayers","getPlayerFullValidations","getPlayerFullSubmissions","getAllRewards","playersData","res","playersRewards1","rewardsCount","causedError","rewardsConverted","reward","rewardId","rewardDescription","rewardKind","kind","rewardName","getPlayers","getAttempts","downloadValidations","attemptsCount","playersAttempts","causedErrors","res1","convertedValidations","validation","converted","metrics","outputs","userExecutionTimes","convertedSubmissions","submission","getChallengesForGame","allExercises","forEach","refsConverted","refs","exerciseName","exerciseId","divider","align","h","DEFAULT_PROGRAMMING_LANGUAGE_COOKIE","getColorSchemeForSubmissionResult","submissionResult","ACCEPT","ASK_FOR_REEVALUATION","isFullMenuAvailable","editorKind","ZoomContext","zoomFactor","setZoomFactor","SettingsContext","editorTheme","setEditorTheme","terminalTheme","terminalFontSize","setTerminalFontSize","setTerminalTheme","isSkulptEnabled","setSkulptEnabled","Settings","toggleColorMode","display","w","htmlFor","newTheme","theme","Number","item","toFixed","newSize","TextareaWithButton","changeValue","TextareaModal","testValues","setTestValues","newTestValues","splice","EditorMenu","activeLanguage","evaluateSubmission","validateSubmission","isWaitingForEvaluationResult","isEvaluationFetching","setSideMenuOpen","setIsWaitingForEvaluationResult","setSubmissionFetching","setActiveLanguage","programmingLanguages","isWaitingForValidationResult","isValidationFetching","setIsWaitingForValidationResult","setValidationFetching","solved","setNextUnsolvedExercise","connectionError","restore","isRestoreAvailable","setStopExecution","isSettingsOpen","openSettings","closeSettings","isTextareaModalOpen","openTextareaModal","closeTextareaModal","base","md","minHeight","backgroundColor","p","lg","isActive","Cookies","set","expires","setDefaultProgrammingLanguage","isAttached","loadingText","undefined","hasArrow","openDelay","visibility","bgColor","borderTop","m","maxW","useHotKeys","document","addEventListener","metaKey","ctrlKey","EditorStyled","CodeEditor","setCode","editorRef","_actions","submitYourCode","runYourCode","addAction","x","monaco","useMonaco","keybindings","KeyMod","CtrlCmd","KeyCode","Enter","precondition","keybindingContext","contextMenuGroupId","contextMenuOrder","run","ed","US_BACKSLASH","onMount","editor","toLowerCase","event","wrapperClassName","className","fixedOverflowWidgets","wordWrap","minimap","enabled","FillInGapsEditor","skeleton","inputsValues","setInputsValues","gapsLength","split","line","wrapLines","wrapLongLines","customStyle","background","atomOneDark","docco","replaceAll","newValues","index","newCode","splitted","maxH","Block","isDark","SortBlocksEditor","codeSkeletons","codeSkeletonsOrdered","setCodeSkeletonsOrder","moveElement","up","codeSkeletonsNewOrder","arr","indexA","indexB","temp","swapArrayElements","linesWithRemovedAdditionalSymbols","layout","damping","stiffness","borderBottom","CodeLine","darkMode","SpotTheBugEditor","codeSkeleton","selectedLine","setSelectedLine","EditorSwitcher","builtinRead","Sk","builtinFiles","runPython","setOutput","setResult","stopExecution","onSuccess","onError","getInput","onFinish","moreThanOneExecution","pre","configure","output","__future__","python3","read","execLimit","killableWhile","killableFor","inputfun","inputfunTakesPrompt","myPromise","misceval","asyncToPromise","importMainWithBody","then","mod","RUNTIME_ERROR","GET_PLAYER_HINTS","SingleHint","HintsModal","playerHints","hint","Hints","hints","skip","playerHintsData","playerHintsError","playerHintsLoading","playerHintsRefetch","shouldDisplayHintsButton","bottom","defaultOptions","allowedTags","allowedAttributes","a","selfClosing","allowedSchemes","allowedIframeHostnames","sanitize","dirty","__html","sanitizeHtml","SanitizeHTML","html","dangerouslySetInnerHTML","DOCTYPE_HTML_STRING","GET_LANGUAGES_FROM_A_TAG_MENU_REGEX","RegExp","STATEMENT_LANGUAGES_SPLIT_REGEX","MarkdownStyled","Box","getStatement","tFunction","statement","renderAsHTML","getStatementHeight","pdf","statementLength","getStatementLength","ensureReadbility","Statement","statementOrNoDescriptionMessage","singleLanguageStatementRenderAsHTML","pdfWindow","open","write","encodeURI","defaultIndex","languageChanged","userDefaultStatementsLanguage","match","sort","b","localeCompare","lang","languageCode","slice","flatMap","statementLanguageVersion","unsortedListOfLanguages","allowDangerousHtml","TerminalStyled","Terminal","submissionFeedback","validationOutputs","objectKey","COMPILATION_ERROR","ReactHtmlParser","isEditorKindSpotBug","EVALUATE_SUBMISSION","VALIDATE_SUBMISSION","VALIDATION_SUBSCRIPTION","EVALUATION_SUBSCRIPTION","getEditorTheme","getTerminalTheme","getTerminalFontSize","Exercise","challengeRefetch","lastEvaluationOrSubmissionId","setLastEvaluationOrSubmissionId","availableProgrammingLanguages","userDefaultLanguageLocalStorage","get","userDefaultLanguage","some","getDefaultProgrammingLangOrFirstFromArray","lsSkulptSetting","isSkulptEnabledLocalStorage","setSubmissionFeedback","setSubmissionResult","setValidationOutputs","setWaitingForEvaluationResult","setWaitingForValidationResult","connectionProblem","setConnectionProblem","setEvaluationId","activityRef","activeLanguageRef","isEvaluationFetchingRef","isValidationFetchingRef","codeRef","setRestoreAvailable","additionalOutputs","getCodeSkeleton","dontSetCode","getArray","allCodeSkeletonsForActiveLang","extension","getLatestSubmissionAndValidation","useLazyQueryPromise","restoreSubmission","latestSubmission","restoreLatestAttemptExcludingSpecificParameters","program","result","feedback","saveSubmissionDataInLocalStorage","restoreValidation","latestValidation","restoreLatestSubmissionOrValidation","catch","submissionAndValidation","validationDate","dayjs","createdAt","submissionDate","diff","timeoutID","clearInterval","getLastStateFromLocalStorage","lastSubmissionFeedbackUnparsed","parsedLastSubmission","profile","encryptedCode","ciphertext","decrypt","enc","Utf8","decryptWithAES","isValidation","clearPlayground","getAndSetLatestStateFromLocalStorageOrClear","codeToSave","time","Date","onCompleted","getSubmissionById","subEvaluationError","useSubscription","onSubscriptionData","subscriptionData","submissionEvaluatedStudent","newSubscriptionId","evaluationData","sendLastGradeToLtiPlatform","subValidationError","newValidationId","validationProcessedStudent","validationData","submissionId","evaluate","evaluateSubmissionMutation","validate","validateSubmissionMutation","getFileFromCode","isSpotBugMode","blob","Blob","File","file","inputs","isLocal","isLoaded","l","errors","Promise","resolve","reject","testValueSplitted","inputFunN","nextInput","Flex","userDataLocalStorage","userData","userDataWithNewCode","saveCodeToLocalStorage","Fullscreen","MainLoading","MotionBox","custom","Playground","showExerciseNumbers","setShowExerciseNumbers","sideMenuOpen","challengeStatus","setChallengeStatus","activeExercise","setActiveExercise","shouldRedirect","setShouldRedirect","setHints","challengeStatusUpdated","challengeStatusUpdatedStudent","FAILED","endedAt","startedAt","openedAt","rewardReceivedStudent","HINT","image","BADGE","VIRTUAL_ITEM","activityData","activityLoading","exerciseFromURL","myChallengeStatus","exercise","challengeData","challengeError","challengeLoading","borderRight","mode","TIME_BOMB","_focus","_active","BiTimer","date","valueOf","isNaN","checkIfSolved","foundUnsolvedExercise","FGPELogo","ErasmusImage","ErasmusLogo","Erasmus","initialized","login","redirectUri","LogoSVG","AUTO_ASSIGN_GROUPS","GAME_DETAILS_GET_GAME_BY_ID","GET_OVERALL_STATS","REMOVE_MULTIPLE_FROM_GROUP","DetailsCard","badgeContent","active","noMargins","darkerBorder","direction","RefreshCacheMenu","internalLoading","setInternalLoading","refetched","setRefetched","refetchAndChangeState","leftIcon","GET_ACTIVITY_STATS_AND_CHALLENGE_NAMES","getActivitiesList","gameData","activities","getActivitiesStats","statsData","activitiesList","stats","activitiesStatsArray","activityWithStats","nrOfSubmissionsByActivity","nrOfSubmissionsByActivityAndResult","ActivitiesStats","isRefreshing","setIsRefreshing","refetchStats","statsError","statsLoading","minH","disableFilters","acceptedSubmissions","totalSubmissions","extend","customParseFormat","isDateValid","isValid","StartAndEndDateInput","startDate","startDateError","endDate","endDateError","isEndLaterThanStart","setEndLaterThanStart","setStartDate","setStartDateError","setEndDate","setEndDateError","paddingRight","isAfter","paddingLeft","in","animateOpacity","CHANGE_GAME_END_DATE","CHANGE_GAME_START_DATE","SET_GAME_AVAILABILITY","SET_GAME_ARCHIVAL","ChangeDetailsModal","isGamePrivate","isGameArchival","defaultStartDate","defaultEndDate","gamePrivate","setGamePrivate","gameArchival","setGameArchival","setGameAvailability","setGameArchivalMutate","changeGameStartDate","changeGameEndDate","changeGameDetails","isPrivate","isArchival","GET_STUDENTS_DETAILS_BY_GAME_ID","ADD_GROUP","AddGroupModal","setName","setDisplayName","addNewGroup","addGroupLoading","isRequired","groupName","groupDisplayName","SET_GROUP_FOR_MULTIPLE","SetGroupModal","selectedStudentsRef","setGroupForMultiple","selectedStudents","setGroupLoop","selectedStudentsIds","student","playersIds","amount","ContextMenu","autoAssignGroupsLoading","autoAssignGroups","isStudentSelected","onSetGroupModalOpen","getSelectedStudentsAndRemoveFromGroups","getSelectedStudentAndRemoveFromGame","onAddGroupModalOpen","studentsDetailsLoading","refetchStudentsDetails","Students","isAddGroupModalOpen","onAddGroupModalClose","isSetGroupModalOpen","onSetGroupModalClose","memoizedSortFunc","rowA","rowB","learningPath","progress","reduce","setIsStudentSelected","studentsDetailsData","studentsDetailsError","totalChallengesCount","sortType","isExportCsvModalOpen","onExportCsvModalOpen","onExportCsvModalClose","isDetailsModalOpen","onDetailsModalOpen","onDetailsModalClose","removeMultipleFromGame","removeMultipleFromGroup","overallStatsData","overallStatsError","overallStatsLoading","refetchOverallStats","gameError","gameLoading","selectedStudentsUserIds","selectedStudentsPlayerIds","private","archival","nrOfSubmissions","nrOfValidations","format","allowToggle","allowMultiple","isExpanded","flex","pb","JOIN_GAME_WITH_ENROLL_TOKEN","JOIN_GROUP_WITH_TOKEN","setGame","setGameId","joinGameWithToken","joinGameError","joinGroupWithToken","joinGroupError","joinGameOnly","runLoading","enrollWithToken","joinGameAndGroup","getQueryParams","URLSearchParams","search","Proxy","prop","receiver","useQueryParams","queryParams","setQueryParams","str","authenticate","getTime","manualLogin","accessToken","refreshToken","idToken","UNASSIGN_INSTRUCTOR","IMPORT_GAME","DragAndDropField","AddGameModal","refetchGames","useDropzone","accept","maxFiles","onDropRejected","acceptedFiles","getRootProps","getInputProps","isDragAccept","isDragReject","importNewGame","importGameLoading","setGameName","gameDescription","setGameDescription","evaluationEngine","setEvaluationEngine","setIsPrivate","GET_ALL_AVAILABLE_GAMES","ASSIGN_INSTRUCTOR","REMOVE_GAME","availableGamesData","assignInstructor","unassignInstructor","removeGame","memoizedRowChecking","instructors","instructor","isAddGameModalOpen","onAddGameModalOpen","onAddGameModalClose","setState","userInfo","loadUserInfo","sub","games","NavContext","activeGame","setActiveGame","ChangeLanguageModal","supportedLanguages","setSupportedLanguages","fetch","Accept","response","json","myJson","changeLanguage","Logo","NavbarStyled","Navbar","useBreadcrumbs","isOpenLanguageModal","onOpenLanguageModal","onCloseLanguageModal","deactivateFocusMode","px","authenticated","logout","GET_PLAYER","REMOVE_SINGLE_FROM_GAME","LocalizedFormat","getOutputs","activeAttempt","AttemptModal","detailedSubmissionOrValidationData","setDetailedSubmissionOrValidationData","submissionLoading","getValidationById","validationLoading","isSubmission","validationId","submittedAt","PlayerAttemptsTable","refetchPlayerData","playerData","playerError","playerLoading","ProgressModal","learningPaths","SetGroupForSingleModal","playerId","setGroup","removeFromGroup","GET_PLAYER_SUBMISSIONS","sortByDate","Roles","getNameForExerciseId","getChallengeName","ii","isValidationsTable","memoizedSortDateFunc","SubmissionsTable","onSubmissionRowClick","GET_PLAYER_VALIDATIONS","ValidationsTable","onValidationRowClick","isOpenProgress","onOpenProgress","onCloseProgress","isOpenAttempt","onOpenAttempt","onCloseAttempt","isOpenGroupSet","onOpenGroupSet","onCloseGroupSet","setActiveAttempt","removeFromGame","removeSingleLoading","playerRefetch","PlayerRewards","GET_TEACHER_GAMES","checkIsActive","isBefore","InstructorGames","memoizedArchivalSort","memoizedPrivateSort","refetchTeacherGames","teacherGamesData","teacherGamesError","teacherGamesLoading","myGames","Game","small","useColorModeValue","sm","isGameAvailable","GameStyled","GamesList","myGameProfiles","gameProfile","ENROLL","PublicGames","gamesData","gameProfiles","gameProfileIds","enroll","enrollInGame","getRewardsCount","getGridDimensions","sqrt","Math","floor","ceil","RewardsAlert","RewardModal","imageData","MdCheckCircle","parentChallenge","MdDateRange","RiGamepadFill","zoom","DynamicGrid","gridDimensions","RewardsWrapper","RewardStyle","Rewards","rewardForModal","setRewardForModal","rewardColor","setZoom","showRewardsAlert","setShowRewardsAlert","array","PLAYER_GAME_PROFILES","GET_TEACHER_STUDENTS_DETAILS","TeacherStudents","refetchTeacherStudents","teacherStudentsData","teacherStudentsError","teacherStudentsLoading","progressCombined","Profile","hasRealmRole","teacher","dataProp","GET_LEADERBOARDS","GET_GROUP_RANKINGS","Ranking","leaderboardId","loadingGroupRankings","errorGroupRankings","dataGroupRankings","groupRankings","metricsArray","score","sum","getMetrics","RankingTable","loadingLeaderboards","errorLeaderboards","dataLeaderboards","leaderboards","leaderboard","PROFILE_IN_GAME","getChallengeChildren","isChallengeWithoutChildren","getIconForLearningPathState","AVAILABLE","BiCircle","COMPLETED","BiCheck","BiXCircle","HIDDEN","LOCKED","HiLockClosed","OPENED","HiLockOpen","REJECTED","ChallengeBox","progressBarBg","textColor","ChildrenChallenge","ParentChallenge","available","loadingProfile","errorProfile","dataProfile","profileInGame","withoutChildren","childChallenge","tosHtml","setTosHtml","getDataForActiveLanguage","GET_ALL_GAME_PROFILES","GET_USER_DETAILS","memoizedSorting","userError","userLoading","gameProfilesData","gameProfilesError","gameProfilesLoading","refetchGameProfiles","allGameProfiles","emailVerified","PrivateRoute","component","roles","redirectTo","r","resource","hasResourceRole","isAuthorized","MainWrapper","ZoomWrapper","App","ready","getZoomFactorFromLocalStorage","keycloakInitialized","basename","exact","Homepage","ToS","LtiCallback","ProfileInGame","InstructorGame","Challenge","AddPlayersToGame","ManageGames","UserDetails","PlayerDetails","AccountSettings","JoinGameByToken","NotFound","use","Backend","LanguageDetector","initReactI18next","init","fallbackLng","debug","backend","loadPath","interpolation","escapeValue","Keycloak","url","clientId","breakpoints","xl","xxl","extendTheme","components","Container","baseStyle","Text","colors","borderLight","borderDark","lightTheme","darkTheme","useSystemColorMode","styles","global","ClearLocalStorage","startsWith","endsWith","date1","date2","abs","isLocalhost","Boolean","hostname","registerValidSW","swUrl","serviceWorker","register","registration","onupdatefound","installingWorker","installing","onstatechange","controller","onUpdate","wsLink","WebSocketLink","uri","reconnect","lazy","connectionParams","isTokenExpired","authorization","updateToken","refreshed","httpLink","createUploadLink","authLink","setContext","_","splitLink","definition","getMainDefinition","operation","concat","cache","InMemoryCache","persistCache","storage","LocalStorageWrapper","ApolloClient","onTokenExpired","tokens","ReactDOM","colorModeManager","localStorageManager","initialColorMode","authClient","initOptions","onLoad","checkLoginIframe","enableLogging","LoadingComponent","onTokens","ApolloProvider","fallback","getElementById","URL","href","contentType","unregister","checkValidServiceWorker","serviceWorkerRegistration"],"mappings":"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","file":"static/js/main.6cdaed80.chunk.js","sourcesContent":["import { motion } from \"framer-motion\";\n\nexport default function withChangeAnimation<T>(\n  Component: React.ComponentType<T>\n) {\n  return (props: any) => (\n    <motion.div\n      initial={{ opacity: 0, y: 10 }}\n      animate={{ opacity: 1, y: 0 }}\n      exit={{ opacity: 0, y: 10 }}\n      transition={{ duration: 0.2 }}\n    >\n      <Component {...props} />\n    </motion.div>\n  );\n}\n","// @flow\n\nimport {\n  Alert,\n  AlertDescription,\n  AlertTitle,\n  Box,\n  CloseButton,\n} from \"@chakra-ui/react\";\nimport styled from \"@emotion/styled\";\nimport { motion } from \"framer-motion\";\nimport React, { useEffect, useRef } from \"react\";\nimport Reward from \"react-rewards\";\nimport { RewardType } from \"../../generated/globalTypes\";\n\nconst Ctx = React.createContext({\n  add: (value: NotificationI) => {},\n  remove: (id: any) => {},\n});\n\n// Styled Components\n// ==============================\n\ninterface NotificationI {\n  status?: \"success\" | \"info\" | \"warning\" | \"error\";\n  title: string;\n  description?: string | null;\n  showFireworks?: boolean;\n  rewardKind?: RewardType | null;\n  /** data:image/jpeg;base64... */\n  rewardImage?: string | null;\n}\n\nconst ToastContainer = (props: any) => (\n  <Box\n    position=\"fixed\"\n    top=\"0\"\n    left=\"50%\"\n    transform=\"translateX(-50%)\"\n    zIndex={9999}\n    {...props}\n  />\n);\n\nconst Toast = ({\n  content,\n  onDismiss,\n}: {\n  content: NotificationI;\n  onDismiss: any;\n}) => {\n  const rewardRef = useRef<any>();\n\n  useEffect(() => {\n    if (content.showFireworks) {\n      rewardRef.current.rewardMe();\n    }\n  }, []);\n\n  return (\n    <motion.div\n      initial={{ opacity: 0, y: -50, zIndex: 999 }}\n      animate={{ opacity: 1, y: 0 }}\n    >\n      {content.showFireworks ? (\n        <Reward\n          ref={(ref) => {\n            rewardRef.current = ref;\n          }}\n          type=\"confetti\"\n          config={{\n            angle: 90,\n            decay: 0.91,\n            spread: 200,\n            startVelocity: 35,\n            elementCount: 80,\n            elementSize: 8,\n            lifetime: 200,\n            zIndex: 10,\n            springAnimation: true,\n          }}\n        >\n          <NotificationContent content={content} onDismiss={onDismiss} />\n        </Reward>\n      ) : (\n        <NotificationContent content={content} onDismiss={onDismiss} />\n      )}\n    </motion.div>\n  );\n};\n\nconst NotificationContent = ({\n  content,\n  onDismiss,\n}: {\n  content: NotificationI;\n  onDismiss: any;\n}) => (\n  <Alert\n    status={content.status ? content.status : \"success\"}\n    variant=\"solid\"\n    flexDirection=\"column\"\n    alignItems=\"center\"\n    justifyContent=\"center\"\n    textAlign=\"center\"\n    width=\"100%\"\n    maxWidth=\"600px\"\n    minWidth=\"200px\"\n    marginTop={4}\n    padding={12}\n    zIndex={999}\n  >\n    {content.rewardImage && <RewardImage src={content.rewardImage} />}\n    <AlertTitle mt={4} mb={1} fontSize=\"lg\">\n      {content.title}\n    </AlertTitle>\n    {content.description && (\n      <AlertDescription maxWidth=\"sm\">{content.description}</AlertDescription>\n    )}\n    <CloseButton\n      position=\"absolute\"\n      right=\"8px\"\n      top=\"8px\"\n      onClick={onDismiss}\n    />\n  </Alert>\n);\n\nconst RewardImage = styled.img`\n  max-height: 100px;\n  border-radius: 5px;\n`;\n\n// Provider\n// ==============================\n\nlet toastCount = 0;\n\nexport function NotificationsProvider({\n  children,\n}: {\n  children: React.ReactNode;\n}) {\n  const [toasts, setToasts] = React.useState<any | any[]>([]);\n\n  const add = (content: any) => {\n    const id = toastCount++;\n    const toast = { content, id };\n    setToasts([...toasts, toast]);\n  };\n  const remove = (id: any) => {\n    const newToasts = toasts.filter((t: any) => t.id !== id);\n    setToasts(newToasts);\n  };\n  // avoid creating a new fn on every render\n  const onDismiss = (id: any) => () => remove(id);\n\n  return (\n    <Ctx.Provider value={{ add, remove }}>\n      {children}\n      <ToastContainer>\n        {toasts.map(({ content, id, ...rest }: { content: any; id: any }) => (\n          <Toast\n            content={content}\n            key={id}\n            onDismiss={onDismiss(id)}\n            {...rest}\n          />\n        ))}\n      </ToastContainer>\n    </Ctx.Provider>\n  );\n}\n\n// Consumer\n// ==============================\n\nexport const useNotifications = () => React.useContext(Ctx);\n","/* tslint:disable */\n/* eslint-disable */\n// @generated\n// This file was automatically generated and should not be edited.\n\n//==============================================================\n// START Enums and Input Objects\n//==============================================================\n\nexport enum EvaluationEngine {\n  BASE = \"BASE\",\n  MOOSHAK = \"MOOSHAK\",\n}\n\nexport enum GameStateEnum {\n  CLOSED = \"CLOSED\",\n  LOCKED = \"LOCKED\",\n  OPEN = \"OPEN\",\n}\n\nexport enum Mode {\n  DUEL = \"DUEL\",\n  HACK_IT = \"HACK_IT\",\n  NORMAL = \"NORMAL\",\n  SHAPESHIFTER = \"SHAPESHIFTER\",\n  SHORTENING = \"SHORTENING\",\n  SPEEDUP = \"SPEEDUP\",\n  TIME_BOMB = \"TIME_BOMB\",\n}\n\nexport enum Result {\n  ACCEPT = \"ACCEPT\",\n  ASK_FOR_REEVALUATION = \"ASK_FOR_REEVALUATION\",\n  COMPILATION_ERROR = \"COMPILATION_ERROR\",\n  OUTPUT_LIMIT_OVERFLOW = \"OUTPUT_LIMIT_OVERFLOW\",\n  PROCESSING = \"PROCESSING\",\n  RESOURCE_USAGE_EXCEEDED = \"RESOURCE_USAGE_EXCEEDED\",\n  RUNTIME_ERROR = \"RUNTIME_ERROR\",\n  TIMEOUT = \"TIMEOUT\",\n  WRONG_ANSWER = \"WRONG_ANSWER\",\n}\n\nexport enum RewardType {\n  BADGE = \"BADGE\",\n  COUPON = \"COUPON\",\n  HINT = \"HINT\",\n  MESSAGE = \"MESSAGE\",\n  POINT = \"POINT\",\n  REVEAL = \"REVEAL\",\n  UNLOCK = \"UNLOCK\",\n  VIRTUAL_ITEM = \"VIRTUAL_ITEM\",\n}\n\nexport enum State {\n  AVAILABLE = \"AVAILABLE\",\n  COMPLETED = \"COMPLETED\",\n  FAILED = \"FAILED\",\n  HIDDEN = \"HIDDEN\",\n  LOCKED = \"LOCKED\",\n  OPENED = \"OPENED\",\n  REJECTED = \"REJECTED\",\n}\n\n//==============================================================\n// END Enums and Input Objects\n//==============================================================\n","import { CheckIcon, CloseIcon, EditIcon } from \"@chakra-ui/icons\";\nimport {\n  Flex,\n  FormControl,\n  FormLabel,\n  IconButton,\n  Input,\n} from \"@chakra-ui/react\";\nimport React, { useState } from \"react\";\n\ninterface EditableProps {\n  defaultValue: string;\n  label?: string;\n  onChange: (value: string) => Promise<void>;\n  cleanOnEdit?: boolean;\n}\n\nconst Editable = ({\n  defaultValue,\n  label,\n  onChange,\n  cleanOnEdit,\n}: EditableProps) => {\n  const [isEditing, setIsEditing] = useState(false);\n  const [value, setValue] = useState(defaultValue);\n  const [loading, setLoading] = useState(false);\n\n  return (\n    <FormControl>\n      {label && <FormLabel>{label}</FormLabel>}\n      <Flex justifyContent=\"space-between\">\n        <Input\n          value={value}\n          onChange={(e) => setValue(e.target.value)}\n          disabled={!isEditing}\n        />\n        {!isEditing ? (\n          <IconButton\n            marginLeft={2}\n            onClick={() => {\n              cleanOnEdit && setValue(\"\");\n              setIsEditing(true);\n            }}\n            aria-label=\"Edit\"\n            icon={<EditIcon />}\n          />\n        ) : (\n          <Flex>\n            <IconButton\n              isLoading={loading}\n              marginLeft={2}\n              onClick={async () => {\n                setLoading(true);\n                try {\n                  await onChange(value);\n                } catch (err) {\n                  setValue(defaultValue);\n                }\n                setLoading(false);\n                setIsEditing(false);\n              }}\n              aria-label=\"Accept\"\n              icon={<CheckIcon />}\n            />\n            <IconButton\n              marginLeft={2}\n              onClick={() => {\n                setValue(defaultValue);\n                setIsEditing(false);\n              }}\n              aria-label=\"Cancel\"\n              icon={<CloseIcon />}\n            />\n          </Flex>\n        )}\n      </Flex>\n    </FormControl>\n  );\n};\n\nexport default Editable;\n","import { Avatar, Box, Flex, Text, useColorMode } from \"@chakra-ui/react\";\nimport React, { useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport Editable from \"./Editable\";\n\nconst ChangeAvatarURL = ({\n  changeAvatar,\n  avatarURL,\n}: {\n  avatarURL?: string;\n  changeAvatar: ({ avatarURL }: { avatarURL: string }) => Promise<void>;\n}) => {\n  const { colorMode } = useColorMode();\n  const { t } = useTranslation();\n\n  return (\n    <Box width=\"100%\">\n      <Text marginBottom={2} fontWeight={500}>\n        {t(\"Profile picture\")}\n      </Text>\n      <Flex\n        padding={4}\n        justifyContent=\"space-between\"\n        alignItems=\"center\"\n        width=\"100%\"\n        border=\"1px solid\"\n        borderColor={colorMode === \"dark\" ? \"gray.700\" : \"gray.200\"}\n        borderRadius={4}\n      >\n        <Box width={6 / 8}>\n          <Editable\n            defaultValue={avatarURL ? avatarURL : t(\"avatarLink\")}\n            onChange={async (value) => {\n              await changeAvatar({ avatarURL: value });\n            }}\n            cleanOnEdit\n          />\n        </Box>\n\n        <Avatar src={avatarURL ? avatarURL : \"\"} />\n      </Flex>\n    </Box>\n  );\n};\n\nexport default ChangeAvatarURL;\n","import { ViewIcon, ViewOffIcon } from \"@chakra-ui/icons\";\nimport {\n  Box,\n  Button,\n  Flex,\n  FormControl,\n  FormLabel,\n  IconButton,\n  Input,\n  Text,\n  useColorMode,\n  VStack,\n} from \"@chakra-ui/react\";\nimport React, { useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\n\nconst PasswordInput = ({\n  value,\n  onChange,\n  isInvalid,\n}: {\n  value: string;\n  onChange: (value: string) => void;\n  isInvalid?: boolean;\n}) => {\n  const [show, setShow] = useState(false);\n\n  return (\n    <Flex>\n      <Input\n        isInvalid={isInvalid ? isInvalid : false}\n        type={!show ? \"password\" : \"text\"}\n        value={value}\n        onChange={(e) => onChange(e.target.value)}\n      />\n      <IconButton\n        marginLeft={2}\n        onClick={() => setShow(!show)}\n        aria-label=\"Edit\"\n        icon={!show ? <ViewOffIcon /> : <ViewIcon />}\n      />\n    </Flex>\n  );\n};\n\nconst PasswordChangeForm = ({\n  onSubmit,\n}: {\n  onSubmit: ({\n    currentPassword,\n    newPassword,\n    confirmation,\n  }: {\n    currentPassword: string;\n    newPassword: string;\n    confirmation: string;\n  }) => Promise<void>;\n}) => {\n  const { t } = useTranslation();\n\n  const { colorMode } = useColorMode();\n  const [loading, setLoading] = useState(false);\n  const [currentPassword, setCurrentPassword] = useState(\"\");\n  const [newPassword, setNewPassword] = useState(\"\");\n  const [confirmationPassword, setConfirmationPassword] = useState(\"\");\n\n  const submitPasswordChange = async () => {\n    setLoading(true);\n    if (newPassword === confirmationPassword) {\n      try {\n        onSubmit({\n          currentPassword,\n          newPassword,\n          confirmation: confirmationPassword,\n        });\n      } catch (err) {\n        console.log(\"ERROR\", err);\n      }\n    }\n\n    setLoading(false);\n  };\n\n  return (\n    <Box width=\"100%\" paddingTop={4}>\n      <Text marginBottom={2} fontWeight={500}>\n        {t(\"Change password\")}\n      </Text>\n      <Box\n        border=\"1px solid\"\n        borderColor={colorMode === \"dark\" ? \"gray.700\" : \"gray.200\"}\n        width=\"100%\"\n        borderRadius={4}\n        padding={4}\n      >\n        <VStack spacing={3}>\n          <FormControl>\n            <FormLabel>{t(\"Old password\")}</FormLabel>\n            <PasswordInput\n              value={currentPassword}\n              onChange={setCurrentPassword}\n            />\n          </FormControl>\n\n          <FormControl>\n            <FormLabel>{t(\"New password\")}</FormLabel>\n            <PasswordInput value={newPassword} onChange={setNewPassword} />\n          </FormControl>\n\n          <FormControl>\n            <FormLabel>{t(\"Repeat new password\")}</FormLabel>\n            <PasswordInput\n              isInvalid={\n                newPassword !== confirmationPassword &&\n                confirmationPassword.length > 1\n              }\n              value={confirmationPassword}\n              onChange={setConfirmationPassword}\n            />\n          </FormControl>\n\n          <Button\n            isDisabled={\n              !currentPassword ||\n              !newPassword ||\n              !confirmationPassword ||\n              loading\n            }\n            isLoading={loading}\n            onClick={submitPasswordChange}\n          >\n            {t(\"Submit\")}\n          </Button>\n        </VStack>\n      </Box>\n    </Box>\n  );\n};\n\nexport default PasswordChangeForm;\n","import { Box, VStack } from \"@chakra-ui/layout\";\nimport { Heading } from \"@chakra-ui/react\";\nimport { useKeycloak } from \"@react-keycloak/web\";\nimport axios from \"axios\";\nimport React, { useEffect, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport withChangeAnimation from \"../../utilities/withChangeAnimation\";\nimport { useNotifications } from \"../Notifications\";\nimport ChangeAvatarURL from \"./ChangeAvatarURL\";\nimport Editable from \"./Editable\";\nimport PasswordChangeForm from \"./PasswordChangeForm\";\n\nconst AccountSettings = () => {\n  const { add: addNotification } = useNotifications();\n\n  const { keycloak } = useKeycloak();\n  const { t } = useTranslation();\n  const [userProfile, setUserProfile] = useState<any>({});\n\n  const loadUserProfile = async () => {\n    const keycloakUserProfile = await keycloak.loadUserProfile();\n    if (keycloakUserProfile) {\n      console.log(\"KK\", keycloakUserProfile);\n      setUserProfile(keycloakUserProfile);\n    }\n\n    axios.defaults.headers.post[\"Authorization\"] = `Bearer ${keycloak.token}`;\n  };\n\n  useEffect(() => {\n    loadUserProfile();\n  }, []);\n\n  if (!userProfile.email) {\n    return <span>{t(\"Loading\")}</span>;\n  }\n\n  const changePassword = async ({\n    currentPassword,\n    newPassword,\n    confirmation,\n  }: {\n    currentPassword: string;\n    newPassword: string;\n    confirmation: string;\n  }) => {\n    try {\n      await axios.post(\n        `${process.env.REACT_APP_KEYCLOAK_URL}/realms/${keycloak.realm}/account/credentials/password`,\n        {\n          currentPassword,\n          newPassword,\n          confirmation,\n        }\n      );\n\n      console.log(\"success\");\n    } catch (err) {\n      addNotification({\n        status: \"error\",\n        title: t(\"error.passwordChange.title\"),\n        description: t(\"error.passwordChange.description\"),\n      });\n      console.log(err);\n    }\n  };\n\n  const editUserDetails = async ({\n    firstName,\n    lastName,\n  }: {\n    firstName?: String;\n    lastName?: String;\n  }) => {\n    await axios.post(\n      `${process.env.REACT_APP_KEYCLOAK_URL}/realms/${keycloak.realm}/account/`,\n      {\n        firstName: firstName ? firstName : userProfile.firstName,\n        lastName: lastName ? lastName : userProfile.lastName,\n      }\n    );\n  };\n\n  // const changeAvatar = async ({ avatarDataURL }: { avatarDataURL: string }) => {\n  //   const params = {\n  //     [process.env.REACT_APP_KEYCLOAK_AVATAR || \"avatar\"]: avatarDataURL,\n  //   };\n\n  //   try {\n  //     await axios.post(\n  //       `${process.env.REACT_APP_KEYCLOAK_URL}/realms/${keycloak.realm}/account/`,\n  //       {\n  //         firstName: userProfile.firstName,\n  //         lastName: userProfile.lastName,\n  //         attributes: {\n  //           ...params,\n  //         },\n  //       }\n  //     );\n  //   } catch (err) {\n  //     addNotification({\n  //       status: \"error\",\n  //       title: t(\"error.title\"),\n  //       description: t(\"error.description\"),\n  //     });\n  //   }\n  // };\n\n  const changeAvatarURL = async ({ avatarURL }: { avatarURL: string }) => {\n    const params = {\n      [process.env.REACT_APP_KEYCLOAK_AVATAR || \"avatar\"]: avatarURL,\n    };\n\n    try {\n      await axios.post(\n        `${process.env.REACT_APP_KEYCLOAK_URL}/realms/${keycloak.realm}/account/`,\n        {\n          firstName: userProfile.firstName,\n          lastName: userProfile.lastName,\n          attributes: {\n            ...params,\n          },\n        }\n      );\n\n      loadUserProfile();\n    } catch (err) {\n      addNotification({\n        status: \"error\",\n        title: t(\"error.title\"),\n        description: t(\"error.description\"),\n      });\n    }\n  };\n\n  return (\n    <Box maxWidth={500} margin=\"auto\">\n      <Heading\n        as=\"h3\"\n        size=\"md\"\n        marginTop={5}\n        marginBottom={5}\n        width=\"100%\"\n        textAlign=\"center\"\n      >\n        {t(\"Account settings\")}\n      </Heading>\n\n      <VStack spacing={3}>\n        <Editable\n          defaultValue={userProfile.firstName}\n          label={t(\"First name\")}\n          onChange={async (value) => {\n            await editUserDetails({ firstName: value });\n            setUserProfile({ ...userProfile, lastName: value });\n          }}\n        />\n        <Editable\n          defaultValue={userProfile.lastName}\n          label={t(\"Last name\")}\n          onChange={async (value) => {\n            await editUserDetails({ lastName: value });\n            setUserProfile({ ...userProfile, lastName: value });\n          }}\n        />\n\n        {/* <ChangeAvatar\n          changeAvatar={changeAvatar}\n          avatarDataURL={userProfile[process.env.REACT_APP_KEYCLOAK_AVATAR]}\n          loadUserProfile={loadUserProfile}\n        /> */}\n\n        <ChangeAvatarURL\n          changeAvatar={changeAvatarURL}\n          avatarURL={\n            userProfile.attributes[process.env.REACT_APP_KEYCLOAK_AVATAR] &&\n            userProfile.attributes[process.env.REACT_APP_KEYCLOAK_AVATAR][0]\n          }\n        />\n\n        <PasswordChangeForm onSubmit={changePassword} />\n      </VStack>\n    </Box>\n  );\n};\n\nexport default withChangeAnimation(AccountSettings);\n","import { gql } from \"@apollo/client\";\n\nexport const ADD_MULTIPLE_TO_GAME = gql`\n  mutation addMultipleToGameMutation($gameId: String!, $usersIds: [String!]!) {\n    addMultipleToGame(gameId: $gameId, usersIds: $usersIds) {\n      id\n    }\n  }\n`;\n","import { gql } from \"@apollo/client\";\n\nexport const GET_GROUPS = gql`\nquery getGroupsQuery($gameId: String!) {\n  groups(gameId: $gameId) {\n    id\n    name\n    displayName\n  }\n}\n`;","import { gql } from \"@apollo/client\";\n\nexport const REMOVE_MULTIPLE_FROM_GAME = gql`\n  mutation removeMultipleFromGameMutation(\n    $gameId: String!\n    $usersIds: [String!]!\n  ) {\n    removeMultipleFromGame(gameId: $gameId, usersIds: $usersIds) {\n      id\n    }\n  }\n`;\n","import { gql, useMutation } from \"@apollo/client\";\nimport { CopyIcon } from \"@chakra-ui/icons\";\nimport {\n  Button,\n  FormControl,\n  FormLabel,\n  IconButton,\n  Input,\n  InputGroup,\n  InputRightElement,\n  Modal,\n  ModalBody,\n  ModalCloseButton,\n  ModalContent,\n  ModalFooter,\n  ModalHeader,\n  ModalOverlay,\n  Select,\n} from \"@chakra-ui/react\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport React, { useEffect, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { generateGameTokenMutation } from \"../generated/generateGameTokenMutation\";\nimport { generateGroupTokenMutation } from \"../generated/generateGroupTokenMutation\";\nimport { getGroupsQuery } from \"../generated/getGroupsQuery\";\n\nconst GENERATE_GROUP_TOKEN = gql`\n  mutation generateGroupTokenMutation($gameId: String!, $groupId: String!) {\n    generateGroupToken(gameId: $gameId, groupId: $groupId) {\n      token\n      expiresIn\n    }\n  }\n`;\n\nconst GENERATE_GAME_TOKEN = gql`\n  mutation generateGameTokenMutation($gameId: String!) {\n    generateGameToken(id: $gameId) {\n      token\n      expiresIn\n    }\n  }\n`;\n\nconst GenerateInviteLinkModal = ({\n  isOpen,\n  onClose,\n  groupsData,\n  gameId,\n}: {\n  isOpen: boolean;\n  onClose: () => void;\n  groupsData: getGroupsQuery;\n  gameId: string;\n}) => {\n  const [loading, setLoading] = useState(false);\n  const [groupId, setGroupId] = useState(\"\");\n  const { t } = useTranslation();\n\n  const [link, setLink] = useState(\"\");\n\n  useEffect(() => {\n    setLink(\"\");\n  }, [isOpen]);\n\n  const [generateGameToken] =\n    useMutation<generateGameTokenMutation>(GENERATE_GAME_TOKEN);\n\n  const [generateGroupToken] =\n    useMutation<generateGroupTokenMutation>(GENERATE_GROUP_TOKEN);\n\n  const generateTokens = async () => {\n    setLoading(true);\n    setLink(\"\");\n\n    let gameToken = \"\";\n    let groupToken = \"\";\n\n    const generatedGameToken = await generateGameToken({\n      variables: {\n        gameId,\n      },\n    });\n\n    gameToken = generatedGameToken.data?.generateGameToken.token || \"\";\n\n    if (groupId != \"\") {\n      const generatedGroupToken = await generateGroupToken({\n        variables: {\n          gameId,\n          groupId,\n        },\n      });\n\n      groupToken = generatedGroupToken.data?.generateGroupToken.token || \"\";\n    }\n\n    if (gameToken) {\n      const generatedLink =\n        `${window.location.origin}${process.env.PUBLIC_URL}/game/enroll/${gameToken}` +\n        (groupToken ? `/${groupToken}` : \"\");\n\n      setLink(generatedLink);\n    }\n\n    setLoading(false);\n  };\n\n  return (\n    <Modal isOpen={isOpen} onClose={onClose}>\n      <ModalOverlay />\n      <ModalContent>\n        <ModalHeader>{t(\"Generate invite link\")}</ModalHeader>\n        <ModalCloseButton />\n        <ModalBody>\n          <FormControl>\n            <FormLabel>{t(\"linkGenerateDescription\")}</FormLabel>\n            <Select\n              value={groupId}\n              onChange={(e) => setGroupId(e.target.value)}\n              placeholder={t(\"placeholders.chooseGroup\")}\n            >\n              {groupsData.groups.map((group, i) => {\n                return (\n                  <option value={group.id} key={i}>\n                    {group.displayName} ({group.name})\n                  </option>\n                );\n              })}\n            </Select>\n          </FormControl>\n\n          <AnimatePresence>\n            {link && (\n              <motion.div\n                initial={{ opacity: 0, maxHeight: 0 }}\n                animate={{ opacity: 1, maxHeight: 50 }}\n                exit={{ opacity: 0, maxHeight: 0 }}\n              >\n                <InputGroup mt={2}>\n                  <Input placeholder=\"Enter amount\" value={link} readOnly />\n                  <InputRightElement>\n                    <IconButton\n                      onClick={() => {\n                        navigator.clipboard.writeText(link);\n                      }}\n                      aria-label=\"Search database\"\n                      icon={<CopyIcon />}\n                    />\n                  </InputRightElement>\n                </InputGroup>\n              </motion.div>\n            )}\n          </AnimatePresence>\n        </ModalBody>\n\n        <ModalFooter>\n          <Button variant=\"outline\" mr={3} onClick={onClose}>\n            {t(\"Close\")}\n          </Button>\n          <Button\n            colorScheme=\"blue\"\n            mr={3}\n            onClick={generateTokens}\n            isLoading={loading}\n          >\n            {t(\"Generate\")}\n          </Button>\n        </ModalFooter>\n      </ModalContent>\n    </Modal>\n  );\n};\n\nexport default GenerateInviteLinkModal;\n","import { useColorMode } from \"@chakra-ui/react\";\nimport styled from \"@emotion/styled\";\nimport React from \"react\";\n\nconst ScrollbarWrapper = ({\n  children,\n  thin,\n}: {\n  children: React.ReactNode;\n  thin?: boolean;\n}) => {\n  const { colorMode } = useColorMode();\n\n  return (\n    <ScrollbarStyled colorMode={colorMode} thin={thin}>\n      {children}\n    </ScrollbarStyled>\n  );\n};\n\nconst ScrollbarStyled = styled.span<{ colorMode: string; thin?: boolean }>`\n  & > *,\n  .better-scrollbar {\n    ::-webkit-scrollbar {\n      width: ${({ thin }) => (thin ? 6 : 13)}px !important;\n      height: ${({ thin }) => (thin ? 6 : 13)}px !important;\n    }\n    ::-webkit-scrollbar-thumb {\n      background: ${({ colorMode }) =>\n        colorMode != \"dark\"\n          ? \"rgba(0, 0, 0, 0.1)\"\n          : \"rgba(255, 255, 255, 0.1)\"} !important;\n      border-radius: 1px !important;\n    }\n    ::-webkit-scrollbar-thumb:hover {\n      background: #323232 !important;\n    }\n    ::-webkit-scrollbar-track {\n      background: ${({ colorMode }) =>\n        colorMode != \"dark\"\n          ? \"rgba(0, 0, 0, 0.1)\"\n          : \"rgba(255, 255, 255, 0.1)\"} !important;\n      border-radius: 1px !important;\n    }\n  }\n`;\n\nexport default ScrollbarWrapper;\n","import { Checkbox } from \"@chakra-ui/react\";\nimport React from \"react\";\n\nconst CheckboxForTable = React.forwardRef(\n  ({ indeterminate, ...rest }: any, ref: any) => {\n    const defaultRef = React.useRef();\n    const resolvedRef = ref || defaultRef;\n\n    React.useEffect(() => {\n      resolvedRef.current.indeterminate = indeterminate;\n    }, [resolvedRef, indeterminate]);\n\n    return (\n      <Checkbox\n        type=\"checkbox\"\n        ref={resolvedRef}\n        {...rest}\n        isChecked={rest.checked}\n      />\n    );\n  }\n);\n\nexport default CheckboxForTable;\n","import {\n  Box,\n  Button,\n  CircularProgress,\n  Flex,\n  Table,\n  Tbody,\n  Td,\n  Th,\n  Thead,\n  Tr,\n  useColorMode,\n} from \"@chakra-ui/react\";\nimport styled from \"@emotion/styled\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport React, { useEffect, useMemo, useState } from \"react\";\nimport { CSVDownload } from \"react-csv\";\nimport { useTranslation } from \"react-i18next\";\nimport {\n  TiArrowSortedDown,\n  TiArrowSortedUp,\n  TiArrowUnsorted,\n} from \"react-icons/ti\";\nimport Pagination from \"react-js-pagination\";\nimport {\n  useFilters,\n  usePagination,\n  useRowSelect,\n  useRowState,\n  useSortBy,\n  useTable,\n} from \"react-table\";\nimport ScrollbarWrapper from \"../ScrollbarWrapper\";\nimport CheckboxForTable from \"./CheckboxForTable\";\n\ntype TableComponentProps = {\n  columns: any;\n  data: any;\n  dontRecomputeChange?: boolean;\n\n  /** Disables the table and shows a loading indicator  */\n  loading?: boolean;\n\n  /** Function invoked after clicking on a row (has an access to row.original)  */\n  onRowClick?: (row: any) => void;\n  contextMenu?: React.ReactNode;\n  tableHeader?: React.ReactNode;\n\n  //** Function invoked before CSV export */\n  refreshData?: () => Promise<any>;\n} & (\n  | {\n      selectableRows?: false | undefined;\n      setIsAnythingSelected?: undefined;\n      setSelectedStudents?: undefined;\n    }\n  | {\n      /** Adds a column with checkboxes if true.  */\n      selectableRows: true;\n\n      /** Function invoked after rows selection change. Returns a boolean value. Needs selectableRows enabled.  */\n      setIsAnythingSelected?: (isAnythingSelected: boolean) => void;\n\n      /** Function invoked after rows selection change. Returns a boolean value. Needs selectableRows enabled.  */\n      setSelectedStudents?: (rows: any[]) => void;\n    }\n);\n\nconst TableComponent: React.FC<TableComponentProps> = ({\n  columns: columnsProp,\n  data,\n  dontRecomputeChange,\n  onRowClick,\n  selectableRows,\n  setIsAnythingSelected,\n  setSelectedStudents,\n  loading,\n  contextMenu,\n  tableHeader,\n  refreshData,\n}) => {\n  const [isCsvLoading, setCsvLoading] = useState(false);\n  const [isCsvReady, setCsvReady] = useState(false);\n  const { colorMode } = useColorMode();\n  const { i18n } = useTranslation();\n  const columns = useMemo(\n    () => columnsProp,\n    [dontRecomputeChange ? null : columnsProp, i18n.language]\n  );\n\n  // const data = useMemo(() => dataProp, [\n  //   dontRecomputeChange ? null : dataProp,\n  //   i18n.language,\n  // ]);\n\n  const tableInstance = useTable(\n    {\n      columns,\n      data,\n    },\n    useFilters,\n    useSortBy,\n    usePagination,\n    useRowState,\n    useRowSelect,\n    (hooks) => {\n      hooks.visibleColumns.push((columns) => {\n        return selectableRows\n          ? [\n              {\n                id: \"selection\",\n                Header: ({ getToggleAllRowsSelectedProps }) => (\n                  <CheckboxForTable {...getToggleAllRowsSelectedProps()} />\n                ),\n                disableSortBy: true,\n                Cell: ({ row }) => (\n                  <CheckboxForTable {...row.getToggleRowSelectedProps()} />\n                ),\n              },\n              ...columns,\n            ]\n          : [...columns];\n      });\n    }\n  );\n\n  const {\n    getTableProps,\n    getTableBodyProps,\n    headerGroups,\n    prepareRow,\n    selectedFlatRows,\n    page,\n    state,\n    gotoPage,\n    flatRows,\n  } = tableInstance;\n\n  const { pageSize, pageIndex } = state;\n\n  const prepareForCsv = () => {\n    console.log(\"PREPARE FOR CSV\");\n\n    const keys = tableInstance.allColumns.map((column) => column.Header);\n    const prepared = tableInstance.filteredRows.map((row) => {\n      let row1 = { ...row };\n\n      prepareRow(row1);\n      return row1.cells.map((cell) => {\n        if (cell.column.Cell) {\n          try {\n            const renderedCell = (cell.column.Cell as Function)(cell);\n\n            if (renderedCell === null) {\n              return \"\";\n            }\n\n            if (typeof renderedCell === \"object\") {\n              console.log(\"lol?\", renderedCell);\n              return \"N/A\";\n            }\n\n            return renderedCell.toString().replace(/\"/g, '\"\"');\n          } catch (err) {\n            console.log(\"error :(((\", err);\n            return \"N/A\";\n          }\n        }\n      });\n    });\n\n    prepared.unshift(\n      keys.map((key) => {\n        if (key?.toString().indexOf(\"getToggleAll\") !== -1) {\n          return \"Checkbox\";\n        }\n\n        if (typeof key === \"object\" || typeof key === \"function\") {\n          return \"N/A\";\n        }\n\n        return key;\n      })\n    );\n    console.log(\"PREPARED\", prepared);\n    return prepared;\n  };\n\n  useEffect(() => {\n    setSelectedStudents &&\n      setSelectedStudents(selectedFlatRows.map((row) => row.original));\n\n    if (setIsAnythingSelected) {\n      if (selectedFlatRows.length > 0) {\n        setIsAnythingSelected(true);\n      } else {\n        setIsAnythingSelected(false);\n      }\n    }\n  }, [selectedFlatRows.length]);\n\n  useEffect(() => {\n    if (isCsvReady) {\n      setCsvReady(false);\n    }\n  }, [isCsvReady]);\n\n  return (\n    <ScrollbarWrapper>\n      <Box overflowX=\"auto\" position=\"relative\">\n        {contextMenu && (\n          <Flex\n            float={tableHeader ? \"left\" : \"right\"}\n            width={tableHeader ? \"100%\" : \"auto\"}\n            justifyContent={\"space-between\"}\n            alignItems=\"center\"\n          >\n            {tableHeader && <Box>{tableHeader}</Box>}\n\n            <Flex flexDirection={\"row\"}>\n              {contextMenu}\n\n              {isCsvReady && <CSVDownload data={prepareForCsv()} />}\n\n              {/* <CSVLink data={prepareForCsv()}> */}\n              <Button\n                size=\"sm\"\n                float=\"right\"\n                marginLeft={2}\n                isLoading={isCsvLoading}\n                onClick={async () => {\n                  setCsvLoading(true);\n                  if (refreshData) {\n                    try {\n                      await refreshData();\n                      setCsvReady(true);\n                    } catch (err) {\n                      alert(\"err\");\n                    }\n                  } else {\n                    setCsvReady(true);\n                  }\n                  setCsvLoading(false);\n                }}\n              >\n                CSV\n              </Button>\n              {/* </CSVLink> */}\n            </Flex>\n          </Flex>\n        )}\n\n        <AnimatePresence>\n          {loading && (\n            <motion.div\n              initial={{ opacity: 0 }}\n              animate={{ opacity: 1 }}\n              exit={{ opacity: 0 }}\n              style={{ zIndex: 9999 }}\n            >\n              <CircularProgress\n                size=\"35px\"\n                isIndeterminate\n                color=\"blue.300\"\n                position=\"absolute\"\n                left=\"50%\"\n                top=\"50%\"\n                transform=\"translate3d(-50%, -50%, 0)\"\n                zIndex=\"9999\"\n              />\n            </motion.div>\n          )}\n        </AnimatePresence>\n        <Table\n          {...getTableProps()}\n          maxWidth=\"100%\"\n          transition=\"opacity 0.5s\"\n          pointerEvents={loading ? \"none\" : \"all\"}\n          opacity={loading ? 0.3 : 1}\n        >\n          <Thead userSelect=\"none\">\n            {headerGroups.map((headerGroup) => (\n              <Tr {...headerGroup.getHeaderGroupProps()}>\n                {headerGroup.headers.map((column, i) => (\n                  <Th {...column.getHeaderProps(column.getSortByToggleProps())}>\n                    <Flex justifyContent=\"space-between\">\n                      <Box color={column.isSorted ? \"deepskyblue\" : \"default\"}>\n                        {column.render(\"Header\")}\n                      </Box>\n\n                      <Box float=\"right\" textAlign=\"right\">\n                        {column.isSorted ? (\n                          <Box color=\"deepskyblue\">\n                            <AnimatedSortIcon\n                              icon={<TiArrowSortedDown fontSize={16} />}\n                              isVisible={column.isSortedDesc ? true : false}\n                            />\n                            <AnimatedSortIcon\n                              icon={<TiArrowSortedUp fontSize={16} />}\n                              isVisible={!column.isSortedDesc ? true : false}\n                            />\n                          </Box>\n                        ) : (\n                          !column.disableSortBy && (\n                            <TiArrowUnsorted fontSize={16} />\n                          )\n                        )}\n\n                        {/* {column.canFilter ? column.render(\"Filter\") : null} */}\n                      </Box>\n                    </Flex>\n                  </Th>\n                ))}\n              </Tr>\n            ))}\n\n            {headerGroups.map((headerGroup) => (\n              <Tr {...headerGroup.getHeaderGroupProps()} padding={0}>\n                {headerGroup.headers.map((column, i) =>\n                  column.canFilter ? (\n                    <Th {...column.getHeaderProps()} padding={2}>\n                      {column.render(\"Filter\")}\n                    </Th>\n                  ) : (\n                    <Th key={i}>- </Th>\n                  )\n                )}\n              </Tr>\n            ))}\n          </Thead>\n          <Tbody {...getTableBodyProps()}>\n            {page.map((row) => {\n              prepareRow(row);\n              return (\n                <Tr\n                  {...row.getRowProps()}\n                  style={{\n                    cursor: onRowClick ? \"pointer\" : \"inherit\",\n                  }}\n                  transition=\"all 0.5s\"\n                  _hover={\n                    onRowClick\n                      ? { bg: colorMode == \"dark\" ? \"gray.700\" : \"gray.100\" }\n                      : {}\n                  }\n                >\n                  {row.cells.map((cell) => (\n                    <Td\n                      {...cell.getCellProps()}\n                      onClick={() =>\n                        cell.column.id != \"selection\" &&\n                        cell.column.id.substring(0, 6) != \"button\" &&\n                        onRowClick\n                          ? onRowClick(row.original)\n                          : null\n                      }\n                    >\n                      {cell.render(\"Cell\")}\n                    </Td>\n                  ))}\n                </Tr>\n              );\n            })}\n          </Tbody>\n        </Table>\n      </Box>\n      {/* {JSON.stringify({\n        selectedFlatRows: selectedFlatRows.map((row) => row.original),\n      })} */}\n      <PaginationStyled>\n        <Pagination\n          activePage={pageIndex + 1}\n          itemsCountPerPage={pageSize}\n          totalItemsCount={data.length}\n          pageRangeDisplayed={5}\n          onChange={(pageNumber: number) => {\n            gotoPage(pageNumber - 1);\n          }}\n        />\n      </PaginationStyled>\n    </ScrollbarWrapper>\n  );\n};\n\nconst PaginationStyled = styled.div`\n  .pagination {\n    height: 30px;\n    display: flex;\n    flex-direction: row;\n    justify-content: space-between;\n    align-items: center;\n\n    li {\n      list-style: none;\n    }\n\n    .disabled {\n      opacity: 0.2;\n      pointer-events: none;\n    }\n\n    .active {\n      color: deepskyblue;\n    }\n  }\n\n  width: 200px;\n\n  margin: auto;\n`;\n\nconst AnimatedSortIcon = ({\n  icon,\n  isVisible,\n}: {\n  icon: React.ReactNode;\n  isVisible: boolean;\n}) => {\n  return (\n    <AnimatePresence>\n      {isVisible && (\n        <motion.div\n          initial={{ opacity: 0, maxHeight: 0, maxWidth: 0 }}\n          animate={{ opacity: 1, maxHeight: 5, maxWidth: 20 }}\n          exit={{ opacity: 0, maxHeight: 0, maxWidth: 0 }}\n        >\n          {icon}\n        </motion.div>\n      )}\n    </AnimatePresence>\n  );\n};\n\nexport default TableComponent;\n","import { Input, Select } from \"@chakra-ui/react\";\nimport React from \"react\";\n\nconst ColumnFilter = ({\n  column,\n  placeholder,\n}: {\n  column: any;\n  placeholder?: string;\n}) => {\n  const { filterValue, setFilter } = column;\n\n  return (\n    <Input\n      width=\"100%\"\n      size=\"xs\"\n      placeholder={placeholder ? placeholder : \"\"}\n      value={filterValue || \"\"}\n      onChange={(e) => setFilter(e.target.value)}\n    />\n  );\n};\n\ninterface OptionI {\n  value: any;\n  text: string;\n}\n\nexport const ColumnSelectFilter = ({\n  column,\n  placeholder,\n  options,\n}: {\n  column: any;\n  placeholder?: string;\n  options: OptionI[];\n}) => {\n  const { filterValue, setFilter } = column;\n\n  return (\n    <Select\n      size=\"sm\"\n      height=\"1.5rem\"\n      value={filterValue}\n      onChange={(e) => {\n        console.log(e.target.value);\n        setFilter(e.target.value);\n      }}\n    >\n      {options.map((optionObj, i) => (\n        <option value={optionObj.value} key={i}>\n          {optionObj.text}\n        </option>\n      ))}\n    </Select>\n  );\n};\n\nexport default ColumnFilter;\n","import { gql, useMutation, useQuery } from \"@apollo/client\";\nimport { ChevronDownIcon } from \"@chakra-ui/icons\";\nimport {\n  Box,\n  Button,\n  Divider,\n  Flex,\n  Heading,\n  Menu,\n  MenuButton,\n  MenuItem,\n  MenuList,\n  useDisclosure,\n} from \"@chakra-ui/react\";\nimport React, { useRef, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { Link, useParams } from \"react-router-dom\";\nimport { gameQuery } from \"../generated/gameQuery\";\nimport { getGroupsQuery } from \"../generated/getGroupsQuery\";\nimport { usersByRoleQuery } from \"../generated/usersByRoleQuery\";\nimport { ADD_MULTIPLE_TO_GAME } from \"../graphql/addMultipleToGame\";\nimport { GET_GROUPS } from \"../graphql/getGroups\";\nimport { REMOVE_MULTIPLE_FROM_GAME } from \"../graphql/removeMultipleFromGame\";\nimport withChangeAnimation from \"../utilities/withChangeAnimation\";\nimport GenerateInviteLinkModal from \"./GenerateInviteLinkModal\";\nimport { useNotifications } from \"./Notifications\";\nimport TableComponent from \"./TableComponent\";\nimport ColumnFilter, {\n  ColumnSelectFilter,\n} from \"./TableComponent/ColumnFilter\";\n\ninterface ParamTypes {\n  gameId: string;\n}\n\nconst GAME_QUERY = gql`\n  query gameQuery($gameId: String!) {\n    game(id: $gameId) {\n      id\n      name\n      players {\n        id\n        user {\n          id\n        }\n      }\n    }\n  }\n`;\n\nconst USERS_BY_ROLE_QUERY = gql`\n  query usersByRoleQuery($role: String!) {\n    usersByRole(role: $role) {\n      id\n      emailVerified\n      username\n      firstName\n      lastName\n      username\n      email\n    }\n  }\n`;\n\nconst AddPlayersToGame = () => {\n  const [isUserSelected, setIsUserSelected] = useState<boolean>(false);\n  const selectedUsersRef = useRef<any>([]);\n  const { add: addNotification } = useNotifications();\n  const [loading, setLoading] = useState(false);\n\n  const {\n    isOpen: isGenerateInviteModalOpen,\n    onOpen: onGenerateInviteModalOpen,\n    onClose: onGenerateInviteModalClose,\n  } = useDisclosure();\n\n  const { t } = useTranslation();\n\n  const { gameId } = useParams<ParamTypes>();\n\n  const [addUsersToGame] = useMutation(ADD_MULTIPLE_TO_GAME);\n\n  const [removeUsersFromGame] = useMutation(REMOVE_MULTIPLE_FROM_GAME);\n\n  const {\n    data: dataGame,\n    loading: loadingGame,\n    refetch: refetchGame,\n  } = useQuery<gameQuery>(GAME_QUERY, {\n    variables: { gameId },\n    fetchPolicy: \"no-cache\",\n  });\n\n  const { data: dataGroups, loading: loadingGroups } = useQuery<getGroupsQuery>(\n    GET_GROUPS,\n    {\n      variables: { gameId },\n      fetchPolicy: \"no-cache\",\n    }\n  );\n\n  const { data: dataUsers, loading: loadingUsers } = useQuery<usersByRoleQuery>(\n    USERS_BY_ROLE_QUERY,\n    {\n      variables: { role: \"student\" },\n      fetchPolicy: \"no-cache\",\n    }\n  );\n\n  const getSelectedUsersIds = () => {\n    return selectedUsersRef.current.map((user: any) => user.id);\n  };\n\n  const getSelectedUsersAndRemoveFromGame = async () => {\n    setLoading(true);\n    const selectedUsersIds = getSelectedUsersIds();\n\n    try {\n      await removeUsersFromGame({\n        variables: {\n          gameId,\n          usersIds: selectedUsersIds,\n        },\n      });\n\n      await refetchGame();\n    } catch (err) {\n      addNotification({\n        status: \"error\",\n        title: t(\"error.removePlayers.title\"),\n        description: t(\"error.removePlayers.description\"),\n      });\n    }\n\n    setLoading(false);\n  };\n\n  const getSelectedUsersAndAddToGame = async () => {\n    setLoading(true);\n    const selectedUsersIds = getSelectedUsersIds();\n\n    await addUsersToGame({\n      variables: {\n        gameId,\n        usersIds: selectedUsersIds,\n      },\n    });\n\n    await refetchGame();\n    setLoading(false);\n  };\n\n  if (loadingUsers || loadingGame || loadingGroups) {\n    return <div>Loading...</div>;\n  }\n\n  if (!dataGame || !dataUsers || !dataGroups) {\n    return <div>No data</div>;\n  }\n\n  return (\n    <>\n      <GenerateInviteLinkModal\n        onClose={onGenerateInviteModalClose}\n        isOpen={isGenerateInviteModalOpen}\n        groupsData={dataGroups}\n        gameId={gameId}\n      />\n      <Box>\n        <Flex justifyContent=\"space-between\" alignItems=\"center\">\n          <Box>\n            <Heading as=\"h3\" size=\"md\" marginTop={5} marginBottom={5}>\n              {t(\"Game\")}: {dataGame.game.name}\n            </Heading>\n          </Box>\n          <Flex>\n            <Box marginRight={2}>\n              <Button onClick={onGenerateInviteModalOpen}>\n                {t(\"Generate invite link\")}\n              </Button>\n            </Box>\n\n            <Box>\n              <Link\n                to={{\n                  pathname: `/teacher/game/${gameId}`,\n                }}\n              >\n                <Button>{t(\"Proceed\")}</Button>\n              </Link>\n            </Box>\n          </Flex>\n        </Flex>\n\n        <Divider marginBottom={25} />\n\n        <Flex justifyContent=\"space-between\" alignItems=\"center\">\n          <Heading as=\"h3\" size=\"sm\" marginTop={5} marginBottom={5}>\n            {t(\"Students\")}\n          </Heading>\n\n          <Menu>\n            <MenuButton\n              disabled={!isUserSelected}\n              size=\"sm\"\n              as={Button}\n              rightIcon={<ChevronDownIcon />}\n            >\n              {t(\"Actions\")}\n            </MenuButton>\n\n            <MenuList>\n              <MenuItem onClick={getSelectedUsersAndAddToGame}>\n                {t(\"Add to the game\")}\n              </MenuItem>\n              <MenuItem onClick={getSelectedUsersAndRemoveFromGame}>\n                {t(\"Remove from the game\")}\n              </MenuItem>\n            </MenuList>\n          </Menu>\n        </Flex>\n\n        <Box>\n          <TableComponent\n            loading={loading}\n            selectableRows\n            setIsAnythingSelected={setIsUserSelected}\n            setSelectedStudents={(rows: typeof dataUsers.usersByRole[]) => {\n              selectedUsersRef.current = rows;\n            }}\n            columns={[\n              {\n                Header: t(\"table.enrolled\"),\n                accessor: (row: any) =>\n                  !!dataGame.game.players.find(\n                    (gamePlayer) => gamePlayer.user.id === row.id\n                  ),\n                // disableFilters: true,\n                width: 100,\n                disableSortBy: true,\n                filter: (rows: any[], id: string, filterValue: any) => {\n                  return rows.filter((row) => {\n                    if (filterValue === \"all\") {\n                      return true;\n                    }\n                    const isEnrolled = !!dataGame.game.players.find(\n                      (gamePlayer) => gamePlayer.user.id === row.original.id\n                    );\n                    if (isEnrolled && filterValue === \"true\") {\n                      return true;\n                    }\n\n                    if (!isEnrolled && filterValue !== \"true\") {\n                      return true;\n                    }\n\n                    return false;\n                  });\n                },\n                Filter: ({ column }: { column: any }) => (\n                  <ColumnSelectFilter\n                    column={column}\n                    options={[\n                      {\n                        text: t(\"All\"),\n                        value: \"all\",\n                      },\n                      {\n                        text: t(\"Enrolled\"),\n                        value: true,\n                      },\n                      { text: t(\"Not enrolled\"), value: false },\n                    ]}\n                  />\n                ),\n                Cell: ({ value }: { value: any }) =>\n                  value ? t(\"Yes\") : t(\"No\"),\n              },\n              {\n                Header: t(\"table.name\"),\n                accessor: \"firstName\",\n                Filter: ({ column }: { column: any }) => (\n                  <ColumnFilter\n                    column={column}\n                    placeholder={t(\"placeholders.name\")}\n                  />\n                ),\n              },\n              {\n                Header: t(\"table.lastName\"),\n                accessor: \"lastName\",\n                Filter: ({ column }: { column: any }) => (\n                  <ColumnFilter\n                    column={column}\n                    placeholder={t(\"placeholders.lastName\")}\n                  />\n                ),\n              },\n              {\n                Header: t(\"table.email\"),\n                accessor: \"email\",\n                Filter: ({ column }: { column: any }) => (\n                  <ColumnFilter\n                    column={column}\n                    placeholder={t(\"placeholders.email\")}\n                  />\n                ),\n              },\n            ]}\n            data={dataUsers.usersByRole}\n          />\n        </Box>\n      </Box>\n    </>\n  );\n};\n\nexport default withChangeAnimation(AddPlayersToGame);\n","import axios from 'axios';\nimport React, { useEffect, useState } from 'react';\nimport { useHistory } from 'react-router-dom';\n\nimport { FocusActivityContextType, IFocusActivity } from '../@types/focus-activity';\nimport { clearFocusMode, clearTokens, restoreFocusMode, saveFocusMode } from '../utilities/Storage';\n\nconst FocusActivityContext = React.createContext<FocusActivityContextType | null>(null);\n\nconst FocusActivityContextProvider = ({ children }: any) => {\n  const history = useHistory();\n  const [focusActivity, setFocusActivity] = useState<IFocusActivity | null>(restoreFocusMode());\n\n  const activate = (focusActivity: IFocusActivity) => {\n    console.log(\"activating ...\");\n    setFocusActivity(focusActivity);\n    saveFocusMode(focusActivity);\n  };\n\n  const deactivate = async () => {\n    console.log('deactivating ...');\n\n    await axios.post(`${process.env.REACT_APP_API_URI}/lti/grade`, {\n      game: focusActivity?.gameId,\n      challenge: focusActivity?.challengeId,\n      activity: focusActivity?.activityId,\n    }, {\n      headers: {\n        Authorization: `Bearer ${focusActivity?.ltik}`\n      }\n    });\n\n    setFocusActivity(null);\n    clearFocusMode();\n    clearTokens();\n\n    history.replace('/');\n\n    window.close();\n  };\n\n  useEffect(() => {\n    if (focusActivity && focusActivity.gameId && focusActivity.challengeId) {\n      let toPath = `/game/${focusActivity.gameId}/challenge/${focusActivity.challengeId}`;\n      if (focusActivity.activityId) {\n        toPath += `/${focusActivity.activityId}`;\n      }\n      history.push(toPath)\n    }\n  }, [focusActivity, history]);\n\n  return (\n    <FocusActivityContext.Provider value={{ focusActivity, activate, deactivate }}>\n      {children}\n    </FocusActivityContext.Provider>\n  );\n};\n\nexport { FocusActivityContext, FocusActivityContextProvider };\n","import { IFocusActivity } from '../@types/focus-activity';\n\n/* AUTH TOKENS */\n\nexport const storeTokens = (token?: string, idToken?: string, refreshToken?: string): void => {\n  localStorage.setItem('FGPE_TOKEN', token ?? '');\n  localStorage.setItem('FGPE_REFRESH_TOKEN', refreshToken ?? '');\n  localStorage.setItem('FGPE_ID_TOKEN', idToken ?? '');\n};\n\nexport const restoreTokens = (): { token?: string; idToken?: string; refreshToken?: string; } => {\n  return {\n    token: localStorage.getItem('FGPE_TOKEN') || undefined,\n    refreshToken: localStorage.getItem('FGPE_REFRESH_TOKEN') || undefined,\n    idToken: localStorage.getItem('FGPE_ID_TOKEN') || undefined,\n  };\n};\n\nexport const clearTokens = (): void => {\n  localStorage.removeItem('FGPE_TOKEN');\n  localStorage.removeItem('FGPE_REFRESH_TOKEN');\n  localStorage.removeItem('FGPE_ID_TOKEN');\n};\n\n/* FOCUS MODE */\n\nexport const saveFocusMode = (focusActivity: IFocusActivity) => {\n  if (focusActivity) {\n    sessionStorage.setItem('FGPE_FOCUS_ACTIVITY', JSON.stringify(focusActivity));\n  } else {\n    sessionStorage.removeItem('FGPE_FOCUS_ACTIVITY');\n  }\n};\n\nexport const restoreFocusMode = (): IFocusActivity | null => {\n  const focusActivity = sessionStorage.getItem('FGPE_FOCUS_ACTIVITY');\n  if (focusActivity) {\n    return JSON.parse(focusActivity);\n  }\n  return null;\n};\n\nexport const clearFocusMode = (): void => {\n  sessionStorage.removeItem('FGPE_FOCUS_ACTIVITY');\n};\n","import { gql } from \"@apollo/client\";\n\nexport const CHALLENGE_STATUS_UPDATED_STUDENT_SUB = gql`\n  subscription challengeStatusUpdatedStudentSub($gameId: String!) {\n    challengeStatusUpdatedStudent(gameId: $gameId) {\n      openedAt\n      endedAt\n      startedAt\n      state\n    }\n  }\n`;\n","import { ApolloError } from \"@apollo/client\";\n\nexport enum SERVER_ERRORS {\n  ECONNABORTED = \"ECONNABORTED\",\n}\n\nexport const checkIfConnectionAborted = (error: ApolloError) => {\n  if(!error) {\n    return false\n  }\n\n  if(!error.graphQLErrors[0]) {\n    return false;\n  }\n\n  if(!error.graphQLErrors[0].message) {\n    return false\n  }\n\n  if(error.graphQLErrors[0].message.includes(\n    SERVER_ERRORS.ECONNABORTED\n  )) {\n    return true\n  }\n\n\n  return false;\n}","import { gql } from \"@apollo/client\";\n\nexport const FIND_CHALLENGE = gql`\n  query FindChallenge($gameId: String!, $challengeId: String!) {\n    game(id: $gameId) {\n      id\n      name\n    }\n\n    myChallengeStatus(gameId: $gameId, challengeId: $challengeId) {\n      startedAt\n      endedAt\n      openedAt\n\n      challenge {\n        id\n        name\n        mode\n      }\n\n      refs {\n        activity {\n          id\n          name\n          title\n        }\n        solved\n      }\n    }\n\n    programmingLanguages(gameId: $gameId) {\n      id\n      name\n      extension\n    }\n  }\n`;\n","import { gql } from \"@apollo/client\";\n\nexport const GET_ACTIVITY_BY_ID = gql`\n  query getActivityById($gameId: String!, $activityId: String!) {\n    activity(gameId: $gameId, activityId: $activityId) {\n      id\n      pdf\n      statement\n      editorKind\n      name\n      title\n      codeSkeletons {\n        extension\n        code\n      }\n    }\n  }\n`;\n","import { gql } from \"@apollo/client\";\n\nexport const REWARD_RECEIVED_STUDENT_SUB = gql`\n  subscription rewardReceivedStudentSubscription($gameId: String!) {\n    rewardReceivedStudent(gameId: $gameId) {\n      count\n      id\n      reward {\n        kind\n        image\n        name\n        message\n        description\n      }\n    }\n  }\n`;\n","import { ChevronRightIcon } from \"@chakra-ui/icons\";\nimport { Breadcrumb, BreadcrumbItem, BreadcrumbLink } from \"@chakra-ui/react\";\nimport styled from \"@emotion/styled\";\nimport { Link } from \"react-router-dom\";\nimport React from \"react\";\n\nconst BreadcrumbComponent = ({\n  gameName,\n  challengeName,\n  gameId,\n  challengeId,\n  isChallengeActive,\n}: {\n  gameName: string;\n  gameId: string;\n  challengeName?: string;\n  challengeId?: string;\n  isChallengeActive?: boolean;\n}) => {\n  return (\n    <Wrapper challengeView={isChallengeActive}>\n      <Breadcrumb\n        separator={<ChevronRightIcon color=\"gray.500\" />}\n        width=\"100%\"\n      >\n        <BreadcrumbItem pointerEvents=\"all\" maxWidth=\"100%\">\n          <BreadcrumbLink\n            as={Link}\n            overflow=\"hidden\"\n            whiteSpace=\"nowrap\"\n            textOverflow=\"ellipsis\"\n            to={`/game/${gameId.toString()}`}\n          >\n            {gameName}\n          </BreadcrumbLink>\n        </BreadcrumbItem>\n\n        {challengeName && challengeId && (\n          <BreadcrumbItem\n            pointerEvents=\"all\"\n            isCurrentPage={isChallengeActive}\n            maxWidth=\"100%\"\n          >\n            <BreadcrumbLink\n              as={Link}\n              to={`/game/${gameId.toString()}/challenge/${challengeId.toString()}`}\n              overflow=\"hidden\"\n              whiteSpace=\"nowrap\"\n              textOverflow=\"ellipsis\"\n            >\n              {challengeName}\n            </BreadcrumbLink>\n          </BreadcrumbItem>\n        )}\n      </Breadcrumb>\n    </Wrapper>\n  );\n};\n\nconst Wrapper = styled.span<{ challengeView?: boolean }>`\n  position: absolute;\n  top: ${({ challengeView }) => (challengeView ? -65 : 0)}px;\n  left: 150px;\n  height: 65px;\n  width: calc(100% - 150px - 70px);\n  pointer-events: none;\n\n  display: flex;\n  align-items: center;\n`;\n\nexport default BreadcrumbComponent;\n","import { ApolloError } from \"@apollo/client\";\nimport { CheckIcon, CopyIcon } from \"@chakra-ui/icons\";\nimport {\n  Alert,\n  AlertDescription,\n  AlertIcon,\n  AlertTitle,\n  Box,\n  Flex,\n  IconButton,\n  Input,\n  InputGroup,\n  InputRightElement,\n  Table,\n  TableCaption,\n  Tbody,\n  Td,\n  Th,\n  Thead,\n  Tooltip,\n  Tr,\n} from \"@chakra-ui/react\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport React, { useEffect, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\n\n// const getErrorStatus = (err: ApolloError) => {\n//   const {graphQLErrors} = err;\n//   if (graphQLErrors) {\n//     for (let err of graphQLErrors) {\n//       if(err.extensions?.code) {\n//         switch (err.extensions.code) {\n//           // Apollo Server adjusts code to UNAUTHENTICATED\n//           // when an AuthenticationError is thrown in a resolver\n//           case 'UNAUTHENTICATED':\n//             // Modify the operation context with a new token\n//                   }\n//       }\n//       }\n\n// }\n\nconst Error = ({\n  errorContent,\n  status,\n\n  refreshTimeout,\n  serverConnectionError,\n}: {\n  errorContent?: ApolloError;\n  status?: \"error\" | \"info\" | \"warning\" | \"success\";\n\n  /** Refreshes the page after specified time (in ms) if provided. If serverConnectionError param is true this has a default value of 10 seconds. */\n  refreshTimeout?: number;\n\n  /** Shows friendly looking error about problem with server connection. */\n  serverConnectionError?: boolean;\n}) => {\n  const { t } = useTranslation();\n  const [errorCopied, setErrorCopied] = useState(false);\n\n  useEffect(() => {\n    if (refreshTimeout || serverConnectionError) {\n      const refresh = setTimeout(() => {\n        window.location.reload();\n      }, refreshTimeout || 10000);\n\n      return () => {\n        clearTimeout(refresh);\n      };\n    }\n  }, []);\n\n  return (\n    <Alert\n      status={status ? status : serverConnectionError ? \"info\" : \"error\"}\n      variant=\"subtle\"\n      flexDirection=\"column\"\n      alignItems=\"center\"\n      justifyContent=\"center\"\n      textAlign=\"center\"\n      margin=\"auto\"\n      borderRadius={5}\n      maxWidth=\"700px\"\n    >\n      <AlertIcon boxSize=\"40px\" mr={0} />\n      <AlertTitle mt={4} mb={1} fontSize=\"lg\">\n        {serverConnectionError\n          ? t(\"error.serverConnection.title\")\n          : t(\"error.title\")}\n      </AlertTitle>\n\n      <AlertDescription maxWidth=\"xl\" padding={4} width=\"100%\">\n        {serverConnectionError\n          ? t(\"error.serverConnection.description\")\n          : t(\"error.description\")}\n\n        {errorContent && (\n          <Flex flexDir={\"column\"}>\n            {\n              <Box\n                maxWidth=\"700px\"\n                overflowX=\"auto\"\n                textAlign=\"left\"\n                fontSize={12}\n                marginTop={5}\n              >\n                <Table size=\"sm\">\n                  <TableCaption placement=\"top\">\n                    {t(\"error.serverGraphQLErrors\")}\n                  </TableCaption>\n                  <Thead>\n                    <Tr>\n                      <Th>{t(\"error.code\")}</Th>\n                      <Th>{t(\"error.message\")}</Th>\n                      <Th>{t(\"error.path\")}</Th>\n                    </Tr>\n                  </Thead>\n                  <Tbody>\n                    {errorContent &&\n                      errorContent.graphQLErrors.map((graphQLError, i) => {\n                        return (\n                          <Tr key={i}>\n                            <Td>\n                              {graphQLError.extensions\n                                ? graphQLError.extensions.code\n                                : \"-\"}\n                            </Td>\n                            <Td>\n                              {graphQLError.message\n                                ? graphQLError.message\n                                : \"-\"}\n                            </Td>\n\n                            <Td>\n                              {graphQLError.path\n                                ? graphQLError.path.join(\", \")\n                                : \"-\"}\n                            </Td>\n                          </Tr>\n                        );\n                      })}\n                  </Tbody>\n                </Table>\n              </Box>\n            }\n          </Flex>\n        )}\n\n        {errorContent ? (\n          <InputGroup marginTop={5}>\n            <InputRightElement\n              pointerEvents=\"all\"\n              children={\n                <Tooltip label={t(\"Click to copy\")}>\n                  <IconButton\n                    onClick={() => {\n                      navigator.clipboard.writeText(\n                        JSON.stringify(errorContent)\n                      );\n                      setErrorCopied(true);\n                    }}\n                    size=\"sm\"\n                    aria-label={t(\"copy\")}\n                    icon={\n                      <AnimatePresence exitBeforeEnter>\n                        {errorCopied ? (\n                          <motion.div\n                            key={1}\n                            initial={{ opacity: 0, y: -5 }}\n                            animate={{ opacity: 1, y: 0 }}\n                            exit={{ opacity: 0, y: 5 }}\n                          >\n                            <CheckIcon />\n                          </motion.div>\n                        ) : (\n                          <motion.div\n                            key={2}\n                            initial={{ opacity: 0, y: -5 }}\n                            animate={{ opacity: 1, y: 0 }}\n                            exit={{ opacity: 0, y: 5 }}\n                          >\n                            <CopyIcon />{\" \"}\n                          </motion.div>\n                        )}\n                      </AnimatePresence>\n                    }\n                  />\n                </Tooltip>\n              }\n            />\n\n            <Input\n              width={\"100%\"}\n              maxHeight=\"50px\"\n              overflowY=\"scroll\"\n              textAlign=\"left\"\n              fontSize={12}\n              onFocus={(e) => e.target.select()}\n              value={JSON.stringify(errorContent)}\n              readOnly\n            />\n          </InputGroup>\n        ) : (\n          t(\"error.unknownProblem.description\")\n        )}\n      </AlertDescription>\n    </Alert>\n  );\n};\n\nexport default Error;\n","import { gql } from \"@apollo/client\";\n\nexport const GET_LATEST_SUBMISSION_AND_VALIDATION = gql`\n  query getLatestSubmissionAndValidation(\n    $gameId: String!\n    $exerciseId: String!\n  ) {\n    latestValidation(gameId: $gameId, exerciseId: $exerciseId) {\n      createdAt\n      feedback\n      result\n      outputs\n      language\n      program\n      id\n    }\n    latestSubmission(gameId: $gameId, exerciseId: $exerciseId) {\n      createdAt\n      feedback\n      result\n      language\n      program\n      id\n    }\n  }\n`;\n","import { gql } from \"@apollo/client\";\n\nexport const GET_SUBMISSION_BY_ID = gql`\n  query getSubmissionByIdQuery($gameId: String!, $submissionId: String!) {\n    submission(gameId: $gameId, id: $submissionId) {\n      id\n      feedback\n      program\n    }\n  }\n`;\n","import { gql } from \"@apollo/client\";\n\nexport const GET_VALIDATION_BY_ID = gql`\n  query getValidationByIdQuery($gameId: String!, $validationId: String!) {\n    validation(gameId: $gameId, id: $validationId) {\n      id\n      outputs\n      feedback\n      program\n    }\n  }\n`;\n","import CryptoJS from \"crypto-js\";\nconst salt = \"gj.8@8PS6NeG\";\n\n//The Function Below To Encrypt Text\nexport const encryptWithAES = (text: any, userEmail: string) => {\n  const passphrase = `FGPE_${userEmail}_${salt}`;\n  return CryptoJS.AES.encrypt(text, passphrase).toString();\n};\n//The Function Below To Decrypt Text\nexport const decryptWithAES = (ciphertext: any, userEmail: string) => {\n  const passphrase = `FGPE_${userEmail}_${salt}`;\n  const bytes = CryptoJS.AES.decrypt(ciphertext, passphrase);\n  const originalText = bytes.toString(CryptoJS.enc.Utf8);\n  return originalText;\n};\n","import { gql } from \"@apollo/client\";\n\nexport const GET_CHALLENGES_BY_GAME = gql`\n  query getGameChallenges($gameId: String!) {\n    challenges(gameId: $gameId) {\n      id\n      name\n      hidden\n      refs {\n        id\n        name\n      }\n    }\n  }\n`;\n","import { gql } from \"@apollo/client\";\n\nexport const GET_GAME_PLAYERS = gql`\n  query getGamePlayersQuery($gameId: String!) {\n    game(id: $gameId) {\n      players {\n        group {\n          name\n        }\n\n        id\n\n        user {\n          id\n          firstName\n          lastName\n          email\n          username\n        }\n      }\n    }\n  }\n`;\n","import { gql } from \"@apollo/client\";\n\nexport const GET_PLAYER_FULL_SUBMISSIONS = gql`\n  query getPlayerFullSubmissionsQuery(\n    $gameId: String!\n    $userId: String!\n    $exerciseId: String\n  ) {\n    submissions(gameId: $gameId, userId: $userId, exerciseId: $exerciseId) {\n      id\n      player {\n        id\n      }\n      exerciseId\n      evaluationEngine\n      evaluationEngineId\n      language\n      metrics\n      result\n      feedback\n      submittedAt\n      evaluatedAt\n      program\n      grade\n    }\n  }\n`;\n","import { gql } from \"@apollo/client\";\n\nexport const GET_PLAYER_FULL_VALIDATIONS = gql`\n  query getPlayerFullValidationsQuery(\n    $gameId: String!\n    $userId: String!\n    $exerciseId: String\n  ) {\n    validations(gameId: $gameId, userId: $userId, exerciseId: $exerciseId) {\n      id\n      player {\n        id\n      }\n      exerciseId\n      evaluationEngine\n      evaluationEngineId\n      language\n      metrics\n      feedback\n      submittedAt\n      evaluatedAt\n      program\n      outputs\n      result\n      userExecutionTimes\n    }\n  }\n`;\n","import { gql } from \"@apollo/client\";\n\nexport const GET_PLAYER_REWARDS = gql`\n  query getPlayerRewardsQuery($gameId: String!, $userId: String!) {\n    player(gameId: $gameId, userId: $userId) {\n      id\n      rewards {\n        id\n        reward {\n          id\n          kind\n          name\n          description\n        }\n      }\n    }\n  }\n`;\n","import {\n  DocumentNode,\n  OperationVariables,\n  useApolloClient,\n} from \"@apollo/client\";\nimport {\n  Button,\n  Flex,\n  Modal,\n  ModalBody,\n  ModalCloseButton,\n  ModalContent,\n  ModalFooter,\n  ModalHeader,\n  ModalOverlay,\n  StackDivider,\n  Text,\n  VStack,\n} from \"@chakra-ui/react\";\nimport React, { useEffect, useState } from \"react\";\nimport { CSVLink } from \"react-csv\";\nimport { useTranslation } from \"react-i18next\";\nimport { getGameChallenges } from \"../generated/getGameChallenges\";\nimport {\n  getGamePlayersQuery,\n  getGamePlayersQuery_game_players,\n} from \"../generated/getGamePlayersQuery\";\nimport { getPlayerFullSubmissionsQuery } from \"../generated/getPlayerFullSubmissionsQuery\";\nimport { getPlayerFullValidationsQuery } from \"../generated/getPlayerFullValidationsQuery\";\nimport { getPlayerRewardsQuery } from \"../generated/getPlayerRewardsQuery\";\nimport { GET_CHALLENGES_BY_GAME } from \"../graphql/getChallengesByGame\";\nimport { GET_GAME_PLAYERS } from \"../graphql/getGamePlayers\";\nimport { GET_PLAYER_FULL_SUBMISSIONS } from \"../graphql/getPlayerFullSubmissions\";\nimport { GET_PLAYER_FULL_VALIDATIONS } from \"../graphql/getPlayerFullValidations\";\nimport { GET_PLAYER_REWARDS } from \"../graphql/getPlayerRewards\";\nimport { useNotifications } from \"./Notifications\";\n\nfunction isString(value: any) {\n  return typeof value === \"string\" || value instanceof String;\n}\n\nexport const escapeQuote = (v: any) => {\n  const objectKeys = Object.keys(v);\n\n  for (let i = 0; i < objectKeys.length; i++) {\n    if (isString(v[objectKeys[i]])) {\n      v[objectKeys[i]] = v[objectKeys[i]].replace(/\"/g, '\"\"');\n    }\n  }\n\n  return v;\n};\n\nexport function useLazyQuery<TData = any, TVariables = OperationVariables>(\n  query: DocumentNode\n) {\n  const client = useApolloClient();\n  return React.useCallback(\n    (variables: TVariables) =>\n      client.query<TData, TVariables>({\n        query: query,\n        variables: variables,\n        fetchPolicy: \"no-cache\",\n      }),\n    [client]\n  );\n}\n\nconst preparePlayersForCSV = (\n  players: getGamePlayersQuery_game_players[],\n  gameName: string,\n  gameId: string\n) => {\n  return players.map((player) => {\n    const convertedPlayer: any = {\n      ...player,\n      group: player.group ? player.group.name : \"-\",\n      firstName: player.user.firstName,\n      lastName: player.user.lastName,\n      userId: player.user.id,\n      gameName,\n      gameId,\n      username: player.user.username,\n      email: player.user.email,\n    };\n\n    delete convertedPlayer[\"__typename\"];\n    delete convertedPlayer[\"user\"];\n\n    return convertedPlayer;\n  });\n};\n\nconst ExportGameCsvModal = ({\n  isOpen,\n  onOpen,\n  onClose,\n  gameId,\n  gameName,\n}: {\n  isOpen: boolean;\n  onOpen: () => void;\n  onClose: () => void;\n  gameId: string;\n  gameName: string;\n}) => {\n  const { add: addNotification } = useNotifications();\n\n  const { t } = useTranslation();\n\n  const [readyToDownload, setReadyToDownload] = useState({\n    validations: false,\n    submissions: false,\n    players: false,\n    rewards: false,\n    challenges: false,\n  });\n\n  const [loading, setLoading] = useState({\n    players: false,\n    validations: false,\n    submissions: false,\n    rewards: false,\n    challenges: false,\n  });\n  const [players, setPlayers] = useState<getGamePlayersQuery_game_players[]>();\n  const [playersValidations, setPlayersValidations] = useState<any>([]);\n  const [playersSubmissions, setPlayersSubmissions] = useState<any>([]);\n  const [playersRewards, setPlayersRewards] = useState<any>([]);\n  const [gameChallenges, setGameChallenges] = useState<any[]>([]);\n\n  useEffect(() => {\n    if (!isOpen) {\n      setReadyToDownload({\n        validations: false,\n        submissions: false,\n        players: false,\n        rewards: false,\n        challenges: false,\n      });\n    }\n  }, [isOpen]);\n\n  // const [playerValidationsLoadingState, setPlayerValidationsLoadingState] =\n  //   useState<null | {\n  //     done: number;\n  //     total: number;\n  //   }>();\n\n  // const [playersSubmissionsState, setPlayersSubmissionsState] =\n  //   useState<null | {\n  //     done: number;\n  //     total: number;\n  //   }>();\n\n  const getGameChallenges = useLazyQuery<getGameChallenges>(\n    GET_CHALLENGES_BY_GAME\n  );\n\n  const getUserGameRewards =\n    useLazyQuery<getPlayerRewardsQuery>(GET_PLAYER_REWARDS);\n  const getGamePlayers = useLazyQuery<getGamePlayersQuery>(GET_GAME_PLAYERS);\n  const getPlayerFullValidations = useLazyQuery<getPlayerFullValidationsQuery>(\n    GET_PLAYER_FULL_VALIDATIONS\n  );\n\n  const getPlayerFullSubmissions = useLazyQuery<getPlayerFullSubmissionsQuery>(\n    GET_PLAYER_FULL_SUBMISSIONS\n  );\n\n  const getAllRewards = async () => {\n    setLoading({\n      ...loading,\n      rewards: true,\n    });\n\n    setReadyToDownload({\n      ...readyToDownload,\n      rewards: false,\n    });\n\n    let playersData = players;\n\n    if (!players) {\n      const res = await getGamePlayers({ gameId });\n      setPlayers(res.data.game.players);\n      playersData = res.data.game.players;\n    }\n\n    if (!playersData || playersData.length < 1) {\n      console.log(\" no players\");\n      addNotification({\n        title: t(\"error.noData.title\"),\n        description: t(\"error.noData.description\"),\n        status: \"error\",\n      });\n\n      setLoading({\n        ...loading,\n        rewards: false,\n      });\n\n      setReadyToDownload({ ...readyToDownload, rewards: false });\n      return;\n    }\n\n    let playersRewards1: any = [];\n    let rewardsCount = 0;\n    let causedError = false;\n\n    for (let i = 0; i < playersData.length; i++) {\n      try {\n        const userId = playersData[i].user.id as string;\n\n        const rewards = await getUserGameRewards({\n          gameId,\n          userId,\n        });\n\n        if (rewards.data.player.rewards.length > 0) {\n          rewardsCount++;\n        }\n\n        const rewardsConverted = rewards.data.player.rewards.map((reward) => {\n          return {\n            userId,\n            rewardId: reward.reward.id,\n            rewardDescription: reward.reward.description,\n            rewardKind: reward.reward.kind,\n            rewardName: reward.reward.name,\n            gameName,\n            gameId,\n          };\n        });\n\n        playersRewards1 = [...playersRewards1, ...rewardsConverted];\n      } catch (err) {\n        causedError = true;\n      }\n    }\n\n    if (causedError) {\n      addNotification({\n        title: t(\"error.csvProblemWithOneOrMore.title\"),\n        description: t(\"error.csvProblemWithOneOrMore.description\"),\n        status: \"error\",\n      });\n    }\n\n    if (rewardsCount < 1) {\n      console.log(\"no rewards\");\n\n      addNotification({\n        title: t(\"error.noData.title\"),\n        description: t(\"error.noData.description\"),\n        status: \"error\",\n      });\n\n      setLoading({\n        ...loading,\n        rewards: false,\n      });\n\n      setReadyToDownload({ ...readyToDownload, rewards: false });\n\n      return;\n    }\n\n    setPlayersRewards(playersRewards1);\n\n    setLoading({\n      ...loading,\n      rewards: false,\n    });\n\n    setReadyToDownload({ ...readyToDownload, rewards: true });\n  };\n\n  const getPlayers = async () => {\n    setLoading({\n      ...loading,\n      players: true,\n    });\n\n    setReadyToDownload({\n      ...readyToDownload,\n      players: false,\n    });\n\n    const res = await getGamePlayers({\n      gameId,\n    });\n\n    if (!res.data.game.players) {\n      setReadyToDownload({\n        ...readyToDownload,\n        players: false,\n      });\n      setLoading({\n        ...loading,\n        players: false,\n      });\n      return;\n    }\n\n    console.log(\"PLAYERS\", res.data.game.players);\n    if (res.data.game.players.length < 1) {\n      console.log(\"error no player\");\n      addNotification({\n        title: t(\"error.noData.title\"),\n        description: t(\"error.noData.description\"),\n        status: \"error\",\n      });\n\n      setReadyToDownload({\n        ...readyToDownload,\n        players: false,\n      });\n      setLoading({\n        ...loading,\n        players: false,\n      });\n      return;\n    }\n\n    setPlayers(res.data.game.players);\n\n    setReadyToDownload({\n      ...readyToDownload,\n      players: true,\n    });\n    setLoading({\n      ...loading,\n      players: false,\n    });\n  };\n\n  const getAttempts = async (downloadValidations: boolean) => {\n    if (downloadValidations) {\n      setReadyToDownload({\n        ...readyToDownload,\n        validations: false,\n      });\n    } else {\n      setReadyToDownload({\n        ...readyToDownload,\n        submissions: false,\n      });\n    }\n\n    setLoading({\n      ...loading,\n      submissions: !downloadValidations,\n      validations: downloadValidations,\n    });\n\n    let playersData = players;\n\n    if (!players) {\n      const res = await getGamePlayers({ gameId });\n      setPlayers(res.data.game.players);\n      playersData = res.data.game.players;\n    }\n\n    console.log(\"p data\", playersData);\n    if (!playersData || playersData.length < 1) {\n      console.log(\"error no data\");\n      addNotification({\n        title: t(\"error.noData.title\"),\n        description: t(\"error.noData.description\"),\n        status: \"error\",\n      });\n      if (downloadValidations) {\n        setLoading({\n          ...loading,\n          validations: false,\n        });\n\n        setReadyToDownload({ ...readyToDownload, validations: false });\n      } else {\n        setLoading({\n          ...loading,\n          submissions: false,\n        });\n\n        setReadyToDownload({ ...readyToDownload, submissions: false });\n      }\n      return;\n    }\n\n    let attemptsCount = 0;\n    let playersAttempts: any = [];\n    let causedErrors = false;\n\n    for (let i = 0; i < playersData.length; i++) {\n      try {\n        let userId = playersData[i].user.id as string;\n\n        const res1 = downloadValidations\n          ? await getPlayerFullValidations({\n              userId: userId,\n              gameId,\n            })\n          : await getPlayerFullSubmissions({\n              userId: userId,\n              gameId,\n            });\n\n        if (downloadValidations) {\n          if (\n            (res1.data as getPlayerFullValidationsQuery).validations.length > 0\n          ) {\n            attemptsCount++;\n          }\n\n          console.log(\"attempts\", attemptsCount);\n\n          const convertedValidations = (\n            res1.data as getPlayerFullValidationsQuery\n          ).validations.map((validation) => {\n            let converted: any = { ...validation };\n            delete converted[\"player\"];\n            converted.metrics = JSON.stringify(converted.metrics);\n            converted.player = validation.player.id;\n            converted.outputs = JSON.stringify(converted.outputs);\n            converted.userExecutionTimes = JSON.stringify(\n              converted.userExecutionTimes\n            );\n            converted.gameId = gameId;\n            converted.gameName = gameName;\n            return { ...converted, user: userId };\n          });\n\n          // console.log(\"SETTINGS VALIDATIONS\", [\n          //   ...playersValidations,\n          //   ...convertedValidations,\n          // ]);\n\n          playersAttempts = [...playersAttempts, ...convertedValidations];\n        } else {\n          if (\n            (res1.data as getPlayerFullSubmissionsQuery).submissions.length > 0\n          ) {\n            attemptsCount++;\n          }\n\n          const convertedSubmissions = (\n            res1.data as getPlayerFullSubmissionsQuery\n          ).submissions.map((submission) => {\n            let converted: any = { ...submission };\n            delete converted[\"player\"];\n            converted.metrics = JSON.stringify(converted.metrics);\n            converted.player = submission.player.id;\n            converted.gameId = gameId;\n            converted.gameName = gameName;\n\n            return { ...converted, user: userId };\n          });\n\n          playersAttempts = [...playersAttempts, ...convertedSubmissions];\n        }\n      } catch (err) {\n        causedErrors = true;\n      }\n    }\n\n    if (causedErrors) {\n      addNotification({\n        title: t(\"error.csvProblemWithOneOrMore.title\"),\n        description: t(\"error.csvProblemWithOneOrMore.description\"),\n        status: \"error\",\n      });\n    }\n\n    if (attemptsCount < 1) {\n      addNotification({\n        title: t(\"error.noData.title\"),\n        description: t(\"error.noData.description\"),\n        status: \"error\",\n      });\n\n      if (downloadValidations) {\n        setLoading({\n          ...loading,\n          validations: false,\n        });\n\n        setReadyToDownload({ ...readyToDownload, validations: false });\n      } else {\n        setLoading({\n          ...loading,\n          submissions: false,\n        });\n\n        setReadyToDownload({ ...readyToDownload, submissions: false });\n      }\n\n      return;\n    }\n\n    if (downloadValidations) {\n      setPlayersValidations([...playersAttempts]);\n    } else {\n      setPlayersSubmissions([...playersAttempts]);\n    }\n\n    if (downloadValidations) {\n      setLoading({\n        ...loading,\n        validations: false,\n      });\n\n      console.log(\"settings download reeady\");\n\n      setReadyToDownload({ ...readyToDownload, validations: true });\n    } else {\n      setLoading({\n        ...loading,\n        submissions: false,\n      });\n\n      setReadyToDownload({ ...readyToDownload, submissions: true });\n    }\n\n    // done();\n  };\n\n  const getChallengesForGame = async () => {\n    setLoading({\n      ...loading,\n      challenges: true,\n    });\n\n    setReadyToDownload({\n      ...readyToDownload,\n      challenges: false,\n    });\n\n    const challenges = await getGameChallenges({\n      gameId,\n    });\n\n    if (!challenges) {\n      setLoading({\n        ...loading,\n        challenges: false,\n      });\n    }\n\n    let allExercises: {\n      challengeName: string;\n      challengeId: string;\n      exerciseName: string | null;\n      exerciseId: string | null;\n    }[] = [];\n\n    challenges.data.challenges.forEach((challenge) => {\n      const refs = challenge.refs;\n\n      const refsConverted = refs.map((ref) => {\n        return {\n          challengeName: challenge.name,\n          challengeId: challenge.id,\n          exerciseName: ref.name,\n          exerciseId: ref.id,\n        };\n      });\n\n      allExercises = [...allExercises, ...refsConverted];\n    });\n\n    setGameChallenges(allExercises);\n\n    setReadyToDownload({\n      ...readyToDownload,\n      challenges: true,\n    });\n\n    setLoading({\n      ...loading,\n      challenges: false,\n    });\n  };\n\n  return (\n    <Modal isOpen={isOpen} onClose={onClose}>\n      <ModalOverlay />\n      <ModalContent>\n        <ModalHeader>CSV {t(\"Export\")}</ModalHeader>\n        <ModalCloseButton />\n        <ModalBody>\n          <VStack\n            divider={<StackDivider borderColor=\"gray.500\" />}\n            spacing={1}\n            align=\"stretch\"\n          >\n            <Flex h=\"40px\" justifyContent=\"space-between\" alignItems=\"center\">\n              <Text>{t(\"Game profiles\")}</Text>\n              {/* {gamePlayersData &&\n                !playersLoading &&\n                !playersError &&\n                downloadPlayers && (\n                  <CSVDownload\n                    data={preparePlayersForCSV(gamePlayersData.game.players)}\n                    target=\"_blank\"\n                  />\n                )}\n                */}\n\n              {readyToDownload.players ? (\n                <CSVLink\n                  data={\n                    readyToDownload.players\n                      ? preparePlayersForCSV(\n                          players as getGamePlayersQuery_game_players[],\n                          gameName,\n                          gameId\n                        ).map((v: any) => escapeQuote(v))\n                      : []\n                  }\n                >\n                  <Button size=\"sm\">{t(\"Export\")}</Button>\n                </CSVLink>\n              ) : (\n                <Button\n                  size=\"sm\"\n                  isLoading={loading.players}\n                  onClick={getPlayers}\n                >\n                  {t(\"Download\")}\n                </Button>\n              )}\n            </Flex>\n            <Flex h=\"40px\" justifyContent=\"space-between\" alignItems=\"center\">\n              <Text>{t(\"submissions\")}</Text>\n\n              {readyToDownload.submissions ? (\n                <CSVLink\n                  data={\n                    readyToDownload.submissions\n                      ? playersSubmissions.map((v: any) => escapeQuote(v))\n                      : []\n                  }\n                >\n                  <Button size=\"sm\">{t(\"Export\")}</Button>\n                </CSVLink>\n              ) : (\n                <Button\n                  size=\"sm\"\n                  isLoading={loading.submissions}\n                  onClick={async () => {\n                    try {\n                      await getAttempts(false);\n                    } catch (err) {\n                      addNotification({\n                        title: t(\"error.unknownProblem.title\"),\n                        description: t(\"error.unknownProblem.description\"),\n                        status: \"error\",\n                      });\n\n                      setLoading({ ...loading, submissions: false });\n                    }\n                  }}\n                >\n                  {t(\"Download\")}\n                </Button>\n              )}\n            </Flex>\n            <Flex h=\"40px\" justifyContent=\"space-between\" alignItems=\"center\">\n              <Text>{t(\"validations\")}</Text>\n              {readyToDownload.validations ? (\n                <CSVLink\n                  data={\n                    readyToDownload.validations\n                      ? playersValidations.map((v: any) => escapeQuote(v))\n                      : []\n                  }\n                >\n                  <Button size=\"sm\">{t(\"Export\")}</Button>\n                </CSVLink>\n              ) : (\n                <Button\n                  isLoading={loading.validations}\n                  size=\"sm\"\n                  onClick={async () => {\n                    try {\n                      await getAttempts(true);\n                    } catch (err) {\n                      addNotification({\n                        title: t(\"error.unknownProblem.title\"),\n                        description: t(\"error.unknownProblem.description\"),\n                        status: \"error\",\n                      });\n\n                      setLoading({ ...loading, validations: false });\n                    }\n                  }}\n                >\n                  {t(\"Download\")}\n                </Button>\n              )}\n            </Flex>\n            <Flex h=\"40px\" justifyContent=\"space-between\" alignItems=\"center\">\n              <Text>{t(\"Rewards\")}</Text>\n              {readyToDownload.rewards ? (\n                <CSVLink\n                  data={\n                    readyToDownload.rewards\n                      ? playersRewards.map((v: any) => escapeQuote(v))\n                      : []\n                  }\n                >\n                  <Button size=\"sm\">{t(\"Export\")}</Button>\n                </CSVLink>\n              ) : (\n                <Button\n                  isLoading={loading.rewards}\n                  size=\"sm\"\n                  onClick={async () => {\n                    try {\n                      await getAllRewards();\n                    } catch (err) {\n                      addNotification({\n                        title: t(\"error.unknownProblem.title\"),\n                        description: t(\"error.unknownProblem.description\"),\n                        status: \"error\",\n                      });\n\n                      setLoading({ ...loading, rewards: false });\n                    }\n                  }}\n                >\n                  {t(\"Download\")}\n                </Button>\n              )}\n            </Flex>\n            <Flex h=\"40px\" justifyContent=\"space-between\" alignItems=\"center\">\n              <Text>{t(\"Challenges\")}</Text>\n              {readyToDownload.challenges ? (\n                <CSVLink\n                  data={\n                    readyToDownload.challenges\n                      ? gameChallenges.map((v: any) => escapeQuote(v))\n                      : []\n                  }\n                >\n                  <Button size=\"sm\">{t(\"Export\")}</Button>\n                </CSVLink>\n              ) : (\n                <Button\n                  isLoading={loading.challenges}\n                  size=\"sm\"\n                  onClick={async () => {\n                    try {\n                      await getChallengesForGame();\n                    } catch (err) {\n                      addNotification({\n                        title: t(\"error.unknownProblem.title\"),\n                        description: t(\"error.unknownProblem.description\"),\n                        status: \"error\",\n                      });\n\n                      setLoading({ ...loading, challenges: false });\n                    }\n                  }}\n                >\n                  {t(\"Download\")}\n                </Button>\n              )}\n            </Flex>\n          </VStack>\n        </ModalBody>\n\n        <ModalFooter>\n          <Button colorScheme=\"blue\" mr={3} onClick={onClose}>\n            {t(\"Close\")}\n          </Button>\n        </ModalFooter>\n      </ModalContent>\n    </Modal>\n  );\n};\n\nexport default ExportGameCsvModal;\n","import { FindChallenge_programmingLanguages } from \"../../../generated/FindChallenge\";\nimport Cookies from \"js-cookie\";\n\nconst DEFAULT_PROGRAMMING_LANGUAGE_COOKIE = \"programmingLanguage\";\n\nexport const getDefaultProgrammingLangOrFirstFromArray = (\n  availableProgrammingLanguages: FindChallenge_programmingLanguages[],\n  gameId: string\n) => {\n  const userDefaultLanguageLocalStorage = Cookies.get(\n    DEFAULT_PROGRAMMING_LANGUAGE_COOKIE + gameId\n  );\n\n  if (userDefaultLanguageLocalStorage) {\n    const userDefaultLanguage = JSON.parse(userDefaultLanguageLocalStorage);\n\n    const isAvailable = availableProgrammingLanguages.some(\n      (lang) => lang.id === userDefaultLanguage.id\n    );\n\n    if (isAvailable) {\n      return userDefaultLanguage;\n    } else {\n      return availableProgrammingLanguages[0];\n    }\n  } else {\n    return availableProgrammingLanguages[0];\n  }\n};\n\nexport const setDefaultProgrammingLanguage = (\n  language: FindChallenge_programmingLanguages,\n  gameId: string\n) => {\n  Cookies.set(\n    DEFAULT_PROGRAMMING_LANGUAGE_COOKIE + gameId,\n    JSON.stringify(language),\n    {\n      expires: 30,\n    }\n  );\n};\n","import { Result } from \"../../../generated/globalTypes\";\n\nexport const getColorSchemeForSubmissionResult = (submissionResult: string) => {\n  if (submissionResult === Result.ACCEPT) {\n    return \"green\";\n  }\n  if (submissionResult === Result.ASK_FOR_REEVALUATION) {\n    return \"orange\";\n  }\n\n  return \"red\";\n};\n","export default function isFullMenuAvailable(\n  editorKind: string | undefined | null\n) {\n  switch (editorKind) {\n    case \"FILL_IN_GAPS\":\n      return false;\n    case \"SPOT_BUG\":\n      return false;\n    case \"SORT_BLOCKS\":\n      return false;\n    default:\n      return true;\n  }\n}\n","import React from \"react\";\n\nconst ZoomContext = React.createContext<{\n  zoomFactor: number;\n  setZoomFactor: (value: number) => void;\n}>({\n  zoomFactor: 1,\n  setZoomFactor: (value) => {},\n});\n\nexport default ZoomContext;\n","import React from \"react\";\n\nexport const SettingsContext = React.createContext({\n  editorTheme: \"light\",\n  setEditorTheme: (value: string) => {},\n  terminalTheme: \"light\",\n  terminalFontSize: \"14\",\n  setTerminalFontSize: (value: string) => {},\n  setTerminalTheme: (value: string) => {},\n  isSkulptEnabled: true,\n  setSkulptEnabled: (v: boolean) => {},\n});\n","import {\n  Box,\n  Button,\n  Drawer,\n  DrawerBody,\n  DrawerCloseButton,\n  DrawerContent,\n  DrawerFooter,\n  DrawerHeader,\n  DrawerOverlay,\n  FormControl,\n  FormLabel,\n  Kbd,\n  Select,\n  Stack,\n  Switch,\n  Table,\n  Tbody,\n  Td,\n  Text,\n  Th,\n  Thead,\n  Tr,\n  useColorMode,\n} from \"@chakra-ui/react\";\nimport React, { useContext } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport ZoomContext from \"../../context/ZoomContext\";\nimport { SettingsContext } from \"./SettingsContext\";\n\n// import monacoThemes from \"monaco-themes/themes/themelist.json\";\n\nconst Settings = ({\n  isOpen,\n  onOpen,\n  onClose,\n}: {\n  isOpen: boolean;\n  onOpen: () => void;\n  onClose: () => void;\n}) => {\n  const { t } = useTranslation();\n\n  const { zoomFactor, setZoomFactor } = useContext(ZoomContext);\n  const { colorMode, toggleColorMode } = useColorMode();\n  const {\n    setEditorTheme,\n    editorTheme,\n    setTerminalTheme,\n    terminalTheme,\n    setTerminalFontSize,\n    terminalFontSize,\n    isSkulptEnabled,\n    setSkulptEnabled,\n  } = useContext(SettingsContext);\n\n  const toggleSkulpt = () => {\n    if (isSkulptEnabled) {\n      localStorage.setItem(\"skulpt\", \"false\");\n      setSkulptEnabled(false);\n    } else {\n      localStorage.setItem(\"skulpt\", \"true\");\n      setSkulptEnabled(true);\n    }\n  };\n\n  const changeEditorTheme = (newTheme: string) => {\n    setEditorTheme(newTheme);\n    localStorage.setItem(\"editorTheme\", newTheme);\n  };\n\n  const changeTerminalTheme = (newTheme: string) => {\n    setTerminalTheme(newTheme);\n    localStorage.setItem(\"terminalTheme\", newTheme);\n  };\n\n  const changeTerminalFontSize = (newSize: string) => {\n    setTerminalFontSize(newSize);\n    localStorage.setItem(\"terminalFontSize\", newSize);\n  };\n\n  return (\n    <Drawer isOpen={isOpen} placement=\"right\" onClose={onClose}>\n      <DrawerOverlay>\n        <DrawerContent>\n          <DrawerCloseButton />\n          <DrawerHeader>Settings</DrawerHeader>\n\n          <DrawerBody>\n            <Stack spacing=\"24px\">\n              <FormControl display=\"flex\" alignItems=\"center\" w=\"100%\">\n                <FormLabel htmlFor=\"dark-mode\" mb=\"0\">\n                  {t(\"settings.darkMode\")}\n                </FormLabel>\n                <Switch\n                  id=\"dark-mode\"\n                  isChecked={colorMode === \"dark\"}\n                  onChange={toggleColorMode}\n                />\n              </FormControl>\n\n              <FormControl display=\"flex\" flexDirection=\"column\" w=\"100%\">\n                <FormLabel mb=\"0\">{t(\"settings.editorTheme\")}</FormLabel>\n                <Select\n                  value={editorTheme}\n                  onChange={(e) => changeEditorTheme(e.target.value)}\n                >\n                  {[\"vs-dark\", \"light\"].map((theme, i) => (\n                    <option value={theme} key={i}>\n                      {theme}\n                    </option>\n                  ))}\n                  {/* {Object.entries(monacoThemes).map(([themeId, themeName]) => (\n                    <option value={themeId} key={themeId}>\n                      {themeName}\n                    </option>\n                  ))} */}\n                </Select>\n              </FormControl>\n\n              <FormControl display=\"flex\" flexDirection=\"column\" w=\"100%\">\n                <FormLabel mb=\"0\">{t(\"settings.terminalTheme\")}</FormLabel>\n                <Select\n                  value={terminalTheme}\n                  onChange={(e) => changeTerminalTheme(e.target.value)}\n                >\n                  <option value=\"light\">Light</option>\n                  <option value=\"dark\">Dark</option>\n                </Select>\n              </FormControl>\n\n              <FormControl display=\"flex\" flexDirection=\"column\" w=\"100%\">\n                <FormLabel mb=\"0\">{t(\"settings.platformZoom\")}</FormLabel>\n                <Select\n                  value={zoomFactor}\n                  onChange={(e) => {\n                    localStorage.setItem(\"zoom\", e.target.value);\n                    setZoomFactor(Number(e.target.value));\n                  }}\n                >\n                  {[0.85, 0.9, 0.95, 1, 1.05, 1.1, 1.15, 1.2, 1.25].map(\n                    (item, i) => {\n                      return (\n                        <option key={i} value={item}>\n                          {(item * 100).toFixed(0)}%\n                        </option>\n                      );\n                    }\n                  )}\n                </Select>\n              </FormControl>\n\n              <FormControl display=\"flex\" flexDirection=\"column\" w=\"100%\">\n                <FormLabel mb=\"0\">{t(\"settings.terminalFontSize\")}</FormLabel>\n                <Select\n                  value={terminalFontSize}\n                  onChange={(e) => changeTerminalFontSize(e.target.value)}\n                >\n                  {[13, 14, 15, 16, 17, 18].map((item, i) => {\n                    return (\n                      <option key={i} value={item}>\n                        {item}\n                      </option>\n                    );\n                  })}\n                </Select>\n                <Text fontSize=\"xs\">{t(\"settings.editorMenuTip\")}</Text>\n              </FormControl>\n\n              <Box>\n                {/* <Heading as=\"h2\" size=\"sm\">\n                  Keyboard shortcuts:\n                </Heading> */}\n                <Box>\n                  <Table variant=\"simple\" size=\"sm\">\n                    <Thead>\n                      <Tr>\n                        <Th>{t(\"settings.keyCombination\")}</Th>\n                        <Th>{t(\"settings.action\")}</Th>\n                      </Tr>\n                    </Thead>\n                    <Tbody>\n                      <Tr>\n                        <Td>\n                          <Kbd>ctrl</Kbd> + <Kbd>enter</Kbd>\n                        </Td>\n                        <Td>{t(\"playground.menu.run\")}</Td>\n                      </Tr>\n                      <Tr>\n                        <Td>\n                          <Kbd>ctrl</Kbd> + <Kbd>\\</Kbd>\n                        </Td>\n                        <Td>{t(\"playground.menu.submit\")}</Td>\n                      </Tr>\n                      <Tr>\n                        <Td>\n                          <Kbd>ctrl</Kbd> + <Kbd>m</Kbd>\n                        </Td>\n                        <Td>{t(\"playground.menu.reload\")}</Td>\n                      </Tr>\n                      <Tr>\n                        <Td>\n                          <Kbd>ctrl</Kbd> + <Kbd>,</Kbd>\n                        </Td>\n                        <Td>{t(\"playground.menu.restore\")}</Td>\n                      </Tr>\n                      <Tr>\n                        <Td>\n                          <Kbd>F1</Kbd>{\" \"}\n                          <Text as=\"span\" fontSize={11}>\n                            {t(\"settings.inEditor\")}\n                          </Text>\n                        </Td>\n                        <Td>{t(\"settings.editorMenu\")}</Td>\n                      </Tr>\n                    </Tbody>\n                  </Table>\n                </Box>\n              </Box>\n\n              <FormControl display=\"flex\" alignItems=\"center\" w=\"100%\">\n                <FormLabel htmlFor=\"dark-mode\" mb=\"0\">\n                  Skulpt (Python)\n                </FormLabel>\n                <Switch\n                  id=\"skulpt-on-off\"\n                  isChecked={isSkulptEnabled}\n                  onChange={toggleSkulpt}\n                />\n              </FormControl>\n            </Stack>\n          </DrawerBody>\n\n          <DrawerFooter>\n            <Button variant=\"outline\" mr={3} onClick={onClose}>\n              {t(\"Cancel\")}\n            </Button>\n            {/* <Button color=\"blue\">Save</Button> */}\n          </DrawerFooter>\n        </DrawerContent>\n      </DrawerOverlay>\n    </Drawer>\n  );\n};\n\nexport default Settings;\n","import { CloseIcon } from \"@chakra-ui/icons\";\nimport {\n  Button,\n  Flex,\n  IconButton,\n  Modal,\n  ModalBody,\n  ModalCloseButton,\n  ModalContent,\n  ModalFooter,\n  ModalHeader,\n  ModalOverlay,\n  Textarea,\n} from \"@chakra-ui/react\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport React from \"react\";\nimport { useTranslation } from \"react-i18next\";\n\nconst TextareaWithButton = ({\n  value,\n  changeValue,\n  remove,\n}: {\n  value: string;\n  changeValue: (value: string) => void;\n  remove: () => void;\n}) => {\n  const { t } = useTranslation();\n\n  return (\n    <AnimatePresence>\n      <motion.div\n        initial={{ opacity: 0, y: -100 }}\n        animate={{ opacity: 1, y: 0 }}\n        exit={{ opacity: 0, y: 100 }}\n      >\n        <Flex alignItems=\"center\" marginBottom={2}>\n          <Textarea\n            value={value}\n            onChange={(e) => {\n              changeValue(e.target.value);\n            }}\n            w=\"90%\"\n            placeholder={t(\"placeholders.provideTestValues\")}\n          />\n\n          <IconButton\n            icon={<CloseIcon />}\n            aria-label=\"remove\"\n            w=\"10%\"\n            marginLeft={2}\n            float=\"right\"\n            variant=\"outline\"\n            onClick={remove}\n          />\n        </Flex>\n      </motion.div>\n    </AnimatePresence>\n  );\n};\n\nconst TextareaModal = ({\n  isOpen,\n  onClose,\n  testValues,\n  setTestValues,\n}: {\n  isOpen: boolean;\n  onClose: () => void;\n  testValues: string[];\n  setTestValues: React.Dispatch<React.SetStateAction<string[]>>;\n}) => {\n  const { t } = useTranslation();\n\n  return (\n    <Modal isOpen={isOpen} onClose={onClose}>\n      <ModalOverlay />\n      <ModalContent>\n        <ModalHeader>{t(\"Provide test values\")}</ModalHeader>\n        <ModalCloseButton />\n        <ModalBody>\n          <Textarea\n            value={testValues[0]}\n            onChange={(e) => {\n              let newTestValues = [...testValues];\n              newTestValues[0] = e.target.value;\n              setTestValues(newTestValues);\n            }}\n            placeholder={t(\"placeholders.provideTestValues\")}\n          />\n          {testValues\n            .filter((item, i) => i !== 0)\n            .map((item, i) => {\n              i = i + 1;\n              return (\n                <TextareaWithButton\n                  key={i}\n                  value={item}\n                  changeValue={(value) => {\n                    let newTestValues = [...testValues];\n                    newTestValues[i] = value;\n                    setTestValues(newTestValues);\n                  }}\n                  remove={() => {\n                    let newTestValues = [...testValues];\n                    newTestValues.splice(i, 1);\n\n                    setTestValues(newTestValues);\n                  }}\n                />\n              );\n            })}\n        </ModalBody>\n\n        <ModalFooter>\n          <Button\n            variant=\"outline\"\n            mr={3}\n            colorScheme=\"gray\"\n            onClick={() => setTestValues([...testValues, \"\"])}\n          >\n            {t(\"Add more\")}\n          </Button>\n          <Button colorScheme=\"gray\" onClick={onClose}>\n            {t(\"Close\")}\n          </Button>\n        </ModalFooter>\n      </ModalContent>\n    </Modal>\n  );\n};\n\nexport default TextareaModal;\n","import {\n  ArrowRightIcon,\n  ChevronDownIcon,\n  ChevronRightIcon,\n  SettingsIcon,\n} from \"@chakra-ui/icons\";\nimport {\n  Badge,\n  Box,\n  Button,\n  ButtonGroup,\n  Center,\n  Flex,\n  IconButton,\n  Menu,\n  MenuButton,\n  MenuItem,\n  MenuList,\n  Spinner,\n  Tooltip,\n  useColorMode,\n  useDisclosure,\n} from \"@chakra-ui/react\";\nimport React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { BiLink, BiUnlink } from \"react-icons/bi\";\nimport { BsLayoutSidebarInset } from \"react-icons/bs\";\nimport { IoExitOutline } from \"react-icons/io5\";\nimport { FindChallenge_programmingLanguages } from \"../../generated/FindChallenge\";\nimport { Result } from \"../../generated/globalTypes\";\nimport { setDefaultProgrammingLanguage } from \"./helpers/defaultProgrammingLanguage\";\nimport { getColorSchemeForSubmissionResult } from \"./helpers/EditorMenu\";\nimport isFullMenuAvailable from \"./helpers/isFullMenuAvailable\";\nimport Settings from \"./Settings\";\n// import { useHotkeys } from \"react-hotkeys-hook\";\nimport TextareaModal from \"./TextareaModal\";\n\nconst EditorMenu = ({\n  submissionResult,\n  activeLanguage,\n  evaluateSubmission,\n  validateSubmission,\n  isEvaluationFetching: isWaitingForEvaluationResult,\n  setSideMenuOpen,\n  setSubmissionFetching: setIsWaitingForEvaluationResult,\n  setActiveLanguage,\n  programmingLanguages,\n  isValidationFetching: isWaitingForValidationResult,\n  setValidationFetching: setIsWaitingForValidationResult,\n  testValues,\n  setTestValues,\n  solved,\n  setNextUnsolvedExercise,\n  connectionError,\n  restore,\n  isRestoreAvailable,\n  reload,\n  editorKind,\n  gameId,\n  setStopExecution,\n}: {\n  setSideMenuOpen: () => void;\n  editorKind: string | undefined | null;\n  submissionResult: string | null;\n  activeLanguage: FindChallenge_programmingLanguages;\n  evaluateSubmission: (isSpotBug?: boolean) => void;\n  validateSubmission: () => void;\n  isEvaluationFetching: boolean;\n  setSubmissionFetching: React.Dispatch<React.SetStateAction<boolean>>;\n  setValidationFetching: React.Dispatch<React.SetStateAction<boolean>>;\n  setActiveLanguage: React.Dispatch<\n    React.SetStateAction<FindChallenge_programmingLanguages>\n  >;\n  programmingLanguages: FindChallenge_programmingLanguages[];\n  isValidationFetching: boolean;\n  testValues: string[];\n  setTestValues: React.Dispatch<React.SetStateAction<string[]>>;\n  solved: boolean;\n  setNextUnsolvedExercise: () => void;\n  connectionError: any;\n  restore: () => void;\n  reload: () => void;\n  isRestoreAvailable: boolean;\n  gameId: string;\n  setStopExecution: (v: boolean) => void;\n}) => {\n  const { t } = useTranslation();\n\n  const {\n    isOpen: isSettingsOpen,\n    onOpen: openSettings,\n    onClose: closeSettings,\n  } = useDisclosure();\n\n  const {\n    isOpen: isTextareaModalOpen,\n    onOpen: openTextareaModal,\n    onClose: closeTextareaModal,\n  } = useDisclosure();\n\n  const { colorMode } = useColorMode();\n  // useHotkeys(\"ctrl+\\\\\", evaluateSubmission);\n\n  return (\n    <>\n      <Settings\n        isOpen={isSettingsOpen}\n        onOpen={openSettings}\n        onClose={closeSettings}\n      />\n      <TextareaModal\n        isOpen={isTextareaModalOpen}\n        onClose={closeTextareaModal}\n        testValues={testValues}\n        setTestValues={setTestValues}\n      />\n      <Flex\n        height={{ base: 144, md: 50 }}\n        minHeight={50}\n        backgroundColor={colorMode === \"dark\" ? \"#1c232f\" : \"gray.50\"}\n        alignItems=\"center\"\n        justifyContent=\"center\"\n        p={2}\n        flexDirection={{ base: \"column\", md: \"row\" }}\n      >\n        <Box\n          width={{ base: \"100%\", md: 7 / 12 }}\n          height={{ base: \"50%\", md: \"auto\" }}\n          marginBottom={{ base: 4, md: 0 }}\n        >\n          <Flex\n            width={\"100%\"}\n            height=\"100%\"\n            flexDir={{ base: \"column\", md: \"row\" }}\n            justifyContent=\"center\"\n            alignItems=\"center\"\n          >\n            <Flex\n              width={{ base: \"100%\", md: \"70%\", lg: \"70%\" }}\n              marginRight={0.5}\n              marginBottom={{ base: 2, md: 0 }}\n            >\n              <Center width={1 / 3}>\n                <Menu>\n                  {({ isOpen }) => (\n                    <>\n                      <MenuButton\n                        size=\"sm\"\n                        isActive={isOpen}\n                        as={Button}\n                        w=\"95%\"\n                        rightIcon={<ChevronDownIcon />}\n                        fontSize={12}\n                      >\n                        {activeLanguage.name}\n                      </MenuButton>\n                      <MenuList>\n                        {programmingLanguages.map((language, i) => (\n                          <MenuItem\n                            key={i}\n                            onClick={() => {\n                              setDefaultProgrammingLanguage(language, gameId);\n                              setActiveLanguage(language);\n                            }}\n                          >\n                            {language.name}\n                          </MenuItem>\n                        ))}\n                      </MenuList>\n                    </>\n                  )}\n                </Menu>\n              </Center>\n\n              {isFullMenuAvailable(editorKind) && (\n                <Center width={1 / 3}>\n                  <ButtonGroup size=\"sm\" isAttached w=\"95%\" colorScheme=\"blue\">\n                    <Button\n                      onClick={() => {\n                        if (isWaitingForValidationResult) {\n                          console.log(\"stopping...\");\n                          setStopExecution(true);\n                          setIsWaitingForValidationResult(false);\n                        } else {\n                          setStopExecution(false);\n                          validateSubmission();\n                        }\n                      }}\n                      w=\"95%\"\n                      isLoading={isWaitingForValidationResult}\n                      loadingText={\n                        activeLanguage.name === \"Python 3\" ? \"Stop\" : undefined\n                      }\n                      disabled={\n                        (isWaitingForEvaluationResult ||\n                          isWaitingForValidationResult) &&\n                        activeLanguage.name !== \"Python 3\"\n                      }\n                      fontSize={{ base: 12, lg: 14 }}\n                      whiteSpace=\"normal\"\n                    >\n                      {t(\"playground.menu.run\")}\n                    </Button>\n                    <Tooltip\n                      label={t(\"playground.menu.addTestValues\")}\n                      aria-label=\"A tooltip\"\n                      bg=\"gray.300\"\n                      color=\"black\"\n                      hasArrow\n                      openDelay={500}\n                      visibility={isTextareaModalOpen ? \"hidden\" : \"initial\"}\n                    >\n                      <IconButton\n                        color={colorMode === \"dark\" ? \"black\" : \"white\"}\n                        bgColor={colorMode === \"dark\" ? \"gray.500\" : \"gray.800\"}\n                        onClick={openTextareaModal}\n                        aria-label=\"Open\"\n                        icon={<IoExitOutline fontSize={18} />}\n                        disabled={\n                          isWaitingForEvaluationResult ||\n                          isWaitingForValidationResult\n                        }\n                      />\n                    </Tooltip>\n                  </ButtonGroup>\n                </Center>\n              )}\n\n              <Center width={1 / 3}>\n                <Button\n                  colorScheme=\"blue\"\n                  onClick={() => {\n                    if (isWaitingForEvaluationResult) {\n                      setIsWaitingForEvaluationResult(false);\n                    } else {\n                      if (editorKind === \"SPOT_BUG\") {\n                        evaluateSubmission(true);\n                      } else {\n                        evaluateSubmission();\n                      }\n                    }\n                  }}\n                  w=\"95%\"\n                  size=\"sm\"\n                  isLoading={isWaitingForEvaluationResult}\n                  // loadingText={\"Stop\"}\n                  disabled={\n                    isWaitingForEvaluationResult || isWaitingForValidationResult\n                  }\n                  fontSize={{ base: 12, lg: 14 }}\n                  whiteSpace=\"normal\"\n                >\n                  {t(\"playground.menu.submit\")}\n                </Button>\n              </Center>\n            </Flex>\n\n            <Flex\n              width={{ base: \"100%\", md: \"30%\", lg: \"20%\" }}\n              justifyContent={{ base: \"center\", md: \"initial\" }}\n              marginRight={4}\n            >\n              <Center width={1 / 3} display={{ md: \"none\" }} marginLeft={3}>\n                <IconButton\n                  onClick={setSideMenuOpen}\n                  size=\"lg\"\n                  w=\"95%\"\n                  height=\"100%\"\n                  aria-label=\"Settings\"\n                  icon={\n                    <Flex justifyContent=\"center\" alignItems=\"center\">\n                      <BsLayoutSidebarInset />\n                      <ChevronRightIcon h={6} w={6} />\n                    </Flex>\n                  }\n                  variant=\"outline\"\n                />\n              </Center>\n              {isFullMenuAvailable(editorKind) && (\n                <Center w=\"100%\">\n                  <Menu>\n                    {({ isOpen }) => (\n                      <>\n                        <MenuButton\n                          colorScheme=\"teal\"\n                          size=\"sm\"\n                          isActive={isOpen}\n                          as={Button}\n                          w=\"95%\"\n                          rightIcon={<ChevronDownIcon />}\n                          fontSize={12}\n                        >\n                          {t(\"Actions\")}\n                        </MenuButton>\n                        <MenuList>\n                          <MenuItem onClick={reload}>\n                            {t(\"playground.menu.reload\")}\n                          </MenuItem>\n                          <MenuItem\n                            onClick={() => {\n                              if (isRestoreAvailable) {\n                                restore();\n                              }\n                            }}\n                            isDisabled={!isRestoreAvailable}\n                            cursor={\n                              isRestoreAvailable ? \"pointer\" : \"not-allowed\"\n                            }\n                          >\n                            {t(\"playground.menu.restore\")}\n                          </MenuItem>\n                        </MenuList>\n                      </>\n                    )}\n                  </Menu>\n                </Center>\n              )}\n              {/* {isFullMenuAvailable(editorKind) && (\n                <>\n                  <Center\n                    width={{ base: 1 / 4 + 1 / 8 / 3, md: (1 / 3) * 1.2 }}\n                  >\n                    <Button\n                      colorScheme=\"teal\"\n                      size=\"sm\"\n                      w=\"95%\"\n                      fontSize={{ base: 12, lg: 14 }}\n                      onClick={reload}\n                    >\n                      {t(\"playground.menu.reload\")}\n                    </Button>\n                  </Center>\n                  <Center\n                    width={{ base: 1 / 4 + 1 / 8 / 3, md: (1 / 3) * 1.2 }}\n                  >\n                    <Button\n                      colorScheme=\"teal\"\n                      size=\"sm\"\n                      w=\"95%\"\n                      fontSize={{ base: 12, lg: 14 }}\n                      onClick={restore}\n                      disabled={!isRestoreAvailable}\n                    >\n                      {t(\"playground.menu.restore\")}\n                    </Button>\n                  </Center>\n                </>\n              )} */}\n\n              <Center\n                width={{ base: 1 / 4 + 1 / 8 / 3, md: 1 / 3 }}\n                marginLeft={1}\n              >\n                <IconButton\n                  onClick={openSettings}\n                  size=\"sm\"\n                  w=\"95%\"\n                  aria-label=\"Settings\"\n                  icon={<SettingsIcon />}\n                  variant=\"outline\"\n                />\n              </Center>\n            </Flex>\n          </Flex>\n        </Box>\n        <Center\n          width={{ base: \"100%\", md: 5 / 12 }}\n          height={{ base: \"50%\", md: \"auto\" }}\n          borderTop={{ base: \"1px solid rgba(0,0,0,0.1)\", md: \"none\" }}\n          marginTop={{ base: 1, md: \"0\" }}\n          paddingTop={{ base: 2, md: \"0\" }}\n        >\n          <Flex w=\"100%\" alignItems=\"center\" justifyContent=\"center\">\n            <Box width={3 / 4} textAlign=\"left\">\n              {t(\"playground.menu.status.status\")}:\n              {submissionResult ? (\n                <Badge\n                  m={1}\n                  colorScheme={getColorSchemeForSubmissionResult(\n                    submissionResult\n                  )}\n                  textOverflow=\"ellipsis\"\n                  overflow=\"hidden\"\n                  whiteSpace=\"nowrap\"\n                  maxW=\"calc(100% - 100px)\"\n                >\n                  {connectionError\n                    ? t(\"playground.menu.status.CONNECTION_PROBLEM\")\n                    : t(`playground.menu.status.${submissionResult}`)}\n                </Badge>\n              ) : isWaitingForValidationResult ||\n                isWaitingForEvaluationResult ? (\n                <Spinner marginRight={3} marginLeft={3} size=\"xs\" />\n              ) : (\n                <Badge m={1} colorScheme={connectionError ? \"red\" : \"green\"}>\n                  {connectionError\n                    ? t(\"playground.menu.status.CONNECTION_PROBLEM\")\n                    : t(\"playground.menu.status.READY\")}\n                </Badge>\n              )}\n              <Tooltip\n                label={\n                  connectionError\n                    ? t(\"playground.menu.connection.error\")\n                    : t(\"playground.menu.connection.success\")\n                }\n                aria-label=\"A tooltip\"\n                bg=\"gray.300\"\n                color=\"black\"\n                hasArrow\n              >\n                <Badge\n                  colorScheme={connectionError ? \"red\" : \"green\"}\n                  variant=\"solid\"\n                >\n                  {connectionError ? (\n                    <BiUnlink fontSize={18} />\n                  ) : (\n                    <BiLink fontSize={18} />\n                  )}\n                </Badge>\n              </Tooltip>\n            </Box>\n            <Box width={1 / 4} alignItems=\"center\" justifyContent=\"center\">\n              <Button\n                colorScheme={solved ? \"green\" : \"gray\"}\n                size=\"sm\"\n                w=\"95%\"\n                fontSize={{ base: 12, lg: 14 }}\n                onClick={setNextUnsolvedExercise}\n              >\n                {t(\"playground.menu.next\")}\n              </Button>\n            </Box>\n          </Flex>\n        </Center>\n      </Flex>\n    </>\n  );\n};\n\nexport default EditorMenu;\n","import { useEffect } from \"react\";\n\nconst useHotKeys = ({\n  evaluateSubmission,\n  validateSubmission,\n}: {\n  evaluateSubmission: () => void;\n  validateSubmission: () => void;\n}) => {\n  useEffect(() => {\n    document.addEventListener(\"keydown\", (e) => {\n      if (\n        (e.metaKey || e.ctrlKey) &&\n        (e.code === \"Backslash\" || e.code === \"backslash\")\n      ) {\n        console.log(\"evaluate\");\n        evaluateSubmission();\n        return;\n      }\n\n      if (\n        (e.metaKey || e.ctrlKey) &&\n        (e.code === \"Enter\" || e.code === \"enter\")\n      ) {\n        console.log(\"validate\");\n\n        validateSubmission();\n        return;\n      }\n\n      if ((e.metaKey || e.ctrlKey) && e.code === \"KeyM\") {\n        // validateSubmission();\n        return;\n      }\n\n      if ((e.metaKey || e.ctrlKey) && e.code === \"Comma\") {\n        // validateSubmission();\n        return;\n      }\n    });\n  }, []);\n\n  return null;\n};\n\nexport default useHotKeys;\n","import styled from \"@emotion/styled\";\nimport Editor, { useMonaco } from \"@monaco-editor/react\";\nimport React, { useContext, useEffect, useRef } from \"react\";\nimport { FindChallenge_programmingLanguages } from \"../generated/FindChallenge\";\nimport { SettingsContext } from \"./Exercise/SettingsContext\";\n// import { useHotkeys } from \"react-hotkeys-hook\";\nimport useHotKeys from \"./Exercise/useHotKeys\";\n\nexport interface CodeEditorProps {\n  language: FindChallenge_programmingLanguages;\n  code: any;\n  setCode: (value: string) => void;\n  evaluateSubmission: () => void;\n  validateSubmission: () => void;\n}\n\nconst CodeEditor = ({\n  language,\n  setCode,\n  code,\n  evaluateSubmission,\n  validateSubmission,\n}: CodeEditorProps) => {\n  const hotkeys = useHotKeys({ validateSubmission, evaluateSubmission });\n\n  const { editorTheme } = useContext(SettingsContext);\n\n  const editorRef = useRef({\n    _actions: { submitYourCode: {}, runYourCode: {} },\n    addAction: (x: any) => {},\n  });\n  const monaco = useMonaco();\n\n  function handleEditorDidMount(editor: any) {\n    // here is the editor instance\n    // you can store it in `useRef` for further usage\n    // console.log(\"editor\", editor);\n    editorRef.current = editor;\n\n    editor.addAction({\n      // An unique identifier of the contributed action.\n      id: \"runYourCode\",\n      // A label of the action that will be presented to the user.\n      label: \"Run your code\",\n      // An optional array of keybindings for the action.\n      keybindings: [monaco.KeyMod.CtrlCmd | monaco.KeyCode.Enter],\n      // A precondition for this action.\n      precondition: null,\n      // A rule to evaluate on top of the precondition in order to dispatch the keybindings.\n      keybindingContext: null,\n      contextMenuGroupId: \"navigation\",\n      contextMenuOrder: 1.5,\n      // Method that will be executed when the action is triggered.\n      // @param editor The editor instance is passed in as a convinience\n      run: function (ed: any) {\n        // console.log(\"VALIDATE\");\n        validateSubmission();\n        return null;\n      },\n    });\n\n    editorRef.current.addAction({\n      id: \"submitYourCode\",\n      label: \"Submit your code\",\n      keybindings: [monaco.KeyMod.CtrlCmd | monaco.KeyCode.US_BACKSLASH],\n      precondition: null,\n      keybindingContext: null,\n      contextMenuGroupId: \"navigation\",\n      contextMenuOrder: 1.5,\n      run: function (ed: any) {\n        // console.log(\"EVALUATE\");\n        evaluateSubmission();\n        return null;\n      },\n    });\n  }\n\n  useEffect(() => {\n    if (monaco && editorRef.current) {\n      editorRef.current.addAction({\n        // An unique identifier of the contributed action.\n        id: \"runYourCode\",\n        // A label of the action that will be presented to the user.\n        label: \"Run your code\",\n        // An optional array of keybindings for the action.\n        keybindings: [monaco.KeyMod.CtrlCmd | monaco.KeyCode.Enter],\n        // A precondition for this action.\n        precondition: null,\n        // A rule to evaluate on top of the precondition in order to dispatch the keybindings.\n        keybindingContext: null,\n        contextMenuGroupId: \"navigation\",\n        contextMenuOrder: 1.5,\n        // Method that will be executed when the action is triggered.\n        // @param editor The editor instance is passed in as a convinience\n        run: function (ed: any) {\n          // console.log(\"VALIDATE\");\n          validateSubmission();\n          return null;\n        },\n      });\n      // }\n\n      if (!editorRef.current._actions.runYourCode) {\n        editorRef.current.addAction({\n          id: \"submitYourCode\",\n          label: \"Submit your code\",\n          keybindings: [monaco.KeyMod.CtrlCmd | monaco.KeyCode.US_BACKSLASH],\n          precondition: null,\n          keybindingContext: null,\n          contextMenuGroupId: \"navigation\",\n          contextMenuOrder: 1.5,\n          run: function (ed: any) {\n            // console.log(\"EVALUATE\");\n            evaluateSubmission();\n            return null;\n          },\n        });\n      }\n    }\n  }, [monaco, editorRef, language]);\n\n  function handleEditorChange(value: any, event: any) {\n    setCode(value);\n    // console.log(\"here is the current model value:\", value);\n  }\n\n  if (!monaco) {\n    return <EditorStyled>Loading...</EditorStyled>;\n  }\n\n  return (\n    <EditorStyled>\n      <Editor\n        onMount={handleEditorDidMount}\n        language={language.id?.toLowerCase()}\n        value={code}\n        onChange={handleEditorChange}\n        theme={editorTheme}\n        wrapperClassName=\"editor-wrapper\"\n        className=\"editor\"\n        options={{\n          fixedOverflowWidgets: true,\n          wordWrap: \"on\",\n          minimap: {\n            enabled: false,\n          },\n        }}\n      />\n    </EditorStyled>\n  );\n};\n\nconst EditorStyled = styled.div`\n  /* border-radius: 5px;\n  height: 100%;\n  textarea:focus {\n    outline: none;\n  } */\n\n  height: 100%;\n  border-top: 1px solid rgba(0, 0, 0, 0.1);\n`;\n\nexport default CodeEditor;\n","import { Box, Input, useColorMode } from \"@chakra-ui/react\";\nimport SyntaxHighlighter from \"react-syntax-highlighter\";\nimport { FindChallenge_programmingLanguages } from \"../../../generated/FindChallenge\";\n\nimport {\n  docco,\n  atomOneDark,\n} from \"react-syntax-highlighter/dist/esm/styles/hljs\";\nimport { useState } from \"react\";\n\nconst FillInGapsEditor = ({\n  skeleton,\n  language,\n  setCode,\n}: {\n  skeleton: string;\n  language: FindChallenge_programmingLanguages;\n  setCode: (code: string) => void;\n}) => {\n  const { colorMode } = useColorMode();\n  const [inputsValues, setInputsValues] = useState<string[]>([]);\n  const gapsLength = skeleton ? skeleton.split(\"{{gap}}\").length - 1 : 0;\n\n  const onChange = (code: string, index: number) => {\n    console.log(\"code\", code);\n    let newCode = \"\";\n    const splitted = skeleton.split(\"{{gap}}\");\n\n    for (let i = 0; i < gapsLength; i++) {\n      if (i === index) {\n        newCode = splitted[i] + code;\n      } else {\n        newCode = splitted[i] + inputsValues[i];\n      }\n    }\n\n    newCode = newCode + splitted[splitted.length - 1];\n\n    setCode(newCode);\n  };\n\n  return (\n    <>\n      <Box width=\"100%\" height=\"100%\">\n        {skeleton &&\n          skeleton.split(\"{{gap}}\").map((line, i) => {\n            return (\n              <span key={i}>\n                <SyntaxHighlighter\n                  wrapLines\n                  wrapLongLines\n                  customStyle={{\n                    fontSize: \"14px\",\n                    display: \"inline\",\n                    background: \"none\",\n                    // minHeight: \"200px\",\n                  }}\n                  language={language.id ? language.id.toLowerCase() : \"plain\"}\n                  style={colorMode === \"dark\" ? atomOneDark : docco}\n                >\n                  {line.replaceAll(\"\\n\", \"\\n \")}\n                </SyntaxHighlighter>\n                {i < gapsLength && (\n                  <Input\n                    value={inputsValues[gapsLength - 1 - i] || \"\"}\n                    onChange={(e) => {\n                      let newValues = [...inputsValues];\n                      newValues[gapsLength - 1 - i] = e.target.value;\n                      setInputsValues(newValues);\n                      onChange(e.target.value, gapsLength - 1 - i);\n                    }}\n                    fontSize={14}\n                    display=\"inline-block\"\n                    maxW={50}\n                    maxH={30}\n                    padding={1}\n                    textAlign=\"center\"\n                  />\n                )}\n              </span>\n            );\n          })}\n      </Box>\n    </>\n  );\n};\n\nexport default FillInGapsEditor;\n","import { Box } from \"@chakra-ui/layout\";\nimport React, { useEffect, useRef, useState } from \"react\";\n\nimport styled from \"@emotion/styled\";\nimport { AnimateSharedLayout, motion } from \"framer-motion\";\nimport {\n  docco,\n  atomOneDark,\n} from \"react-syntax-highlighter/dist/esm/styles/hljs\";\nimport SyntaxHighlighter from \"react-syntax-highlighter\";\nimport { FindChallenge_programmingLanguages } from \"../../../generated/FindChallenge\";\nimport { Flex, IconButton, useColorMode } from \"@chakra-ui/react\";\nimport { TriangleDownIcon, TriangleUpIcon } from \"@chakra-ui/icons\";\n\nconst swapArrayElements = function (\n  arr: Array<any>,\n  indexA: number,\n  indexB: number\n) {\n  var temp = arr[indexA];\n  arr[indexA] = arr[indexB];\n  arr[indexB] = temp;\n};\n\n// const Item = ({\n//   top,\n//   language,\n//   content,\n//   index,\n//   total,\n//   setOrder,\n// }: {\n//   top: number;\n//   language: FindChallenge_programmingLanguages;\n//   content: string;\n//   index: number;\n//   total: number;\n//   setOrder: () => void;\n// }) => {\n//   // const [onTop, setOnTop] = useState(false);\n\n//   return (\n\n//   );\n// };\n\nconst SortBlocksEditor = ({\n  codeSkeletons,\n  language,\n  setCode,\n}: {\n  codeSkeletons: string[];\n  language: FindChallenge_programmingLanguages;\n  setCode: (code: string) => void;\n}) => {\n  const [codeSkeletonsOrdered, setCodeSkeletonsOrder] = useState<string[]>([]);\n  const { colorMode } = useColorMode();\n\n  useEffect(() => {\n    if (codeSkeletonsOrdered.length <= 0) {\n      /** Addition of \"_____${i}\" string is a workaround to make both framer-motion work and have unique keys */\n      setCodeSkeletonsOrder(codeSkeletons.map((item, i) => item + `_____${i}`));\n    }\n  }, [codeSkeletons]);\n\n  useEffect(() => {\n    setCodeSkeletonsOrder(codeSkeletons.map((item, i) => item + `_____${i}`));\n  }, [language]);\n\n  const moveElement = (index: number, up: boolean) => {\n    let codeSkeletonsNewOrder = [...codeSkeletonsOrdered];\n    swapArrayElements(\n      codeSkeletonsNewOrder,\n      index,\n      up\n        ? index - 1 < 0\n          ? 0\n          : index - 1\n        : index + 1 < codeSkeletonsOrdered.length\n        ? index + 1\n        : codeSkeletonsOrdered.length - 1\n    );\n\n    const linesWithRemovedAdditionalSymbols = codeSkeletonsNewOrder.map(\n      (code) => code.split(\"_____\")[0]\n    );\n    setCodeSkeletonsOrder(codeSkeletonsNewOrder);\n    setCode(linesWithRemovedAdditionalSymbols.join(\"\\n\"));\n    console.log(linesWithRemovedAdditionalSymbols.join(\"\\n\"));\n  };\n\n  return (\n    <Flex\n      position=\"relative\"\n      width=\"100%\"\n      justifyContent=\"center\"\n      marginTop={5}\n      flexDirection=\"column\"\n    >\n      {codeSkeletonsOrdered.map((line, i) => {\n        return (\n          <Block\n            isDark={colorMode === \"dark\"}\n            height={50}\n            layout\n            key={line}\n            transition={{\n              type: \"spring\",\n              damping: 20,\n              stiffness: 300,\n            }}\n          >\n            <SyntaxHighlighter\n              wrapLines\n              wrapLongLines\n              customStyle={{\n                fontSize: \"14px\",\n                background: \"none\",\n                padding: 0,\n                height: \"auto\",\n                // minHeight: \"200px\",\n              }}\n              language={language.id ? language.id.toLowerCase() : \"plain\"}\n              style={colorMode === \"dark\" ? atomOneDark : docco}\n            >\n              {line.split(\"_____\")[0]}\n            </SyntaxHighlighter>\n            <Flex flexDir=\"column\">\n              <IconButton\n                aria-label=\"Up\"\n                icon={<TriangleUpIcon />}\n                width={50}\n                height={25}\n                size=\"xs\"\n                borderRadius=\"4px 4px 0px 0px\"\n                borderBottom=\"none\"\n                colorScheme=\"gray\"\n                variant=\"outline\"\n                color=\"grey\"\n                onClick={() => moveElement(i, true)}\n              />\n              <IconButton\n                color=\"grey\"\n                aria-label=\"Down\"\n                icon={<TriangleDownIcon />}\n                width={50}\n                height={25}\n                size=\"xs\"\n                borderRadius=\"0px 0px 4px 4px\"\n                colorScheme=\"gray\"\n                variant=\"outline\"\n                onClick={() => moveElement(i, false)}\n              />\n            </Flex>\n          </Block>\n        );\n      })}\n    </Flex>\n  );\n};\n\nconst Block = styled(motion.div)<{ height: number; isDark: boolean }>`\n  width: 95%;\n  margin: auto;\n  padding-left: 15px;\n  margin-bottom: 5px;\n  min-height: ${({ height }) => height}px;\n  border: 1px solid black;\n  border-radius: 4px;\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  border-color: ${({ isDark: dark }) =>\n    dark ? \"rgba(255,255,255,0.06)\" : \"rgba(0,0,0,0.06)\"};\n  background-color: ${({ isDark: dark }) =>\n    dark ? \"rgba(255,255,255,0.03)\" : \"rgba(0,0,0,0.03)\"};\n`;\n\nexport default SortBlocksEditor;\n","import { Box, useColorMode } from \"@chakra-ui/react\";\nimport React, { useState } from \"react\";\nimport SyntaxHighlighter from \"react-syntax-highlighter\";\nimport { FindChallenge_programmingLanguages } from \"../../../generated/FindChallenge\";\nimport {\n  docco,\n  atomOneDark,\n} from \"react-syntax-highlighter/dist/esm/styles/hljs\";\nimport styled from \"@emotion/styled\";\n\nconst SpotTheBugEditor = ({\n  codeSkeleton,\n  language,\n  setCode,\n}: {\n  codeSkeleton: string;\n  language: FindChallenge_programmingLanguages;\n\n  /** Spot the bug mode sets a number of the line with a bug instead of submitting code */\n  setCode: (value: string) => void;\n}) => {\n  const { colorMode } = useColorMode();\n  const [selectedLine, setSelectedLine] = useState(-1);\n\n  return (\n    <Box padding={2}>\n      {codeSkeleton &&\n        codeSkeleton.split(\"\\n\").map((line, i) => {\n          return (\n            <CodeLine\n              key={i}\n              darkMode={colorMode === \"dark\" ? 1 : 0}\n              onClick={() => {\n                console.log(\"1\", i, selectedLine === i);\n                setSelectedLine(i);\n                setCode((i + 1).toString());\n              }}\n              className={selectedLine === i ? \"selected\" : \"\"}\n            >\n              <span className=\"line-number\">{i + 1}</span>\n              <SyntaxHighlighter\n                wrapLines\n                wrapLongLines\n                customStyle={{\n                  fontSize: \"14px\",\n                  display: \"inline\",\n                  background: \"none\",\n                }}\n                language={language.id ? language.id.toLowerCase() : \"plain\"}\n                style={colorMode === \"dark\" ? atomOneDark : docco}\n              >\n                {line}\n              </SyntaxHighlighter>\n              <br />\n            </CodeLine>\n          );\n        })}\n    </Box>\n  );\n};\n\nconst CodeLine = styled.div<{ darkMode?: number }>`\n  .line-number {\n    color: ${({ darkMode }) =>\n      !darkMode ? \"rgba(0, 0, 0, 0.3)\" : \"rgba(255, 255, 255, 0.3)\"};\n    font-size: 14px;\n    margin-right: 10px;\n    margin-left: 4px;\n  }\n\n  border-radius: 4px;\n  border: 1px solid rgba(0, 0, 0, 0.1);\n  border-color: ${({ darkMode }) =>\n    !darkMode ? \"rgba(0, 0, 0, 0.1)\" : \"rgba(255, 255, 255, 0.1)\"};\n\n  background-color: ${({ darkMode }) =>\n    !darkMode ? \"rgba(0, 0, 0, 0.01)\" : \"rgba(255, 255, 255, 0.01)\"};\n  padding: 4px;\n  margin: 4px 4px;\n\n  cursor: pointer;\n  transition: transform 0.5s, border-color 0.5s, background-color 0.5s,\n    border-width 0.5s;\n\n  &:hover {\n    transform: scale(0.95);\n  }\n\n  &.selected {\n    border-width: 3px;\n    border-color: ${({ darkMode }) =>\n      !darkMode ? \"rgba(0, 153, 255, 0.5)\" : \"rgba(0, 119, 255, 0.5)\"};\n    background-color: ${({ darkMode }) =>\n      !darkMode ? \"rgba(0, 56, 93, 0.01)\" : \"rgba(0, 119, 255, 0.01)\"};\n  }\n`;\n\nexport default SpotTheBugEditor;\n","import React from \"react\";\nimport CodeEditor, { CodeEditorProps } from \"../../CodeEditor\";\nimport FillInGapsEditor from \"../editors/FillInGapsEditor\";\nimport SortBlocksEditor from \"../editors/SortBlocksEditor\";\nimport SpotTheBugEditor from \"../editors/SpotTheBugEditor\";\n\nconst EditorSwitcher = ({\n  editorKind,\n  codeSkeletons,\n  language,\n  setCode,\n  code,\n  evaluateSubmission,\n  validateSubmission,\n}: {\n  codeSkeletons: string | string[];\n  editorKind: string | undefined | null;\n} & CodeEditorProps) => {\n  // console.log(\"CODE SKELETON\", codeSkeletons);\n\n  switch (editorKind) {\n    case \"FILL_IN_GAPS\":\n      return (\n        <FillInGapsEditor\n          skeleton={\n            typeof codeSkeletons === \"object\" ? codeSkeletons[0] : codeSkeletons\n          }\n          language={language}\n          setCode={setCode}\n        />\n      );\n    case \"SPOT_BUG\":\n      return (\n        <SpotTheBugEditor\n          codeSkeleton={\n            typeof codeSkeletons === \"object\" ? codeSkeletons[0] : codeSkeletons\n          }\n          language={language}\n          setCode={setCode}\n        />\n      );\n    case \"SORT_BLOCKS\":\n      return (\n        <SortBlocksEditor\n          codeSkeletons={\n            typeof codeSkeletons === \"object\" ? codeSkeletons : [codeSkeletons]\n          }\n          language={language}\n          setCode={setCode}\n        />\n      );\n    default:\n      return (\n        <CodeEditor\n          language={language}\n          code={code}\n          setCode={setCode}\n          evaluateSubmission={evaluateSubmission}\n          validateSubmission={validateSubmission}\n        />\n      );\n  }\n};\n\nexport default EditorSwitcher;\n","import { Result } from \"../../../generated/globalTypes\";\n\ndeclare var Sk: any;\n\nconst OUTPUTS = [];\n\nfunction builtinRead(x: any) {\n  if (\n    Sk.builtinFiles === undefined ||\n    Sk.builtinFiles[\"files\"][x] === undefined\n  )\n    throw \"File not found: '\" + x + \"'\";\n  return Sk.builtinFiles[\"files\"][x];\n}\n\ninterface RunPythonI {\n  code: string;\n  setLoading: (v: boolean) => void;\n  setOutput: (v: string) => void;\n  setResult: (v: Result) => void;\n  stopExecution: { current: boolean };\n  onSuccess?: Function;\n  onError?: (v: string) => void;\n  getInput: () => string | undefined;\n  onFinish?: (error?: any) => void;\n  moreThanOneExecution?: boolean;\n}\n\nconst runPython = ({\n  code,\n  setLoading,\n  setOutput,\n  setResult,\n  stopExecution,\n  onSuccess,\n  onError,\n  getInput,\n  onFinish,\n  moreThanOneExecution,\n}: RunPythonI) => {\n  //   console.log(\"[SKULPT]\", code);\n  Sk.pre = \"output\";\n  Sk.configure({\n    output: setOutput,\n    __future__: Sk.python3,\n    read: builtinRead,\n\n    // Exec limit sometimes does not fire\n    execLimit: 10000,\n\n    // Added to enable the execution stop\n    killableWhile: true,\n    killableFor: true,\n\n    inputfun: getInput,\n    inputfunTakesPrompt: true,\n  });\n  //   (Sk.TurtleGraphics || (Sk.TurtleGraphics = {})).target = \"mycanvas\";\n  var myPromise = Sk.misceval.asyncToPromise(\n    () => Sk.importMainWithBody(\"<stdin>\", false, code, true),\n    {\n      // handle a suspension of the executing code\n      // \"*\" says handle all types of suspensions\n      \"*\": () => {\n        console.log(\"CHECK\", stopExecution.current);\n        if (stopExecution.current) {\n          throw \"\\nExecution interrupted\";\n        }\n      },\n    }\n  );\n\n  setLoading(true);\n  myPromise.then(\n    function (mod: any) {\n      console.log(\"success\", mod);\n\n      setResult(Result.ACCEPT);\n      setLoading(false);\n      onSuccess && onSuccess();\n      onFinish && onFinish();\n    },\n    function (err: any) {\n      //   console.log(\"errrr\", err);\n      //   console.log(err.toString());\n      onError &&\n        onError(\n          '<span style=\"white-space: pre-line;\">' +\n            err.toString() +\n            \"\\n\" +\n            \"</span>\"\n        );\n\n      console.log(\"ERR\", JSON.stringify(err));\n      setResult(Result.RUNTIME_ERROR);\n      setLoading(false);\n      setOutput(err.toString() + \"\\n\");\n      onFinish && onFinish(err.toString() + \"\\n\");\n    }\n  );\n};\n\nfunction outf(text: string) {\n  console.log(\"RUN\", text);\n}\n\nexport default runPython;\n","import { gql } from \"@apollo/client\";\n\nexport const GET_PLAYER_HINTS = gql`\n  query playerHintsQuery($gameId: String!, $challengeId: String!) {\n    playerHints(gameId: $gameId, challengeId: $challengeId) {\n      id\n      game {\n        name\n      }\n      parentChallenge {\n        id\n        name\n      }\n      name\n      description\n      cost\n      recurrent\n      createdAt\n      updatedAt\n    }\n  }\n`;\n","import {\n  Box,\n  Button,\n  Divider,\n  Modal,\n  ModalBody,\n  ModalCloseButton,\n  ModalContent,\n  ModalFooter,\n  ModalHeader,\n  ModalOverlay,\n} from \"@chakra-ui/react\";\nimport React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { playerHintsQuery_playerHints } from \"../../generated/playerHintsQuery\";\nimport { rewardReceivedStudentSubscription_rewardReceivedStudent_reward } from \"../../generated/rewardReceivedStudentSubscription\";\n\nconst HintsModal = ({\n  isOpen,\n  onClose,\n  playerHints,\n}: {\n  isOpen: boolean;\n  onClose: () => void;\n  playerHints: (\n    | playerHintsQuery_playerHints\n    | rewardReceivedStudentSubscription_rewardReceivedStudent_reward\n  )[];\n}) => {\n  const { t } = useTranslation();\n\n  return (\n    <Modal isOpen={isOpen} onClose={onClose}>\n      <ModalOverlay />\n      <ModalContent>\n        <ModalHeader>{t(\"Hints\")}</ModalHeader>\n        <ModalCloseButton />\n        <ModalBody>\n          {playerHints.map((hint, i) => {\n            return (\n              <SingleHint\n                key={i}\n                title={hint.name}\n                description={hint.description}\n              />\n            );\n          })}\n        </ModalBody>\n\n        <ModalFooter>\n          <Button colorScheme=\"blue\" mr={3} onClick={onClose}>\n            {t(\"Close\")}\n          </Button>\n        </ModalFooter>\n      </ModalContent>\n    </Modal>\n  );\n};\n\nconst SingleHint = ({\n  title,\n  description,\n}: {\n  title: string;\n  description?: string | null;\n}) => {\n  return (\n    <Box\n      border=\"1px solid\"\n      borderRadius={4}\n      padding={2}\n      borderColor=\"gray.200\"\n      marginBottom={4}\n    >\n      <p>\n        <b>{title}</b>\n      </p>\n\n      {description && (\n        <>\n          <Divider margin=\"6px 0px 6px 0px\" />\n          <p>{description}</p>\n        </>\n      )}\n    </Box>\n  );\n};\n\nexport default HintsModal;\n","import { useQuery } from \"@apollo/client\";\nimport { Box, Button, useDisclosure } from \"@chakra-ui/react\";\nimport React, { useEffect } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { playerHintsQuery } from \"../../generated/playerHintsQuery\";\nimport { rewardReceivedStudentSubscription_rewardReceivedStudent_reward } from \"../../generated/rewardReceivedStudentSubscription\";\nimport { GET_PLAYER_HINTS } from \"../../graphql/getPlayerHints\";\nimport HintsModal from \"./HintsModal\";\n\nconst Hints = ({\n  challengeId,\n  gameId,\n  hints,\n}: {\n  challengeId: string;\n  gameId: string;\n  hints: rewardReceivedStudentSubscription_rewardReceivedStudent_reward[];\n}) => {\n  const { isOpen, onOpen, onClose } = useDisclosure();\n  const { t } = useTranslation();\n\n  const {\n    data: playerHintsData,\n    error: playerHintsError,\n    loading: playerHintsLoading,\n    refetch: playerHintsRefetch,\n  } = useQuery<playerHintsQuery>(GET_PLAYER_HINTS, {\n    variables: { gameId, challengeId },\n    skip: !challengeId,\n    fetchPolicy: \"no-cache\",\n  });\n\n  useEffect(() => {\n    if (playerHintsData) {\n      if (playerHintsData.playerHints.length > 0) {\n        playerHintsRefetch();\n      }\n    }\n\n    // playerHintsData?.playerHints.forEach((hint) => {\n    //   hint.\n    // })\n  }, [hints]);\n\n  // console.log(\"PLAYER HINTS DATA\", playerHintsData);\n  // console.log(\"PLAYER HINTS ERROR\", playerHintsError);\n\n  const shouldDisplayHintsButton =\n    hints.length > 0 ||\n    (playerHintsData ? playerHintsData?.playerHints.length > 0 : false);\n\n  return challengeId && shouldDisplayHintsButton && !playerHintsError ? (\n    <Box position=\"absolute\" right={5} bottom={3}>\n      <HintsModal\n        onClose={onClose}\n        isOpen={isOpen}\n        playerHints={\n          playerHintsData\n            ? playerHintsData.playerHints.length > 0\n              ? playerHintsData.playerHints\n              : hints\n            : hints\n        }\n      />\n      <Button\n        isLoading={playerHintsLoading}\n        colorScheme=\"blue\"\n        size=\"sm\"\n        onClick={onOpen}\n      >\n        {t(\"Hints\")}\n      </Button>\n    </Box>\n  ) : (\n    <></>\n  );\n};\n\nexport default Hints;\n","import sanitizeHtml from \"sanitize-html\";\n\nconst defaultOptions = {\n  allowedTags: [\n    \"address\",\n    \"article\",\n    \"aside\",\n    \"footer\",\n    \"header\",\n    \"h1\",\n    \"h2\",\n    \"h3\",\n    \"h4\",\n    \"h5\",\n    \"h6\",\n    \"hgroup\",\n    \"main\",\n    \"nav\",\n    \"section\",\n    \"blockquote\",\n    \"dd\",\n    \"div\",\n    \"dl\",\n    \"dt\",\n    \"figcaption\",\n    \"figure\",\n    \"hr\",\n    \"li\",\n    \"main\",\n    \"ol\",\n    \"p\",\n    \"pre\",\n    \"ul\",\n    \"a\",\n    \"abbr\",\n    \"b\",\n    \"bdi\",\n    \"bdo\",\n    \"br\",\n    \"cite\",\n    \"code\",\n    \"data\",\n    \"dfn\",\n    \"em\",\n    \"i\",\n    \"kbd\",\n    \"mark\",\n    \"q\",\n    \"rb\",\n    \"rp\",\n    \"rt\",\n    \"rtc\",\n    \"ruby\",\n    \"s\",\n    \"samp\",\n    \"small\",\n    \"span\",\n    \"strong\",\n    \"sub\",\n    \"sup\",\n    \"time\",\n    \"u\",\n    \"var\",\n    \"wbr\",\n    \"caption\",\n    \"col\",\n    \"colgroup\",\n    \"table\",\n    \"tbody\",\n    \"td\",\n    \"tfoot\",\n    \"th\",\n    \"thead\",\n    \"tr\",\n    \"img\",\n    \"code\",\n  ],\n  allowedAttributes: {\n    a: [\"href\", \"name\", \"target\"],\n    img: [\"src\", \"srcset\", \"alt\", \"title\", \"width\", \"height\", \"loading\"],\n  },\n  selfClosing: [\n    \"img\",\n    \"br\",\n    \"hr\",\n    \"area\",\n    \"base\",\n    \"basefont\",\n    \"input\",\n    \"link\",\n    \"meta\",\n  ],\n  allowedSchemes: [\"http\", \"https\", \"ftp\", \"mailto\", \"tel\"],\n  allowedIframeHostnames: [\"www.youtube.com\"],\n};\n\nexport const sanitize = (dirty: string, options?: any) => ({\n  __html: sanitizeHtml(dirty, { ...defaultOptions, ...options }),\n});\n\nexport const SanitizeHTML = ({\n  html,\n  options,\n}: {\n  html: string;\n  options?: typeof defaultOptions;\n}) => <div dangerouslySetInnerHTML={sanitize(html, options)} />;\n","import {\n  Box,\n  Button,\n  Flex,\n  Tab,\n  TabList,\n  TabPanel,\n  TabPanels,\n  Tabs,\n  useColorMode,\n} from \"@chakra-ui/react\";\nimport styled from \"@emotion/styled\";\nimport React from \"react\";\nimport { TFunction, useTranslation } from \"react-i18next\";\nimport ReactMarkdown from \"react-markdown\";\nimport { getActivityById_activity } from \"../../generated/getActivityById\";\nimport ScrollbarWrapper from \"../ScrollbarWrapper\";\nimport { SanitizeHTML } from \"./SanitizeHTML\";\n\nconst DOCTYPE_HTML_STRING = \"<!doctype html>\";\n\n// TODO: Refactor alphabetical sorting, now it's copied multiple times\n\nconst GET_LANGUAGES_FROM_A_TAG_MENU_REGEX = new RegExp(\n  /(<a href=\"#)[\\w.-]+(\">)[\\w.-]+(<\\/a>)/g\n);\n\nconst STATEMENT_LANGUAGES_SPLIT_REGEX = new RegExp(\n  /(<a name=\")[\\w.-]+(\" data-type=\"lang\"><\\/a><br \\/>)/g\n);\n\nconst Statement = ({\n  activity,\n  gameId,\n}: {\n  activity: getActivityById_activity | null;\n  gameId: string;\n}) => {\n  const { t, i18n } = useTranslation();\n  const { colorMode } = useColorMode();\n  const {\n    statement: statementOrNoDescriptionMessage,\n    renderAsHTML: singleLanguageStatementRenderAsHTML,\n  } = getStatement(activity, t);\n\n  return (\n    <ScrollbarWrapper>\n      <Flex\n        maxHeight=\"calc(50vh - 67px)\"\n        height={getStatementHeight(activity)}\n        overflowY={\"auto\"}\n        borderBottom=\"1px solid rgba(0,0,0,0.1)\"\n        position=\"relative\"\n      >\n        <MarkdownStyled\n          h=\"100%\"\n          w=\"100%\"\n          bgColor={colorMode === \"dark\" ? \"gray.900\" : \"gray.100\"}\n        >\n          <Box bgColor={colorMode === \"dark\" ? \"gray.900\" : \"gray.100\"} p={5}>\n            {activity?.pdf ? (\n              <Button\n                colorScheme=\"blue\"\n                variant=\"ghost\"\n                onClick={() => {\n                  let pdfWindow = window.open(\"\");\n                  if (pdfWindow) {\n                    pdfWindow.document.write(\n                      \"<iframe width='100%' height='100%' src='data:application/pdf;base64, \" +\n                        encodeURI(activity?.statement || \"\") +\n                        \"'></iframe>\"\n                    );\n                  }\n                }}\n              >\n                {t(\"Open PDF statement\")}\n              </Button>\n            ) : statementOrNoDescriptionMessage.split('data-type=\"lang\"')\n                .length > 1 ? (\n              <Tabs\n                variant=\"soft-rounded\"\n                defaultIndex={(() => {\n                  // Initial active tab to active language\n\n                  let defaultIndex = 0;\n                  let languageChanged = false;\n\n                  const userDefaultStatementsLanguage =\n                    localStorage.getItem(\"statementLanguage\");\n\n                  statementOrNoDescriptionMessage\n                    .match(GET_LANGUAGES_FROM_A_TAG_MENU_REGEX)\n                    ?.sort((a: any, b: any) =>\n                      a\n                        .split('\">')[1]\n                        .split(\"</\")[0]\n                        .localeCompare(b.split('\">')[1].split(\"</\")[0])\n                    )\n                    .forEach((lang, i) => {\n                      // console.log(\n                      //   i18n.language.toLowerCase(),\n                      //   lang.split('\">')[1].split(\"</\")[0].toLowerCase()\n                      // );\n                      if (userDefaultStatementsLanguage) {\n                        // If user has a default statement language (the user clicked at least once on a language tab)\n                        if (\n                          userDefaultStatementsLanguage.toLowerCase() ===\n                          lang.split('\">')[1].split(\"</\")[0].toLowerCase()\n                        ) {\n                          defaultIndex = i;\n                          languageChanged = true;\n                        }\n                      } else {\n                        if (\n                          i18n.language.toLowerCase() ===\n                          lang.split('\">')[1].split(\"</\")[0].toLowerCase()\n                        ) {\n                          defaultIndex = i;\n                        }\n                      }\n\n                      if (userDefaultStatementsLanguage && !languageChanged) {\n                        if (\n                          i18n.language.toLowerCase() ===\n                          lang.split('\">')[1].split(\"</\")[0].toLowerCase()\n                        ) {\n                          defaultIndex = i;\n                        }\n                      }\n                    });\n\n                  return defaultIndex;\n                })()}\n              >\n                <TabList>\n                  {statementOrNoDescriptionMessage\n                    .match(GET_LANGUAGES_FROM_A_TAG_MENU_REGEX)\n                    ?.sort((a: any, b: any) =>\n                      a\n                        .split('\">')[1]\n                        .split(\"</\")[0]\n                        .localeCompare(b.split('\">')[1].split(\"</\")[0])\n                    )\n                    .map((lang, i) => {\n                      const languageCode = lang.split('\">')[1].split(\"</\")[0];\n\n                      return (\n                        <Tab\n                          key={i}\n                          onClick={() => {\n                            localStorage.setItem(\n                              \"statementLanguage\",\n                              languageCode\n                            );\n                          }}\n                        >\n                          {languageCode}\n                        </Tab>\n                      );\n                    })}\n                </TabList>\n\n                <TabPanels>\n                  {statementOrNoDescriptionMessage\n                    .replaceAll(STATEMENT_LANGUAGES_SPLIT_REGEX, \"{{DIVIDER}}\")\n                    .split(\"{{DIVIDER}}\")\n                    .slice(1)\n                    .flatMap((statementLanguageVersion, i) => {\n                      const unsortedListOfLanguages =\n                        statementOrNoDescriptionMessage.match(\n                          GET_LANGUAGES_FROM_A_TAG_MENU_REGEX\n                        );\n\n                      return {\n                        lang: unsortedListOfLanguages\n                          ? unsortedListOfLanguages[i]\n                          : \"undefined\",\n                        statement: statementLanguageVersion,\n                      };\n                    })\n                    .sort((a, b) => a.lang.localeCompare(b.lang))\n                    .map((statementLanguageVersion, i) => {\n                      const renderAsHTML =\n                        statementLanguageVersion.statement\n                          .toLowerCase()\n                          .indexOf(DOCTYPE_HTML_STRING) !== -1\n                          ? false\n                          : true;\n\n                      return (\n                        <TabPanel key={i}>\n                          {renderAsHTML ? (\n                            <ReactMarkdown allowDangerousHtml>\n                              {statementLanguageVersion.statement}\n                            </ReactMarkdown>\n                          ) : (\n                            <SanitizeHTML\n                              html={statementLanguageVersion.statement}\n                            />\n                          )}\n                        </TabPanel>\n                      );\n                    })}\n                </TabPanels>\n              </Tabs>\n            ) : singleLanguageStatementRenderAsHTML ? (\n              <SanitizeHTML html={statementOrNoDescriptionMessage} />\n            ) : (\n              <ReactMarkdown allowDangerousHtml>\n                {statementOrNoDescriptionMessage}\n              </ReactMarkdown>\n            )}\n          </Box>\n        </MarkdownStyled>\n      </Flex>\n    </ScrollbarWrapper>\n  );\n};\n\nconst MarkdownStyled = styled(Box)`\n  table {\n    border-collapse: collapse;\n    border-spacing: 0;\n  }\n\n  td {\n    vertical-align: top;\n  }\n\n  h1,\n  h2,\n  h3,\n  h4,\n  h5,\n  h6 {\n    font-weight: normal;\n\n    line-height: 1em;\n  }\n\n  h4,\n  h5,\n  h6 {\n    font-weight: bold;\n  }\n\n  h1 {\n    font-size: 2.5em;\n  }\n\n  h2 {\n    font-size: 2em;\n  }\n\n  h3 {\n    font-size: 1.5em;\n  }\n\n  h4 {\n    font-size: 1.2em;\n  }\n\n  h5 {\n    font-size: 1em;\n  }\n\n  h6 {\n    font-size: 0.9em;\n  }\n\n  blockquote {\n    color: #666666;\n    margin: 0;\n    padding-left: 3em;\n    border-left: 0.1em #aaa solid;\n  }\n\n  hr {\n    display: block;\n    border: 0;\n    border-top: 1px solid #aaa;\n    border-bottom: 1px solid #eee;\n    margin: 1em 0;\n    padding: 0;\n  }\n\n  pre,\n  code,\n  kbd,\n  samp {\n    color: gray;\n    font-family: monospace, monospace;\n    _font-family: \"courier new\", monospace;\n    font-size: 0.98em;\n  }\n\n  pre {\n    white-space: pre;\n    white-space: pre-wrap;\n    word-wrap: break-word;\n  }\n\n  b,\n  strong {\n    font-weight: bold;\n  }\n\n  dfn {\n    font-style: italic;\n  }\n\n  ins {\n    background: #ff9;\n    color: #000;\n    text-decoration: none;\n  }\n\n  mark {\n    background: #ff0;\n    color: #000;\n    font-style: italic;\n    font-weight: bold;\n  }\n\n  sub,\n  sup {\n    font-size: 75%;\n    line-height: 0;\n    position: relative;\n    vertical-align: baseline;\n  }\n\n  sup {\n    top: -0.5em;\n  }\n\n  sub {\n    bottom: -0.25em;\n  }\n\n  ul,\n  ol {\n    margin: 1em 0;\n    padding: 0 0 0 2em;\n  }\n\n  li p:last-child {\n    margin: 0;\n  }\n\n  dd {\n    margin: 0 0 0 2em;\n  }\n`;\n\nexport const getStatement = (\n  activity: getActivityById_activity | null,\n  tFunction: TFunction\n): {\n  statement: string;\n  renderAsHTML: boolean;\n} => {\n  if (!activity) {\n    return { statement: tFunction(\"No description\"), renderAsHTML: false };\n  }\n\n  if (activity?.statement) {\n    const renderAsHTML =\n      activity.statement.toLowerCase().indexOf(DOCTYPE_HTML_STRING) !== -1\n        ? true\n        : false;\n\n    return {\n      statement: activity?.statement,\n      renderAsHTML,\n    };\n  }\n\n  return { statement: tFunction(\"No description\"), renderAsHTML: false };\n};\n\nexport const getStatementLength = (\n  activity: getActivityById_activity | null\n) => {\n  if (!activity) {\n    return 0;\n  }\n\n  if (activity?.statement) {\n    return activity?.statement.length;\n  } else {\n    return 0;\n  }\n};\n\nexport const getStatementHeight = (\n  activity: getActivityById_activity | null\n) => {\n  if (activity?.pdf) {\n    return 150;\n  }\n\n  const statementLength = getStatementLength(activity);\n\n  if (!statementLength) {\n    return 150;\n  }\n\n  const ensureReadbility = 150 + statementLength / 5;\n\n  return ensureReadbility < 300 ? ensureReadbility : 300;\n};\n\nexport default Statement;\n","import styled from \"@emotion/styled\";\nimport React, { useContext } from \"react\";\nimport ReactHtmlParser from \"react-html-parser\";\nimport { useTranslation } from \"react-i18next\";\nimport { FindChallenge_programmingLanguages } from \"../../generated/FindChallenge\";\nimport { Result } from \"../../generated/globalTypes\";\nimport { SettingsContext } from \"./SettingsContext\";\n\nconst Terminal = ({\n  submissionResult,\n  submissionFeedback,\n  validationOutputs,\n  loading,\n  activeLanguage,\n}: {\n  submissionResult: Result | null;\n  submissionFeedback: string;\n  validationOutputs: null | any;\n  loading: boolean;\n  activeLanguage: FindChallenge_programmingLanguages;\n}) => {\n  const { t } = useTranslation();\n  const { terminalTheme, terminalFontSize } = useContext(SettingsContext);\n  return (\n    <TerminalStyled\n      terminalTheme={terminalTheme}\n      terminalFontSize={terminalFontSize}\n    >\n      <div>\n        {validationOutputs &&\n          Object.keys(validationOutputs).map((objectKey, i) => {\n            return (\n              <span key={i} style={{ whiteSpace: \"pre-line\" }}>\n                {validationOutputs[objectKey]}\n              </span>\n            );\n          })}\n\n        {submissionResult === Result.COMPILATION_ERROR\n          ? submissionFeedback\n          : ReactHtmlParser(\n              submissionFeedback\n                ? loading\n                  ? t(\"playground.terminal.waitingForResult\")\n                  : submissionFeedback === \"Ready\"\n                  ? t(\"playground.terminal.feedback.Ready\")\n                  : submissionFeedback\n                : \"\"\n            )}\n      </div>\n    </TerminalStyled>\n  );\n};\n\nexport const TerminalStyled = styled.div<{\n  terminalTheme: string;\n  terminalFontSize: string;\n}>`\n  border-top: 1px solid rgba(0, 0, 0, 0.1);\n  position: relative;\n  height: 100%;\n  width: 100%;\n  background-color: ${({ terminalTheme }) =>\n    terminalTheme === \"dark\" ? \"#323232\" : \"white\"};\n  color: ${({ terminalTheme }) =>\n    terminalTheme === \"dark\" ? \"white\" : \"#121212\"};\n  padding: 12px;\n  margin: 0px;\n  font-size: ${({ terminalFontSize }) => terminalFontSize}px;\n  font-family: \"Source Code Pro\", monospace;\n  overflow-y: auto;\n  overflow-x: hidden;\n  word-wrap: break-word;\n  & > div {\n    margin: auto;\n    width: 90%;\n    position: absolute;\n  }\n`;\n\nexport default Terminal;\n","import {\n  ApolloQueryResult,\n  gql,\n  useLazyQuery,\n  useMutation,\n  useSubscription,\n} from \"@apollo/client\";\nimport { Box, Flex, Skeleton } from \"@chakra-ui/react\";\nimport { useKeycloak } from \"@react-keycloak/web\";\nimport axios from \"axios\";\nimport dayjs from \"dayjs\";\nimport React, { useContext, useEffect, useRef, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { FocusActivityContextType } from \"../../@types/focus-activity\";\nimport { FocusActivityContext } from \"../../context/FocusActivityContext\";\nimport { evaluationSubscription } from \"../../generated/evaluationSubscription\";\nimport {\n  FindChallenge,\n  FindChallenge_programmingLanguages,\n} from \"../../generated/FindChallenge\";\nimport { getActivityById_activity } from \"../../generated/getActivityById\";\nimport {\n  getLatestSubmissionAndValidation,\n  getLatestSubmissionAndValidation_latestSubmission,\n  getLatestSubmissionAndValidation_latestValidation,\n} from \"../../generated/getLatestSubmissionAndValidation\";\nimport { getSubmissionByIdQuery } from \"../../generated/getSubmissionByIdQuery\";\nimport { getValidationByIdQuery } from \"../../generated/getValidationByIdQuery\";\nimport { Result } from \"../../generated/globalTypes\";\nimport { rewardReceivedStudentSubscription_rewardReceivedStudent_reward } from \"../../generated/rewardReceivedStudentSubscription\";\nimport { validationSubscription } from \"../../generated/validationSubscription\";\nimport { GET_LATEST_SUBMISSION_AND_VALIDATION } from \"../../graphql/getLatestSubmissionAndValidation\";\nimport { GET_SUBMISSION_BY_ID } from \"../../graphql/getSubmissionById\";\nimport { GET_VALIDATION_BY_ID } from \"../../graphql/getValidationById\";\nimport { decryptWithAES, encryptWithAES } from \"../../utilities/Encryption\";\nimport { useLazyQuery as useLazyQueryPromise } from \"../ExportGameCsvModal\";\nimport { useNotifications } from \"../Notifications\";\n// import Loading from \"./Loading\";\nimport EditorMenu from \"./EditorMenu\";\nimport { getDefaultProgrammingLangOrFirstFromArray } from \"./helpers/defaultProgrammingLanguage\";\nimport EditorSwitcher from \"./helpers/EditorSwitcher\";\nimport runPython from \"./helpers/python\";\nimport Hints from \"./Hints\";\nimport { SettingsContext } from \"./SettingsContext\";\nimport Statement, { getStatementHeight } from \"./Statement\";\nimport Terminal from \"./Terminal\";\n\nconst isEditorKindSpotBug = (activity?: getActivityById_activity | null) => {\n  if (!activity) {\n    return false;\n  }\n\n  if (activity.editorKind === \"SPOT_BUG\") {\n    return true;\n  }\n\n  return false;\n};\n\n// const GET_VALIDATION_BY_ID = gql`\n//   query getValidationByIdQuery($gameId: String!, $validationId: String!) {\n//     validation(gameId: $gameId, id: $validationId) {\n//       id\n//       game {\n//         id\n//       }\n//       player {\n//         id\n//       }\n//       exerciseId\n//       evaluationEngine\n//       evaluationEngineId\n//       language\n//       metrics\n//       outputs\n//       userExecutionTimes\n\n//       feedback\n//       submittedAt\n//       evaluatedAt\n//       program\n//       result\n//     }\n//   }\n// `;\n\n// const GET_SUBMISSION_BY_ID = gql`\n//   query getSubmissionByIdQuery($gameId: String!, $submissionId: String!) {\n//     submission(gameId: $gameId, id: $submissionId) {\n//       id\n//       game {\n//         id\n//       }\n//       player {\n//         id\n//       }\n//       exerciseId\n//       evaluationEngine\n//       evaluationEngineId\n//       language\n//       metrics\n//       result\n//       feedback\n//       submittedAt\n//       evaluatedAt\n//       program\n//     }\n//   }\n// `;\n\nconst EVALUATE_SUBMISSION = gql`\n  mutation evaluateSubmissionQuery(\n    $exerciseId: String!\n    $gameId: String!\n    $file: Upload!\n  ) {\n    evaluate(gameId: $gameId, exerciseId: $exerciseId, file: $file) {\n      id\n      game {\n        id\n      }\n      player {\n        user {\n          username\n        }\n      }\n      feedback\n      exerciseId\n      evaluationEngine\n      evaluationEngineId\n    }\n  }\n`;\n\nconst VALIDATE_SUBMISSION = gql`\n  mutation validateSubmissionQuery(\n    $exerciseId: String!\n    $gameId: String!\n    $file: Upload!\n    $inputs: [String!]!\n  ) {\n    validate(\n      gameId: $gameId\n      exerciseId: $exerciseId\n      file: $file\n      inputs: $inputs\n    ) {\n      id\n      game {\n        id\n      }\n      player {\n        user {\n          username\n        }\n      }\n      exerciseId\n      evaluationEngine\n      evaluationEngineId\n    }\n  }\n`;\n\nconst VALIDATION_SUBSCRIPTION = gql`\n  subscription validationSubscription($gameId: String!) {\n    validationProcessedStudent(gameId: $gameId) {\n      id\n      player {\n        id\n      }\n      exerciseId\n      result\n      createdAt\n      feedback\n      outputs\n    }\n  }\n`;\n\nconst EVALUATION_SUBSCRIPTION = gql`\n  subscription evaluationSubscription($gameId: String!) {\n    submissionEvaluatedStudent(gameId: $gameId) {\n      id\n      player {\n        id\n      }\n      exerciseId\n      result\n      createdAt\n      feedback\n    }\n  }\n`;\n\n// const LATEST_VALIDATION = gql`\n//   query latestValidationQuery($gameId: String!, $exerciseId: String!) {\n//     latestValidation(gameId: $gameId, exerciseId: $exerciseId) {\n//       createdAt\n//       feedback\n//       result\n//       outputs\n//       language\n//       program\n//       id\n//     }\n//   }\n// `;\n\nconst getEditorTheme = () => {\n  const editorTheme = localStorage.getItem(\"editorTheme\");\n  if (editorTheme) {\n    return editorTheme;\n  }\n  return \"light\";\n};\n\nconst getTerminalTheme = () => {\n  const terminalTheme = localStorage.getItem(\"terminalTheme\");\n  if (terminalTheme) {\n    return terminalTheme;\n  }\n  return \"light\";\n};\n\nconst getTerminalFontSize = () => {\n  const terminalFontSize = localStorage.getItem(\"terminalFontSize\");\n  if (terminalFontSize) {\n    return terminalFontSize;\n  }\n  return \"14\";\n};\n\nconst isSkulptEnabledLocalStorage = () => {\n  const lsSkulptSetting = localStorage.getItem(\"skulpt\");\n  if (lsSkulptSetting) {\n    return JSON.parse(lsSkulptSetting);\n  }\n\n  return true;\n};\n\nconst Exercise = ({\n  gameId,\n  activity,\n  programmingLanguages,\n  challengeRefetch,\n  solved,\n  setNextUnsolvedExercise,\n  challengeId,\n  hints,\n  setSideMenuOpen,\n  isLoading,\n}: {\n  isLoading: boolean;\n  setSideMenuOpen: () => void;\n  gameId: string;\n  activity: getActivityById_activity | null;\n  programmingLanguages: FindChallenge_programmingLanguages[];\n  challengeRefetch: (\n    variables?: Partial<Record<string, any>> | undefined\n  ) => Promise<ApolloQueryResult<FindChallenge>>;\n  solved: boolean;\n  setNextUnsolvedExercise: () => void;\n  challengeId: string;\n  hints: rewardReceivedStudentSubscription_rewardReceivedStudent_reward[];\n}) => {\n  const { add: addNotification } = useNotifications();\n  const { t } = useTranslation();\n\n  const [lastEvaluationOrSubmissionId, setLastEvaluationOrSubmissionId] =\n    useState<null | string>(null);\n\n  const [activeLanguage, setActiveLanguage] =\n    useState<FindChallenge_programmingLanguages>(\n      getDefaultProgrammingLangOrFirstFromArray(programmingLanguages, gameId)\n    );\n  const [code, setCode] = useState<string | null>(null);\n\n  const { keycloak } = useKeycloak();\n\n  const { focusActivity } = useContext(FocusActivityContext) as FocusActivityContextType;\n\n  const [isSkulptEnabled, setSkulptEnabled] = useState(\n    isSkulptEnabledLocalStorage()\n  );\n\n  const [submissionFeedback, setSubmissionFeedback] = useState(\"Ready\");\n  const [submissionResult, setSubmissionResult] = useState<Result | null>(null);\n  const [validationOutputs, setValidationOutputs] = useState<null | any>(null);\n\n  const [isWaitingForEvaluationResult, setWaitingForEvaluationResult] =\n    useState(false);\n  const [isWaitingForValidationResult, setWaitingForValidationResult] =\n    useState(false);\n\n  const [connectionProblem, setConnectionProblem] = useState(false);\n\n  const [evaluationId, setEvaluationId] = useState<null | string>(null);\n  const [validationId, setValidationId] = useState<null | string>(null);\n\n  const [editorTheme, setEditorTheme] = useState(\"light\");\n  const [terminalTheme, setTerminalTheme] = useState(\"light\");\n  const [terminalFontSize, setTerminalFontSize] = useState(\"18\");\n\n  const [testValues, setTestValues] = useState<string[]>([\"\"]);\n\n  const activityRef = useRef<getActivityById_activity | null>(null);\n  const activeLanguageRef =\n    useRef<FindChallenge_programmingLanguages>(activeLanguage);\n  const isEvaluationFetchingRef = useRef<boolean>(isWaitingForEvaluationResult);\n  const isValidationFetchingRef = useRef<boolean>(isWaitingForValidationResult);\n  const codeRef = useRef<string | null>(code);\n  const [isRestoreAvailable, setRestoreAvailable] = useState(false);\n\n  //** Added to use with local code interpreters like Skulpt (Python) */\n  const stopExecution = useRef(false);\n  const additionalOutputs = useRef<string[]>([]);\n\n  const reloadCode = () => {\n    setCode(null);\n    clearPlayground();\n    saveSubmissionDataInLocalStorage(\"\", null, true, null, \"\");\n  };\n\n  const getCodeSkeleton = (dontSetCode?: boolean, getArray?: boolean) => {\n    if (activity) {\n      if (activity?.codeSkeletons) {\n        const codeSkeletons = activity?.codeSkeletons;\n        let allCodeSkeletonsForActiveLang: string[] = [];\n        for (let i = 0; i < codeSkeletons.length; i++) {\n          if (codeSkeletons[i].extension === activeLanguage.extension) {\n            if (!dontSetCode) {\n              setCode(codeSkeletons[i].code || \"\");\n            }\n\n            if (!getArray) {\n              return codeSkeletons[i].code;\n            } else {\n              allCodeSkeletonsForActiveLang.push(codeSkeletons[i].code || \"\");\n            }\n          }\n        }\n        if (getArray) {\n          return allCodeSkeletonsForActiveLang;\n        }\n      }\n    }\n\n    return \"\";\n  };\n\n  const saveCodeToLocalStorage = (codeToSave: string) => {\n    if (activity && keycloak.profile?.email) {\n      const userDataLocalStorage = localStorage.getItem(\n        `FGPE_${keycloak.profile?.username}_game_${gameId}_chall_${activity?.id}`\n      );\n      if (userDataLocalStorage) {\n        const userData = JSON.parse(userDataLocalStorage);\n        const encryptedCode = encryptWithAES(\n          codeToSave,\n          keycloak.profile?.email\n        );\n        const userDataWithNewCode = {\n          ...userData,\n          code: encryptedCode,\n          language: activeLanguage.name,\n        };\n        localStorage.setItem(\n          `FGPE_${keycloak.profile?.username}_game_${gameId}_chall_${activity?.id}`,\n          JSON.stringify(userDataWithNewCode)\n        );\n      } else {\n        saveSubmissionDataInLocalStorage(\"\", null, true, null, codeToSave);\n      }\n    }\n  };\n\n  const getLatestSubmissionAndValidation =\n    useLazyQueryPromise<getLatestSubmissionAndValidation>(\n      GET_LATEST_SUBMISSION_AND_VALIDATION\n    );\n\n  const restoreSubmission = (\n    latestSubmission: getLatestSubmissionAndValidation_latestSubmission\n  ) => {\n    restoreLatestAttemptExcludingSpecificParameters({\n      program: latestSubmission.program,\n      language: latestSubmission.language,\n      result: latestSubmission.result,\n      feedback: latestSubmission.result,\n    });\n\n    saveSubmissionDataInLocalStorage(\n      latestSubmission.feedback || \"\",\n      latestSubmission.result,\n      true,\n      undefined,\n      latestSubmission.program || \"\"\n    );\n  };\n\n  const restoreValidation = (\n    latestValidation: getLatestSubmissionAndValidation_latestValidation\n  ) => {\n    restoreLatestAttemptExcludingSpecificParameters({\n      program: latestValidation.program,\n      language: latestValidation.language,\n      result: latestValidation.result,\n      feedback: latestValidation.result,\n    });\n\n    if (latestValidation.outputs) {\n      setValidationOutputs(latestValidation.outputs);\n    } else {\n      setValidationOutputs(null);\n    }\n\n    saveSubmissionDataInLocalStorage(\n      latestValidation.feedback || \"\",\n      latestValidation.result,\n      true,\n      latestValidation.outputs,\n      latestValidation.program || \"\"\n    );\n  };\n\n  const restoreLatestAttemptExcludingSpecificParameters = ({\n    program,\n    language,\n    result,\n    feedback,\n  }: {\n    program?: any;\n    language: any;\n    result?: any;\n    feedback?: any;\n  }) => {\n    setCode(program || \"\");\n\n    for (let i = 0; i < programmingLanguages.length; i++) {\n      if (programmingLanguages[i].name === language) {\n        setActiveLanguage(programmingLanguages[i]);\n      }\n    }\n\n    if (result) {\n      if (result === Result.ACCEPT) {\n        setSubmissionResult(null);\n      } else {\n        setSubmissionResult(result);\n      }\n    } else {\n      setSubmissionResult(null);\n    }\n\n    if (feedback) {\n      setSubmissionFeedback(feedback);\n    } else {\n      setSubmissionFeedback(\"\");\n    }\n  };\n\n  const restoreLatestSubmissionOrValidation = async () => {\n    if (!activity) {\n      return;\n    }\n    const submissionAndValidation = await getLatestSubmissionAndValidation({\n      gameId,\n      exerciseId: activity.id,\n    }).catch((err) => {\n      console.log(\"RESTORE ERROR\", err);\n      addNotification({\n        title: t(\"error.unknownProblem.title\"),\n        description: t(\"error.unknownProblem.description\"),\n        status: \"error\",\n      });\n    });\n\n    if (!submissionAndValidation) {\n      return;\n    }\n\n    if (!submissionAndValidation.data) {\n      addNotification({\n        title: t(\"error.unknownProblem.title\"),\n        description: t(\"error.unknownProblem.description\"),\n        status: \"error\",\n      });\n      return;\n    }\n\n    const {\n      data: { latestSubmission, latestValidation },\n    } = submissionAndValidation;\n    if (latestSubmission && !latestValidation) {\n      restoreSubmission(latestSubmission);\n    }\n\n    if (latestValidation && !latestSubmission) {\n      restoreValidation(latestValidation);\n    }\n\n    if (latestValidation && latestSubmission) {\n      const validationDate = dayjs(latestValidation.createdAt);\n      const submissionDate = dayjs(latestSubmission.createdAt);\n      if (validationDate.diff(submissionDate) > 0) {\n        restoreValidation(latestValidation);\n      } else {\n        restoreSubmission(latestSubmission);\n      }\n    }\n\n    // const latestValidation = await refetchLastValidation();\n\n    // if (!latestValidation.data) {\n    //   return;\n    // }\n\n    // const latestValidationData = latestValidation.data.latestValidation;\n\n    // if (!latestValidationData) {\n    //   return;\n    // }\n\n    // setCode(latestValidationData.program || \"\");\n\n    // for (let i = 0; i < programmingLanguages.length; i++) {\n    //   if (programmingLanguages[i].name === latestValidationData.language) {\n    //     setActiveLanguage(programmingLanguages[i]);\n    //   }\n    // }\n\n    // if (latestValidationData.outputs) {\n    //   setValidationOutputs(latestValidationData.outputs);\n    // } else {\n    //   setValidationOutputs(null);\n    // }\n\n    // if (latestValidationData.feedback) {\n    //   setSubmissionFeedback(latestValidationData.feedback);\n    // } else {\n    //   setSubmissionFeedback(\"\");\n    // }\n\n    // if (latestValidationData.result) {\n    //   if (latestValidationData.result === Result.ACCEPT) {\n    //     setSubmissionResult(null);\n    //   } else {\n    //     setSubmissionResult(latestValidationData.result);\n    //   }\n    // } else {\n    //   setSubmissionResult(null);\n    // }\n\n    // saveSubmissionDataInLocalStorage(\n    //   latestValidationData.feedback || \"\",\n    //   latestValidationData.result,\n    //   true,\n    //   latestValidationData.outputs,\n    //   latestValidationData.program || \"\"\n    // );\n  };\n\n  useEffect(() => {\n    isEvaluationFetchingRef.current = isWaitingForEvaluationResult;\n    isValidationFetchingRef.current = isWaitingForValidationResult;\n    activityRef.current = activity;\n    activeLanguageRef.current = activeLanguage;\n    codeRef.current = code;\n  });\n\n  useEffect(() => {\n    const maxTime = 120;\n    const timeoutID = setTimeout(() => {\n      if (isValidationFetchingRef.current || isEvaluationFetchingRef.current) {\n        setConnectionProblem(true);\n      }\n    }, 1000 * maxTime);\n    return () => clearInterval(timeoutID);\n  }, [isWaitingForEvaluationResult, isWaitingForValidationResult]);\n\n  // const {\n  //   data: lastValidationData,\n  //   error: lastValidationError,\n  //   loading: lastValidationLoading,\n  //   refetch: refetchLastValidation,\n  // } = useQuery<latestValidationQuery>(LATEST_VALIDATION, {\n  //   variables: { gameId, exerciseId: activity?.id },\n  //   skip: activity ? false : true,\n  //   fetchPolicy: \"no-cache\",\n  // });\n\n  const getLastStateFromLocalStorage = (\n    lastSubmissionFeedbackUnparsed: any\n  ) => {\n    try {\n      if (lastSubmissionFeedbackUnparsed) {\n        const parsedLastSubmission = JSON.parse(lastSubmissionFeedbackUnparsed);\n        if (parsedLastSubmission.code) {\n          if (keycloak.profile?.email) {\n            const encryptedCode = decryptWithAES(\n              parsedLastSubmission.code,\n              keycloak.profile.email\n            );\n\n            setCode(encryptedCode);\n          }\n        }\n\n        // console.log(\"GOT\", parsedLastSubmission);\n        if (parsedLastSubmission.submissionFeedback !== undefined) {\n          setSubmissionFeedback(parsedLastSubmission.submissionFeedback);\n          // console.log(\"setting feedback\");\n        } else {\n          setSubmissionFeedback(\"Ready\");\n          // console.log(\"setting feedback - ready\");\n        }\n\n        if (parsedLastSubmission.language) {\n          for (let i = 0; i < programmingLanguages.length; i++) {\n            if (\n              programmingLanguages[i].name === parsedLastSubmission.language\n            ) {\n              setActiveLanguage(programmingLanguages[i]);\n            }\n          }\n        }\n\n        if (parsedLastSubmission.submissionResult) {\n          if (parsedLastSubmission.isValidation) {\n            if (parsedLastSubmission.submissionResult === Result.ACCEPT) {\n              setSubmissionResult(null);\n            } else {\n              setSubmissionResult(parsedLastSubmission.submissionResult);\n            }\n          } else {\n            setSubmissionResult(parsedLastSubmission.submissionResult);\n          }\n        } else {\n          setSubmissionResult(null);\n        }\n\n        if (parsedLastSubmission.validationOutputs) {\n          setValidationOutputs(parsedLastSubmission.validationOutputs);\n        } else {\n          setValidationOutputs(null);\n        }\n      } else {\n        clearPlayground();\n      }\n    } catch (err) {\n      clearPlayground();\n    }\n  };\n\n  const getAndSetLatestStateFromLocalStorageOrClear = () => {\n    setCode(null);\n\n    if (activity?.id) {\n      const lastSubmissionFeedbackUnparsed = localStorage.getItem(\n        `FGPE_${keycloak.profile?.username}_game_${gameId}_chall_${activity?.id}`\n      );\n      getLastStateFromLocalStorage(lastSubmissionFeedbackUnparsed);\n    } else {\n      clearPlayground();\n    }\n  };\n\n  useEffect(() => {\n    // setSubmissionResult(null);\n    setWaitingForEvaluationResult(false);\n    setWaitingForValidationResult(false);\n\n    getAndSetLatestStateFromLocalStorageOrClear();\n  }, [activity]);\n\n  useEffect(() => {\n    if (submissionResult === Result.ACCEPT) {\n      // console.log(\"Challenge refresh!\");\n      challengeRefetch();\n    }\n  }, [submissionResult]);\n\n  const saveSubmissionDataInLocalStorage = (\n    submissionFeedback: string,\n    submissionResult: Result | null,\n    isValidation: boolean,\n    validationOutputs?: any,\n    codeToSave?: string\n  ) => {\n    if (activity?.id) {\n      if (keycloak.profile?.email) {\n        localStorage.setItem(\n          `FGPE_${keycloak.profile?.username}_game_${gameId}_chall_${activity?.id}`,\n          JSON.stringify({\n            code: encryptWithAES(\n              typeof codeToSave !== \"undefined\" ? codeToSave : code,\n              keycloak.profile.email\n            ),\n            submissionFeedback,\n            submissionResult,\n            validationOutputs,\n            isValidation,\n            time: new Date(),\n            language: activeLanguage.name,\n          })\n        );\n      }\n    }\n  };\n\n  const [getSubmissionById] = useLazyQuery<getSubmissionByIdQuery>(\n    GET_SUBMISSION_BY_ID,\n    {\n      onError(data) {\n        console.log(\"[GET SUBMISSION BY ID ERROR]\", data);\n      },\n      onCompleted(data) {\n        console.log(\"[GET SUBMISSION BY ID]\", data);\n        if (\n          data.submission.id == lastEvaluationOrSubmissionId &&\n          lastEvaluationOrSubmissionId\n        ) {\n          console.log(\"[SUBMISSION] Already processed\");\n          setWaitingForEvaluationResult(false);\n        }\n      },\n      fetchPolicy: \"network-only\",\n    }\n  );\n\n  const { error: subEvaluationError } = useSubscription<evaluationSubscription>(\n    EVALUATION_SUBSCRIPTION,\n    {\n      variables: { gameId },\n      onSubscriptionData: ({ subscriptionData }) => {\n        console.log(\n          \"[SUB] EVALUATION\",\n          subscriptionData.data?.submissionEvaluatedStudent.id\n        );\n        const newSubscriptionId =\n          subscriptionData.data?.submissionEvaluatedStudent.id;\n        setLastEvaluationOrSubmissionId(newSubscriptionId || null);\n\n        if (\n          lastEvaluationOrSubmissionId == newSubscriptionId &&\n          newSubscriptionId\n        ) {\n          return;\n        }\n\n        // if (isWaitingForEvaluationResult) {\n        if (subscriptionData.data) {\n          setRestoreAvailable(true);\n\n          const evaluationData =\n            subscriptionData.data.submissionEvaluatedStudent;\n          setSubmissionResult(evaluationData.result);\n          setSubmissionFeedback(evaluationData.feedback || \"\");\n          setValidationOutputs(null);\n          setWaitingForEvaluationResult(false);\n\n          if (focusActivity) {\n            sendLastGradeToLtiPlatform();\n          }\n\n          saveSubmissionDataInLocalStorage(\n            evaluationData.feedback || \"\",\n            evaluationData.result,\n            false,\n            null\n          );\n        }\n        // }\n      },\n    }\n  );\n\n  const { error: subValidationError } = useSubscription<validationSubscription>(\n    VALIDATION_SUBSCRIPTION,\n    {\n      variables: { gameId },\n      onSubscriptionData: ({ subscriptionData }) => {\n        const newValidationId =\n          subscriptionData.data?.validationProcessedStudent.id;\n        setLastEvaluationOrSubmissionId(newValidationId || null);\n\n        if (\n          lastEvaluationOrSubmissionId == newValidationId &&\n          newValidationId\n        ) {\n          return;\n        }\n\n        // if (isWaitingForValidationResult) {\n        console.log(\"Sub data\", subscriptionData);\n\n        if (subscriptionData.data) {\n          setRestoreAvailable(true);\n          const validationData =\n            subscriptionData.data.validationProcessedStudent;\n\n          setValidationOutputs(validationData?.outputs);\n          setSubmissionFeedback(validationData?.feedback || \"\");\n          setWaitingForValidationResult(false);\n\n          if (validationData.result === Result.ACCEPT) {\n            setSubmissionResult(null);\n          } else {\n            setSubmissionResult(validationData.result);\n          }\n\n          saveSubmissionDataInLocalStorage(\n            validationData?.feedback || \"\",\n            validationData.result,\n            true,\n            validationData?.outputs\n          );\n        }\n        // }\n      },\n    }\n  );\n\n  const [getValidationById] = useLazyQuery<getValidationByIdQuery>(\n    GET_VALIDATION_BY_ID,\n    {\n      onCompleted(data) {\n        console.log(\"[GET VALIDATION BY ID]\", data);\n      },\n      fetchPolicy: \"network-only\",\n    }\n  );\n\n  const [evaluateSubmissionMutation] = useMutation(EVALUATE_SUBMISSION, {\n    onError(data) {\n      console.log(\"[EVALUATION ERROR]\");\n    },\n    onCompleted(data) {\n      const submissionId = data.evaluate.id;\n      console.log(\"[EVALUATE MUTATION DATA]\", data);\n      console.log(\"[SUBMISSION ID]\", submissionId);\n      console.log(\"QUERY DATA\", {\n        variables: { gameId, submissionId },\n      });\n      setWaitingForEvaluationResult(true);\n\n      // if (\n      //   submissionId == lastEvaluationOrSubmissionId &&\n      //   lastEvaluationOrSubmissionId\n      // ) {\n      //   console.log(\"[EVALUATION] Already processed\");\n      //   setWaitingForEvaluationResult(false);\n      // }\n\n      // setFetchingCount(0);\n      setEvaluationId(submissionId);\n      getSubmissionById({\n        variables: { gameId, submissionId },\n      });\n    },\n  });\n\n  const [validateSubmissionMutation] = useMutation(VALIDATE_SUBMISSION, {\n    onCompleted(data) {\n      const validationId = data.validate.id;\n      // console.log(\"[VALIDATE MUTATION DATA]\", data);\n      // console.log(\"[VALIDATION ID]\", validationId);\n      if (\n        validationId == lastEvaluationOrSubmissionId &&\n        lastEvaluationOrSubmissionId\n      ) {\n        console.log(\"[VALIDATION] Already processed\");\n        setWaitingForEvaluationResult(false);\n      }\n\n      // setFetchingCount(0);\n      // setValidationId(validationId);\n      // getValidationById({\n      //   variables: { gameId, validationId },\n      // });\n    },\n  });\n\n  const getFileFromCode = (isSpotBugMode?: boolean) => {\n    if (!codeRef.current) {\n      return;\n    }\n    const blob = new Blob([codeRef.current], { type: \"text/plain\" });\n    const file = new File(\n      [blob],\n      `Solution.${isSpotBugMode ? \"txt\" : activeLanguageRef.current.extension}`\n    );\n\n    return file;\n  };\n\n  const evaluateSubmission = (isSpotBugMode?: boolean) => {\n    clearPlayground();\n    // setEvaluationFetching(true);\n    // setFetchingCount(0);\n    if (isEvaluationFetchingRef.current) {\n      return;\n    }\n    if (!activityRef.current) {\n      return;\n    } else console.log(\"[EVALUATE SUBMISSION]\");\n\n    const file = getFileFromCode(isSpotBugMode);\n\n    evaluateSubmissionMutation({\n      variables: {\n        file,\n        gameId,\n        exerciseId: activityRef.current?.id,\n      },\n    });\n  };\n\n  const validateSubmission = () => {\n    clearPlayground();\n\n    if (isValidationFetchingRef.current) {\n      return;\n    }\n    if (!activityRef.current) {\n      return;\n    } else console.log(\"[VALIDATE SUBMISSION]\");\n\n    const file = getFileFromCode();\n    // console.log(\"INPUTS\", testValues);\n\n    setWaitingForValidationResult(true);\n\n    validateSubmissionMutation({\n      variables: {\n        file,\n        gameId,\n        exerciseId: activityRef.current?.id,\n        inputs: testValues,\n      },\n    });\n  };\n\n  const clearPlayground = (isLocal?: boolean) => {\n    setSubmissionResult(null);\n    setSubmissionFeedback(\"Ready\");\n    setValidationOutputs(null);\n    if (isLocal) {\n      additionalOutputs.current = [];\n      stopExecution.current = false;\n    }\n  };\n\n  const sendLastGradeToLtiPlatform = async () => {\n    const res = await axios.post(\n      `${process.env.REACT_APP_API_URI}/lti/grade`,\n      {\n        game: focusActivity?.gameId,\n        challenge: focusActivity?.challengeId,\n        activity: focusActivity?.activityId\n      },\n      {\n        headers: {\n          Authorization: `Bearer ${focusActivity?.ltik}`,\n        },\n      }\n    );\n\n    console.log(res.data);\n  };\n\n  return (\n    <SettingsContext.Provider\n      value={{\n        editorTheme: getEditorTheme(),\n        setEditorTheme,\n        terminalTheme: getTerminalTheme(),\n        setTerminalTheme,\n        terminalFontSize: getTerminalFontSize(),\n        setTerminalFontSize,\n        isSkulptEnabled,\n        setSkulptEnabled,\n      }}\n    >\n      {/* {!subValidationLoading && (\n        <span>{subValidationData?.validationProcessedStudent.result}</span>\n      )} */}\n      <Box width={\"100%\"} height={\"100%\"} m={0} p={0}>\n        <Box position=\"relative\">\n          <Skeleton isLoaded={!isLoading}>\n            <Statement activity={activity} gameId={gameId} />\n          </Skeleton>\n\n          <Hints challengeId={challengeId} gameId={gameId} hints={hints} />\n        </Box>\n        <EditorMenu\n          setStopExecution={(v: boolean) => {\n            stopExecution.current = v;\n            console.log(\"stopped?\", stopExecution.current);\n          }}\n          gameId={gameId}\n          setSideMenuOpen={setSideMenuOpen}\n          editorKind={activity?.editorKind}\n          reload={reloadCode}\n          submissionResult={submissionResult}\n          activeLanguage={activeLanguage}\n          setActiveLanguage={(l) => {\n            // LOSING CODE....\n\n            setCode(null);\n            setActiveLanguage(l);\n            // getAndSetLatestStateFromLocalStorageOrClear();\n          }}\n          evaluateSubmission={evaluateSubmission}\n          validateSubmission={\n            activeLanguage.name?.substring(0, 6).toLowerCase() === \"python\" &&\n            isSkulptEnabled\n              ? async () => {\n                  clearPlayground(true);\n\n                  // setSubmissionFeedback(validationData?.feedback || \"\");\n                  // setWaitingForValidationResult(false);\n\n                  // if (validationData.result === Result.ACCEPT) {\n                  //   setSubmissionResult(null);\n                  // } else {\n                  //   setSubmissionResult(validationData.result);\n                  // }\n\n                  // saveSubmissionDataInLocalStorage(\n                  //   validationData?.feedback || \"\",\n                  //   validationData.result,\n                  //   true,\n                  //   validationData?.outputs\n                  // );\n                  let errors: { content: string; index: number }[] = [];\n\n                  for (let i = 0; i < testValues.length; i++) {\n                    await new Promise((resolve, reject) => {\n                      const testValue = testValues[i];\n                      const testValueSplitted = testValue.split(\"\\n\");\n                      let inputFunN = 0;\n                      runPython({\n                        moreThanOneExecution: testValues.length > 1,\n                        getInput: (v?: any) => {\n                          const nextInput = testValueSplitted[inputFunN];\n                          inputFunN++;\n                          console.log(\"INP\", nextInput.length);\n                          return nextInput.length === 0 ? undefined : nextInput;\n                        },\n                        code: code ? code : \"\",\n                        setLoading: setWaitingForValidationResult,\n                        setOutput: (v: string) => {\n                          console.log(\"output\", v);\n                          additionalOutputs.current = [\n                            ...additionalOutputs.current,\n                            v,\n                          ];\n                        },\n                        setResult: (v: Result) => {\n                          setSubmissionResult(v);\n                        },\n                        stopExecution,\n                        onFinish: (error) => {},\n                        onSuccess: () => {\n                          setValidationOutputs(additionalOutputs.current);\n                          setSubmissionFeedback(\"\");\n\n                          saveSubmissionDataInLocalStorage(\n                            \"\",\n                            submissionResult,\n                            true,\n                            additionalOutputs.current\n                          );\n\n                          resolve(true);\n                        },\n                        onError: (err: string) => {\n                          errors.push({\n                            content: err,\n                            index: i,\n                          });\n\n                          setSubmissionFeedback(err);\n\n                          saveSubmissionDataInLocalStorage(\n                            err,\n                            Result.RUNTIME_ERROR,\n                            true,\n                            null\n                          );\n\n                          resolve(true);\n                        },\n                      });\n                    });\n                  }\n\n                  if (testValues.length > 1) {\n                    if (errors.length > 1) {\n                      setSubmissionResult(null);\n                      setValidationOutputs(additionalOutputs.current);\n\n                      setSubmissionFeedback(\"\");\n\n                      saveSubmissionDataInLocalStorage(\n                        \"\",\n                        submissionResult,\n                        true,\n                        additionalOutputs.current\n                      );\n                    }\n                  }\n\n                  console.log(\"OUTP\", additionalOutputs.current);\n                }\n              : validateSubmission\n          }\n          isValidationFetching={isWaitingForValidationResult}\n          isEvaluationFetching={isWaitingForEvaluationResult}\n          // setFetchingCount={setFetchingCount}\n          restore={restoreLatestSubmissionOrValidation}\n          setSubmissionFetching={setWaitingForEvaluationResult}\n          programmingLanguages={programmingLanguages}\n          setValidationFetching={setWaitingForValidationResult}\n          testValues={testValues}\n          setTestValues={setTestValues}\n          solved={solved}\n          setNextUnsolvedExercise={setNextUnsolvedExercise}\n          connectionError={\n            subValidationError || subEvaluationError || connectionProblem\n          }\n          isRestoreAvailable={true}\n\n          // REMOVED TO INCREASE SERVER PERFORMANCE\n          // isRestoreAvailable={\n          //   (isRestoreAvailable || (lastValidationError ? false : true)) &&\n          //   !lastValidationLoading\n          // }\n        />\n\n        <Skeleton\n          height={`calc(100% - ${getStatementHeight(activity) + 50}px)`}\n          minHeight={500}\n          flexDirection={{ base: \"column\", md: \"row\" }}\n          as={Flex}\n          isLoaded={!isLoading}\n        >\n          <Box\n            width={{\n              base: \"99%\",\n              md: isEditorKindSpotBug(activity) ? \"100%\" : \"58%\",\n            }}\n            height={{ base: \"50vh\", md: \"100%\" }}\n            minHeight=\"50vh\"\n            p={0}\n            m={0}\n          >\n            {\n              <EditorSwitcher\n                editorKind={activity?.editorKind}\n                language={activeLanguage}\n                code={code === null ? getCodeSkeleton() : code}\n                codeSkeletons={getCodeSkeleton(true, true) || \"\"}\n                setCode={(code) => {\n                  saveCodeToLocalStorage(code);\n                  setCode(code);\n                }}\n                evaluateSubmission={evaluateSubmission}\n                validateSubmission={validateSubmission}\n              />\n            }\n            {/* <CodeEditor\n              language={activeLanguage}\n              code={code === \"\" ? getCodeSkeleton() : code}\n              setCode={(code) => {\n                saveCodeToLocalStorage(code);\n                setCode(code);\n              }}\n              evaluateSubmission={evaluateSubmission}\n              validateSubmission={validateSubmission}\n            /> */}\n          </Box>\n          {!isEditorKindSpotBug(activity) && (\n            <Box\n              width={{ base: \"99%\", md: \"42%\" }}\n              height={{ base: \"50vh\", md: \"100%\" }}\n              minHeight=\"50vh\"\n            >\n              <Terminal\n                activeLanguage={activeLanguage}\n                submissionFeedback={submissionFeedback}\n                submissionResult={submissionResult}\n                validationOutputs={validationOutputs}\n                loading={\n                  isWaitingForValidationResult || isWaitingForEvaluationResult\n                }\n              />\n            </Box>\n          )}\n        </Skeleton>\n      </Box>\n    </SettingsContext.Provider>\n  );\n};\n\n// const Terminal = styled.div<{ terminalTheme: string }>`\n//   position: relative;\n//   height: 100%;\n//   width: 100%;\n//   background-color: ${({ terminalTheme }) =>\n//     terminalTheme === \"dark\" ? \"#323232\" : \"white\"};\n//   color: ${({ terminalTheme }) =>\n//     terminalTheme === \"dark\" ? \"white\" : \"#121212\"};\n//   padding: 12px;\n//   margin: 0px;\n//   font-size: 13px;\n//   font-family: \"Source Code Pro\", monospace;\n//   overflow-y: auto;\n//   overflow-x: hidden;\n//   word-wrap: break-word;\n//   & > div {\n//     margin: auto;\n//     width: 90%;\n//     position: absolute;\n//   }\n// `;\n\nexport default Exercise;\n","import { CircularProgress } from \"@chakra-ui/react\";\nimport styled from \"@emotion/styled\";\nimport React from \"react\";\n\nconst MainLoading = () => {\n  return (\n    <Fullscreen>\n      <CircularProgress isIndeterminate color=\"blue.300\" />\n    </Fullscreen>\n  );\n};\n\nconst Fullscreen = styled.div`\n  width: 100%;\n  height: 100%;\n  position: absolute;\n  top: 0;\n  left: 0;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n`;\n\nexport default MainLoading;\n","import { useQuery, useSubscription } from \"@apollo/client\";\nimport { CheckIcon, ChevronLeftIcon, ChevronRightIcon } from \"@chakra-ui/icons\";\nimport {\n  Box,\n  Button,\n  Flex,\n  Icon,\n  IconButton,\n  Text,\n  useColorMode,\n} from \"@chakra-ui/react\";\nimport styled from \"@emotion/styled\";\nimport dayjs from \"dayjs\";\nimport { motion } from \"framer-motion\";\nimport React, { useContext, useEffect, useState } from \"react\";\nimport Countdown from \"react-countdown\";\nimport { useTranslation } from \"react-i18next\";\nimport { BiTimer } from \"react-icons/bi\";\nimport { Redirect, useParams } from \"react-router-dom\";\nimport { FocusActivityContextType } from \"../@types/focus-activity\";\nimport { FocusActivityContext } from \"../context/FocusActivityContext\";\nimport { challengeStatusUpdatedStudentSub } from \"../generated/challengeStatusUpdatedStudentSub\";\nimport {\n  FindChallenge,\n  FindChallenge_myChallengeStatus_refs,\n} from \"../generated/FindChallenge\";\nimport { getActivityById } from \"../generated/getActivityById\";\nimport { Mode, RewardType, State } from \"../generated/globalTypes\";\nimport {\n  rewardReceivedStudentSubscription,\n  rewardReceivedStudentSubscription_rewardReceivedStudent_reward,\n} from \"../generated/rewardReceivedStudentSubscription\";\nimport { CHALLENGE_STATUS_UPDATED_STUDENT_SUB } from \"../graphql/challengeStatusUpdatedSub\";\nimport { FIND_CHALLENGE } from \"../graphql/findChallenge\";\nimport { GET_ACTIVITY_BY_ID } from \"../graphql/getActivityById\";\nimport { REWARD_RECEIVED_STUDENT_SUB } from \"../graphql/rewardReceivedStudentSub\";\nimport { checkIfConnectionAborted } from \"../utilities/ErrorMessages\";\nimport withChangeAnimation from \"../utilities/withChangeAnimation\";\nimport BreadcrumbComponent from \"./BreadcrumbComponent\";\nimport Error from \"./Error\";\nimport Exercise from \"./Exercise\";\nimport MainLoading from \"./MainLoading\";\nimport { useNotifications } from \"./Notifications\";\nimport ScrollbarWrapper from \"./ScrollbarWrapper\";\n\ninterface ParamTypes {\n  gameId: string;\n  challengeId: string;\n  exerciseId?: string;\n}\n\nconst Challenge = () => {\n  const [showExerciseNumbers, setShowExerciseNumbers] = useState(false);\n  const { gameId, challengeId, exerciseId } = useParams<ParamTypes>();\n  const { t } = useTranslation();\n  const [sideMenuOpen, setSideMenuOpen] = useState(false);\n  const { colorMode } = useColorMode();\n  const { focusActivity } = useContext(\n    FocusActivityContext\n  ) as FocusActivityContextType;\n\n  const { add: addNotification } = useNotifications();\n  const [challengeStatus, setChallengeStatus] = useState<{\n    startedAt: string;\n    endedAt: string;\n    openedAt: string;\n  }>();\n\n  //** Active exercise is actually an active ACTIVITY */\n  const [activeExercise, setActiveExercise] =\n    useState<null | FindChallenge_myChallengeStatus_refs>(null);\n  const [shouldRedirect, setShouldRedirect] = useState(false);\n  const [hints, setHints] = useState<\n    rewardReceivedStudentSubscription_rewardReceivedStudent_reward[]\n  >([]);\n\n  const { error: subUpdatedChallengeStatusError } =\n    useSubscription<challengeStatusUpdatedStudentSub>(\n      CHALLENGE_STATUS_UPDATED_STUDENT_SUB,\n      {\n        skip: !gameId,\n        variables: { gameId },\n        onSubscriptionData: ({ subscriptionData }) => {\n          if (subscriptionData.data) {\n            console.log(\n              \"Subscription - CHALLENGE STATUS UPDATED\",\n              subscriptionData.data\n            );\n            const challengeStatusUpdated =\n              subscriptionData.data.challengeStatusUpdatedStudent;\n\n            if (challengeStatusUpdated.state === State.FAILED) {\n              addNotification({\n                status: \"warning\",\n                title: t(\"timeIsUp.title\"),\n                description: t(\"timeIsUp.description\"),\n              });\n            }\n\n            setChallengeStatus({\n              endedAt: challengeStatusUpdated.endedAt,\n              startedAt: challengeStatusUpdated.startedAt,\n              openedAt: challengeStatusUpdated.openedAt,\n            });\n          }\n        },\n      }\n    );\n\n  const { error: subRewardsError } =\n    useSubscription<rewardReceivedStudentSubscription>(\n      REWARD_RECEIVED_STUDENT_SUB,\n      {\n        skip: !gameId,\n        variables: { gameId },\n        onSubscriptionData: ({ subscriptionData }) => {\n          console.log(\"Got subscription data\", subscriptionData);\n\n          if (subscriptionData.data) {\n            addNotification({\n              status:\n                subscriptionData.data.rewardReceivedStudent.reward.kind ===\n                RewardType.HINT\n                  ? \"info\"\n                  : \"success\",\n              title: subscriptionData.data.rewardReceivedStudent.reward.name,\n              description:\n                subscriptionData.data.rewardReceivedStudent.reward.description,\n              rewardImage:\n                subscriptionData.data.rewardReceivedStudent.reward.image,\n              rewardKind:\n                subscriptionData.data.rewardReceivedStudent.reward.kind,\n              showFireworks:\n                subscriptionData.data.rewardReceivedStudent.reward.kind ===\n                  RewardType.BADGE ||\n                subscriptionData.data.rewardReceivedStudent.reward.kind ===\n                  RewardType.VIRTUAL_ITEM,\n            });\n          }\n\n          if (\n            subscriptionData.data?.rewardReceivedStudent.reward.kind ===\n            RewardType.HINT\n          ) {\n            setHints([\n              ...hints,\n              subscriptionData.data.rewardReceivedStudent.reward,\n            ]);\n          }\n        },\n      }\n    );\n\n  const {\n    data: activityData,\n    error: activityError,\n    loading: activityLoading,\n  } = useQuery<getActivityById>(GET_ACTIVITY_BY_ID, {\n    skip: !activeExercise,\n    variables: { gameId, activityId: activeExercise?.activity?.id },\n    fetchPolicy: \"no-cache\",\n    onCompleted: () => {\n      console.log(\"ACTIVITY READY\");\n    },\n  });\n\n  const {\n    data: challengeData,\n    error: challengeError,\n    loading: challengeLoading,\n    refetch: challengeRefetch,\n  } = useQuery<FindChallenge>(FIND_CHALLENGE, {\n    fetchPolicy: \"no-cache\",\n    variables: { gameId, challengeId },\n    onCompleted: (data) => {\n      if (exerciseId) {\n        const exerciseFromURL = data.myChallengeStatus.refs.find(\n          (exercise) => exercise.activity?.id === exerciseId\n        );\n        if (exerciseFromURL) {\n          setActiveExercise(exerciseFromURL);\n        } else {\n          setActiveExercise(data.myChallengeStatus.refs[0]);\n        }\n      } else {\n        if (!activeExercise) {\n          setActiveExercise(data.myChallengeStatus.refs[0]);\n        }\n      }\n    },\n  });\n\n  const checkIfSolved = (\n    challengeData: FindChallenge,\n    activeExercise: FindChallenge_myChallengeStatus_refs | null\n  ): boolean => {\n    if (!challengeStatus) {\n      setChallengeStatus({\n        startedAt: challengeData.myChallengeStatus.startedAt,\n        endedAt: challengeData.myChallengeStatus.endedAt,\n        openedAt: challengeData.myChallengeStatus.openedAt,\n      });\n    }\n\n    if (!activeExercise) {\n      return false;\n    }\n\n    if (activeExercise.solved) {\n      return true;\n    }\n\n    return false;\n\n    // setChallengeStatus(challengeData.myChallengeStatus)\n\n    // setChallengeStatus({\n    //   startedAt: learningPath.startedAt,\n    //   endedAt: learningPath.endedAt,\n    //   openedAt: learningPath.openedAt,\n    // });\n\n    // // challengeData.profileInGame.learningPath.map((learningPath) => {\n    // //    learningPath.refs.forEach((ref) => {\n    // //     if (ref.activity?.id === exercise.id) {\n    // //       !challengeStatus &&\n    // //         setChallengeStatus({\n    // //           startedAt: learningPath.startedAt,\n    // //           endedAt: learningPath.endedAt,\n    // //           openedAt: learningPath.openedAt,\n    // //         });\n\n    // //       if (ref.solved) {\n    // //         solved = true;\n    // //       }\n    // //     }\n    // //   });\n    // // });\n  };\n\n  if (challengeError) {\n    console.log(\"challengeError\", challengeError);\n  }\n\n  // useEffect(() => {\n\n  // }, [challengeLoading]);\n\n  if (!gameId || !challengeId) {\n    return <div>Game ID or Challenge ID not provided</div>;\n  }\n\n  // if (challengeLoading) {\n  //   return (\n  //     <Stack>\n  //       <Skeleton>\n  //         <Playground>\n  //           <Flex h=\"100%\" w=\"100%\" />\n  //         </Playground>\n  //       </Skeleton>\n  //     </Stack>\n  //   );\n  // }\n  console.log(\"CHALLENGE DATA\", challengeData);\n  console.log(\"CHALLENGE STATUS\", challengeStatus);\n  /** Redirects to main course page if there are no more unsolved exercises. */\n  const setNextUnsolvedExercise = () => {\n    if (!challengeData) {\n      return;\n    }\n\n    let foundUnsolvedExercise = false;\n\n    const refs = challengeData?.myChallengeStatus.refs;\n    for (let i = 0; i < refs.length; i++) {\n      if (!refs[i].solved) {\n        foundUnsolvedExercise = true;\n        setActiveExercise(refs[i]);\n        break;\n      }\n    }\n\n    if (!foundUnsolvedExercise) {\n      setShouldRedirect(true);\n    }\n  };\n\n  if (!challengeLoading && challengeError) {\n    const isServerConnectionError = checkIfConnectionAborted(challengeError);\n\n    if (isServerConnectionError) {\n      return <Error serverConnectionError />;\n    } else {\n      return <Error errorContent={challengeError} />;\n    }\n  }\n\n  if (!challengeData && !challengeLoading) {\n    return <div>Couldn't load challengeData</div>;\n  }\n\n  if (shouldRedirect) {\n    return (\n      <Redirect\n        to={{\n          pathname: `/game/${gameId}`,\n        }}\n      />\n    );\n  }\n\n  return (\n    <Playground>\n      {(challengeLoading || activityLoading) && <MainLoading />}\n\n      {!focusActivity && challengeData?.game.name && (\n        <BreadcrumbComponent\n          gameName={challengeData.game.name}\n          gameId={gameId}\n          challengeName={challengeData.myChallengeStatus.challenge.name}\n          challengeId={challengeData.myChallengeStatus.challenge.id}\n          isChallengeActive={true}\n        />\n      )}\n      <MotionBox\n        animate={{\n          opacity: sideMenuOpen ? 1 : 0,\n        }}\n        pointerEvents={sideMenuOpen ? \"all\" : \"none\"}\n        left={0}\n        top={0}\n        position=\"fixed\"\n        zIndex={998}\n        height=\"100%\"\n        width=\"100%\"\n        backgroundColor=\"rgba(0,0,0,0.5)\"\n        onClick={() => {\n          setSideMenuOpen(false);\n        }}\n      />\n      <ScrollbarWrapper>\n        <Flex h=\"100%\" w=\"100%\">\n          <MotionBox\n            position={{ base: \"fixed\", md: \"relative\" }}\n            top={{ base: 0, md: \"auto\" }}\n            background={{\n              base: colorMode !== \"dark\" ? \"gray.200\" : \"gray.900\",\n              md: \"none\",\n            }}\n            zIndex={999}\n            left={{ md: \"0 !important\" }}\n            animate={{\n              left: sideMenuOpen ? \"0%\" : \"-50%\",\n            }}\n            width={{ base: \"50%\", md: 2 / 12 }}\n            // backgroundColor=\"white\"\n            maxWidth={{ base: \"100%\", md: 330 }}\n            // paddingTop={5}\n            height=\"100%\"\n            overflowY=\"scroll\"\n            borderRight=\"1px solid rgba(0,0,0,0.1)\"\n            // position=\"relative\"\n            className=\"better-scrollbar\"\n          >\n            <Box\n              position=\"absolute\"\n              left={\"calc(100% + 20px)\"}\n              display={{ base: \"block\", md: \"none\" }}\n              opacity={sideMenuOpen ? 1 : 0}\n              pointerEvents={sideMenuOpen ? \"all\" : \"none\"}\n            >\n              <IconButton\n                colorScheme=\"blue\"\n                height=\"50px\"\n                width=\"30px\"\n                position=\"fixed\"\n                size=\"xl\"\n                zIndex={2000}\n                top=\"50%\"\n                transform=\"translate(-50%, -50%)\"\n                aria-label=\"Open / Close\"\n                icon={sideMenuOpen ? <ChevronLeftIcon /> : <ChevronRightIcon />}\n                onClick={() => setSideMenuOpen(!sideMenuOpen)}\n              />\n            </Box>\n\n            {challengeStatus &&\n              challengeData?.myChallengeStatus.challenge.mode ===\n                Mode.TIME_BOMB &&\n              challengeStatus.openedAt &&\n              challengeStatus.startedAt &&\n              challengeStatus.endedAt && (\n                <Flex\n                  position=\"absolute\"\n                  bottom={10}\n                  width=\"100%\"\n                  justifyContent=\"center\"\n                  height=\"50px\"\n                  alignItems=\"center\"\n                >\n                  <Button cursor=\"auto\" _focus={{}} _active={{}}>\n                    <Icon as={BiTimer} marginRight={2} />\n\n                    <Countdown\n                      date={dayjs(challengeStatus.endedAt).valueOf()}\n                    />\n                  </Button>\n                </Flex>\n              )}\n            <Box p={{ base: 1, md: 5 }} h=\"100%\" w=\"100%\" position=\"relative\">\n              <Flex\n                flexDirection=\"column\"\n                alignItems=\"center\"\n                w=\"100%\"\n                // height=\"100%\"\n                overflowY=\"hidden\"\n              >\n                {!challengeLoading &&\n                  challengeData &&\n                  challengeData.myChallengeStatus.refs.map((exercise, i) => {\n                    if (!exercise.activity) {\n                      return;\n                    }\n\n                    if (exercise.activity.name && !showExerciseNumbers) {\n                      if (isNaN(+exercise.activity.name.split(\".\")[0])) {\n                        setShowExerciseNumbers(true);\n                      }\n                    }\n\n                    return (\n                      <Button\n                        marginBottom={2}\n                        w=\"100%\"\n                        size=\"sm\"\n                        fontSize={12}\n                        key={i}\n                        colorScheme={\n                          exercise.activity.id === activeExercise?.activity?.id\n                            ? \"blue\"\n                            : \"gray\"\n                        }\n                        className={\n                          \"exercise \" +\n                          (exercise.activity.id === activeExercise?.activity?.id\n                            ? \"active\"\n                            : \"\")\n                        }\n                        onClick={() => setActiveExercise(exercise)}\n                        rightIcon={exercise.solved ? <CheckIcon /> : undefined}\n                      >\n                        <Text\n                          whiteSpace=\"nowrap\"\n                          overflow=\"hidden\"\n                          textOverflow=\"ellipsis\"\n                        >\n                          {showExerciseNumbers\n                            ? `${i + 1}. ${exercise.activity.name}`\n                            : exercise.activity.name}\n                        </Text>\n                      </Button>\n                    );\n                  })}\n              </Flex>\n            </Box>\n          </MotionBox>\n\n          {!challengeLoading && challengeData && (\n            <Exercise\n              setSideMenuOpen={() => {\n                setSideMenuOpen(true);\n              }}\n              gameId={gameId}\n              challengeId={challengeId}\n              activity={activityData?.activity || null}\n              programmingLanguages={challengeData.programmingLanguages}\n              challengeRefetch={challengeRefetch}\n              solved={checkIfSolved(challengeData, activeExercise)}\n              setNextUnsolvedExercise={setNextUnsolvedExercise}\n              hints={hints}\n              isLoading={challengeLoading || activityLoading}\n            />\n          )}\n        </Flex>\n      </ScrollbarWrapper>\n    </Playground>\n  );\n};\n\nexport const MotionBox = motion.custom(Box);\n\nconst Playground = styled.div`\n  position: absolute;\n  width: 100%;\n  height: calc(100% - 65px);\n  top: 65px;\n  left: 0;\n\n  & > div {\n    width: 100%;\n  }\n`;\n\nexport default withChangeAnimation(Challenge);\n","export default __webpack_public_path__ + \"static/media/erasmus.7e62d705.png\";","export default __webpack_public_path__ + \"static/media/logo.8acd62fc.svg\";","import { Box, Button, Flex, Text, Link } from \"@chakra-ui/react\";\nimport styled from \"@emotion/styled\";\nimport React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport withChangeAnimation from \"../utilities/withChangeAnimation\";\nimport ErasmusLogo from \"../images/erasmus.png\";\nimport LogoSVG from \"../images/logo.svg\";\n\nimport { useKeycloak } from \"@react-keycloak/web\";\n\nconst HomePage = () => {\n  const { t } = useTranslation([\"translation\", \"tos\"]);\n  const { keycloak, initialized } = useKeycloak();\n\n  return (\n    <Flex\n      justifyContent=\"center\"\n      alignItems=\"center\"\n      textAlign=\"center\"\n      padding={25}\n      maxWidth={800}\n      margin=\"auto\"\n    >\n      <Box>\n        {/* <h3>{t(\"home.title\")}</h3>\n        <p>{t(\"home.description\")}</p> */}\n        <Box\n          // maxWidth={700}\n          textAlign=\"justify\"\n          marginTop={15}\n          marginBottom={25}\n        >\n          <Text fontSize=\"xl\">{t(\"home.welcome\")}</Text>\n        </Box>\n        <Link\n          onClick={() => {\n            keycloak.login({\n              redirectUri: `${window.location.origin}${process.env.PUBLIC_URL}/profile`,\n            });\n          }}\n          fontWeight={500}\n          marginTop={25}\n          marginBottom={25}\n        >\n          {t(\"home.clickToLogin\")}\n        </Link>\n        <Link\n          onClick={() => {\n            keycloak.login({\n              redirectUri: `${window.location.origin}${process.env.PUBLIC_URL}/profile`,\n            });\n          }}\n        >\n          <FGPELogo src={LogoSVG} />\n        </Link>\n\n        <ErasmusImage />\n        <Erasmus>\n          The contents of this website are the sole responsibility of the\n          authors and can in no way be taken to reflect the views of the\n          European Union or the Erasmus+ programme.\n        </Erasmus>\n        {/* <hr style={{ margin: \"8px 0px\" }} />\n        <LinkStyled href=\"https://fgpe.usz.edu.pl/\">\n          <span>\n            Framework for Gamified Programming Education (Erasmus+ Programme)\n          </span>\n        </LinkStyled> */}\n      </Box>\n    </Flex>\n  );\n};\n\nconst FGPELogo = styled.img`\n  width: 100%;\n  margin: auto;\n\n  margin-top: 50px;\n  max-width: 600px;\n  transition: transform 0.5s;\n\n  &:hover {\n    transform: scale(1.03);\n  }\n`;\n\nconst LinkStyled = styled.a`\n  font-size: 14px;\n  color: #49b3e0;\n  transition: color 0.5s;\n  width: 100%;\n  /* display: flex;\n  justify-content: center;\n  align-items: center; */\n  text-align: center;\n  &:hover {\n    color: #00b3ff;\n  }\n`;\n\nconst ErasmusImage = styled.div`\n  width: 100%;\n  height: 100px;\n  background-color: white;\n  background-position: center;\n  background-size: contain;\n  background-repeat: no-repeat;\n  background-image: url(${ErasmusLogo});\n  border-radius: 8px;\n  margin-bottom: 16px;\n  margin-top: 80px;\n`;\n\nconst Erasmus = styled.div`\n  max-width: 500px;\n  padding: 4px 0px;\n  margin: auto;\n  /* margin: 4px 0px; */\n  font-size: 14px;\n  text-align: justify;\n`;\n\nexport default withChangeAnimation(HomePage);\n","import { gql } from \"@apollo/client\";\n\nexport const AUTO_ASSIGN_GROUPS = gql`\nmutation autoAssignGroupsMutation($gameId: String!) {\n  autoAssignGroups(gameId: $gameId) {\n    id\n  }\n}\n`;","import { gql } from \"@apollo/client\";\n\nexport const GAME_DETAILS_GET_GAME_BY_ID = gql`\n  query gameDetailsGetGameByIdQuery($gameId: String!) {\n    game(id: $gameId) {\n      id\n      name\n      startDate\n      endDate\n\n      archival\n      private\n\n      players {\n        id\n        stats {\n          nrOfSubmissions\n          nrOfValidations\n          nrOfSubmissionsByActivity\n          nrOfValidationsByActivity\n          nrOfSubmissionsByActivityAndResult\n          nrOfValidationsByActivityAndResult\n        }\n      }\n      createdAt\n    }\n  }\n`;\n","import { gql } from \"@apollo/client\";\n\nexport const GET_OVERALL_STATS = gql`\n  query getOverallStats($gameId: String!, $groupId: String) {\n    stats(gameId: $gameId, groupId: $groupId) {\n      nrOfSubmissions\n      nrOfValidations\n    }\n  }\n`;\n","import { gql } from \"@apollo/client\";\n\nexport const REMOVE_MULTIPLE_FROM_GROUP = gql`\n  mutation removeMultipleFromGroupMutation(\n    $gameId: String!\n    $playersIds: [String!]!\n  ) {\n    removeMultipleFromGroup(gameId: $gameId, playersIds: $playersIds) {\n      id\n    }\n  }\n`;\n","import { ChevronRightIcon } from \"@chakra-ui/icons\";\nimport { Badge, Flex, Heading, useColorMode } from \"@chakra-ui/react\";\nimport React from \"react\";\n\nconst DetailsCard = ({\n  title,\n  content,\n  flexDirection,\n  badgeContent,\n  active,\n  noMargins,\n  darkerBorder,\n  onClick,\n}: {\n  title: string;\n  content: string;\n  flexDirection?: \"column\" | \"row\";\n  badgeContent?: boolean;\n  active?: boolean;\n  noMargins?: boolean;\n  darkerBorder?: boolean;\n  onClick?: () => void;\n}) => {\n  const { colorMode } = useColorMode();\n\n  return (\n    <Flex\n      cursor={active ? \"pointer\" : \"unset\"}\n      onClick={onClick}\n      width=\"100%\"\n      border=\"1px solid\"\n      borderColor={\n        colorMode === \"dark\"\n          ? darkerBorder\n            ? \"gray.800\"\n            : \"gray.700\"\n          : \"gray.200\"\n      }\n      padding={2}\n      fontSize={14}\n      margin={{ base: 0, md: noMargins ? 0 : 2 }}\n      marginBottom={{ base: 2, md: noMargins ? 0 : 2 }}\n      borderRadius={4}\n      direction={flexDirection ? flexDirection : \"column\"}\n      justifyContent={flexDirection !== \"row\" ? \"center\" : \"space-between\"}\n      alignItems={flexDirection !== \"row\" ? \"flex-start\" : \"center\"}\n      position=\"relative\"\n      _hover={\n        active\n          ? { borderColor: colorMode === \"dark\" ? \"gray.500\" : \"gray.400\" }\n          : undefined\n      }\n      transition=\"border-color 0.5s\"\n    >\n      <Heading as=\"h4\" size=\"sm\" fontSize={16}>\n        {title}\n      </Heading>\n      {badgeContent ? <Badge>{content}</Badge> : content}\n      {active && (\n        <ChevronRightIcon position=\"absolute\" fontSize={24} right={4} />\n      )}\n    </Flex>\n  );\n};\n\nexport default DetailsCard;\n","import { Flex } from \"@chakra-ui/layout\";\nimport { Button } from \"@chakra-ui/react\";\nimport React, { useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { BiRefresh } from \"react-icons/bi\";\nimport { MdDone } from \"react-icons/md\";\nimport { useNotifications } from \"./Notifications\";\n\nconst RefreshCacheMenu = ({\n  refetch,\n  loading,\n  size,\n}: {\n  refetch: () => Promise<any>;\n  loading: boolean;\n  size?: string;\n}) => {\n  const { add: addNotification } = useNotifications();\n  const { t } = useTranslation();\n\n  const [internalLoading, setInternalLoading] = useState(false);\n  const [refetched, setRefetched] = useState(false);\n\n  const refetchAndChangeState = async () => {\n    setInternalLoading(true);\n    try {\n      await refetch();\n      setRefetched(true);\n    } catch (err) {\n      addNotification({\n        status: \"error\",\n        title: t(\"error.title\"),\n        description: t(\"error.description\"),\n      });\n      setRefetched(false);\n    }\n    setInternalLoading(false);\n  };\n\n  return (\n    <Flex justifyContent=\"flex-end\">\n      <Button\n        isLoading={internalLoading || loading}\n        loadingText={t(\"Loading\")}\n        leftIcon={\n          refetched && !internalLoading && !loading ? <MdDone /> : <BiRefresh />\n        }\n        size={size ? size : \"sm\"}\n        onClick={() => {\n          refetchAndChangeState();\n        }}\n      >\n        {refetched && !internalLoading && !loading\n          ? t(\"Refreshed\")\n          : t(\"Refresh\")}\n      </Button>\n    </Flex>\n  );\n};\n\nexport default RefreshCacheMenu;\n","import { gql } from \"@apollo/client\";\n\nexport const GET_ACTIVITY_STATS_AND_CHALLENGE_NAMES = gql`\n  query activityStatsAndChallengeNamesQuery(\n    $gameId: String!\n    $groupId: String\n  ) {\n    game(id: $gameId) {\n      id\n\n      challenges {\n        name\n        refs {\n          name\n          id\n        }\n      }\n    }\n\n    stats(gameId: $gameId, groupId: $groupId) {\n      nrOfSubmissions\n      nrOfValidations\n      nrOfSubmissionsByActivity\n      nrOfValidationsByActivity\n      nrOfSubmissionsByActivityAndResult\n      nrOfValidationsByActivityAndResult\n    }\n  }\n`;\n","import { useQuery } from \"@apollo/client\";\nimport { Box, Skeleton } from \"@chakra-ui/react\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport React, { useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { activityStatsAndChallengeNamesQuery } from \"../../generated/activityStatsAndChallengeNamesQuery\";\nimport { getGameByIdQuery_game_challenges_refs } from \"../../generated/getGameByIdQuery\";\nimport { GET_ACTIVITY_STATS_AND_CHALLENGE_NAMES } from \"../../graphql/getActivityStatsAndChallengeNames\";\nimport { checkIfConnectionAborted } from \"../../utilities/ErrorMessages\";\nimport Error from \"../Error\";\nimport RefreshCacheMenu from \"../RefreshCacheMenu\";\nimport TableComponent from \"../TableComponent\";\nimport ColumnFilter from \"../TableComponent/ColumnFilter\";\n\nconst getActivitiesList = (gameData: activityStatsAndChallengeNamesQuery) => {\n  let activities: getGameByIdQuery_game_challenges_refs[] = [];\n  gameData.game.challenges.forEach((challenge) => {\n    challenge.refs.forEach((ref) => {\n      activities.push(ref);\n    });\n  });\n\n  return activities;\n};\n\ninterface StatsInterface {\n  id: string;\n  nrOfSubmissionsByActivity: number;\n  nrOfSubmissionsByActivityAndResult: { ACCEPT: number; WRONG_ANSWER: number };\n}\n\nconst getActivitiesStats = (\n  statsData: activityStatsAndChallengeNamesQuery,\n  activitiesList: getGameByIdQuery_game_challenges_refs[]\n) => {\n  const stats = statsData.stats;\n  let activitiesStatsArray: StatsInterface[] = [];\n\n  activitiesList.forEach(({ name, id }) => {\n    if (name && id) {\n      const activityWithStats: StatsInterface = {\n        id: name,\n        nrOfSubmissionsByActivity: stats.nrOfSubmissionsByActivity[id]\n          ? stats.nrOfSubmissionsByActivity[id]\n          : 0,\n        nrOfSubmissionsByActivityAndResult: stats\n          .nrOfSubmissionsByActivityAndResult[id]\n          ? stats.nrOfSubmissionsByActivityAndResult[id]\n          : 0,\n      };\n\n      activitiesStatsArray.push(activityWithStats);\n    }\n  });\n\n  return activitiesStatsArray;\n};\n\nconst ActivitiesStats = ({ gameId }: { gameId: string }) => {\n  const { t } = useTranslation();\n  const [isRefreshing, setIsRefreshing] = useState(false);\n\n  const {\n    data: statsData,\n    error: statsError,\n    loading: statsLoading,\n    refetch: refetchStats,\n  } = useQuery<activityStatsAndChallengeNamesQuery>(\n    GET_ACTIVITY_STATS_AND_CHALLENGE_NAMES,\n    {\n      variables: {\n        gameId,\n      },\n      skip: !gameId,\n      fetchPolicy: \"cache-first\",\n      onError: async (err) => {\n        const isServerConnectionError = checkIfConnectionAborted(err);\n        if (isServerConnectionError) {\n          setIsRefreshing(true);\n          await refetchStats();\n          setIsRefreshing(false);\n        }\n      },\n    }\n  );\n\n  if (!statsData && !statsLoading) {\n    return <Error errorContent={statsError} />;\n  }\n\n  return (\n    <Box>\n      <AnimatePresence>\n        {statsError && !isRefreshing && (\n          <motion.div\n            initial={{ maxHeight: 0, opacity: 0 }}\n            animate={{ maxHeight: 50, opacity: 1 }}\n            exit={{ maxHeight: 0, opacity: 0 }}\n            style={{ width: \"100%\", textAlign: \"center\" }}\n          >\n            {t(\"error.title\")}\n            <br /> {t(\"error.description\")}\n          </motion.div>\n        )}\n      </AnimatePresence>\n      <Skeleton isLoaded={!statsLoading && !statsError}>\n        <Box minH={200}>\n          {statsData && !statsLoading && !statsError && (\n            <TableComponent\n              refreshData={refetchStats}\n              contextMenu={\n                <RefreshCacheMenu\n                  loading={statsLoading}\n                  refetch={refetchStats}\n                />\n              }\n              columns={[\n                {\n                  Header: t(\"table.Exercise\"),\n                  accessor: \"id\",\n                  Filter: ({ column }: { column: any }) => (\n                    <ColumnFilter\n                      column={column}\n                      placeholder={t(\"placeholders.exercise\")}\n                    />\n                  ),\n                },\n                {\n                  Header: t(\"table.totalSubmissions\"),\n                  accessor: \"nrOfSubmissionsByActivity\",\n                  disableFilters: true,\n                },\n                {\n                  Header: t(\"table.acceptedResults\"),\n                  accessor: \"nrOfSubmissionsByActivityAndResult.ACCEPT\",\n                  Cell: ({ value }: { value: any }) => (value ? value : 0),\n                  disableFilters: true,\n                },\n                {\n                  Header: t(\"table.difficulty\"),\n                  accessor: (row: any) => {\n                    // console.log(\"row\", row);\n                    const acceptedSubmissions =\n                      row.nrOfSubmissionsByActivityAndResult.ACCEPT || 0;\n                    const totalSubmissions = row.nrOfSubmissionsByActivity;\n\n                    return `${\n                      totalSubmissions > 0\n                        ? `${(\n                            100 -\n                            (acceptedSubmissions / totalSubmissions) * 100\n                          ).toFixed(1)}%`\n                        : \"-\"\n                    }`;\n                  },\n                  disableFilters: true,\n                },\n              ]}\n              data={getActivitiesStats(statsData, getActivitiesList(statsData))}\n            />\n          )}\n        </Box>\n      </Skeleton>\n    </Box>\n  );\n};\n\nexport default ActivitiesStats;\n","import {\n  Flex,\n  FormControl,\n  FormLabel,\n  Input,\n  Collapse,\n} from \"@chakra-ui/react\";\nimport React from \"react\";\nimport dayjs from \"dayjs\";\nimport customParseFormat from \"dayjs/plugin/customParseFormat\";\nimport { useTranslation } from \"react-i18next\";\n\ndayjs.extend(customParseFormat);\n\nexport const isDateValid = (date: string) => {\n  return dayjs(date, \"YYYY-MM-DD\", true).isValid();\n};\n\ninterface StartAndEndDateInputI {\n  startDateError: boolean;\n  startDate: string;\n  endDateError: boolean;\n  setEndDateError: (value: boolean) => void;\n  setStartDateError: (value: boolean) => void;\n  endDate: string;\n  setStartDate: (value: string) => void;\n  setEndDate: (value: string) => void;\n  isEndLaterThanStart: boolean;\n  setEndLaterThanStart: (value: boolean) => void;\n}\n\nconst StartAndEndDateInput = ({\n  startDate,\n  startDateError,\n  endDate,\n  endDateError,\n  isEndLaterThanStart,\n  setEndLaterThanStart,\n  setStartDate,\n  setStartDateError,\n  setEndDate,\n  setEndDateError,\n}: StartAndEndDateInputI) => {\n  const { t } = useTranslation();\n\n  const validateAndSetStartDate = (value: string) => {\n    if (isDateValid(value)) {\n      if (endDate) {\n        setEndLaterThanStart(\n          dayjs(endDate, \"YYYY-MM-DD\").isAfter(dayjs(value, \"YYYY-MM-DD\"))\n        );\n      }\n\n      setStartDateError(false);\n    } else {\n      setStartDateError(true);\n    }\n\n    setStartDate(value);\n  };\n\n  const validateAndSetEndDate = (value: string) => {\n    if (isDateValid(value)) {\n      if (startDate) {\n        setEndLaterThanStart(\n          dayjs(value, \"YYYY-MM-DD\").isAfter(dayjs(startDate, \"YYYY-MM-DD\"))\n        );\n      }\n\n      setEndDateError(false);\n    } else {\n      setEndDateError(true);\n    }\n\n    setEndDate(value);\n  };\n\n  return (\n    <>\n      <Flex>\n        <FormControl paddingRight={1}>\n          <FormLabel id=\"start\">{t(\"addGame.startDate\")}</FormLabel>\n          <Input\n            isInvalid={!!(startDateError && startDate)}\n            value={startDate || \"\"}\n            type=\"text\"\n            placeholder=\"YYYY-MM-DD\"\n            onChange={(e) => validateAndSetStartDate(e.target.value)}\n          />\n        </FormControl>\n\n        <FormControl paddingLeft={1}>\n          <FormLabel id=\"end\">{t(\"addGame.endDate\")}</FormLabel>\n          <Input\n            isInvalid={!!(endDateError && endDate)}\n            type=\"text\"\n            placeholder=\"YYYY-MM-DD\"\n            value={endDate}\n            onChange={(e) => validateAndSetEndDate(e.target.value)}\n          />\n        </FormControl>\n      </Flex>\n\n      <Collapse in={!isEndLaterThanStart} animateOpacity>\n        <p style={{ color: \"red\", textAlign: \"center\" }}>\n          {t(\"addGame.error.startLaterThanEnd\")}\n        </p>\n      </Collapse>\n    </>\n  );\n};\n\nexport default StartAndEndDateInput;\n","import { gql } from \"@apollo/client\";\n\nexport const CHANGE_GAME_END_DATE = gql`\n  mutation changeGameEndDateMutation($endDate: Date!, $gameId: String!) {\n    changeEndDate(gameId: $gameId, endDate: $endDate) {\n      id\n    }\n  }\n`;\n","import { gql } from \"@apollo/client\";\n\nexport const CHANGE_GAME_START_DATE = gql`\n  mutation changeGameStartDateMutation($startDate: Date!, $gameId: String!) {\n    changeStartDate(gameId: $gameId, startDate: $startDate) {\n      id\n    }\n  }\n`;\n","import { gql } from \"@apollo/client\";\n\nexport const SET_GAME_AVAILABILITY = gql`\n  mutation setGameAvailabilityMutation($gameId: String!, $isPrivate: Boolean!) {\n    setAvailability(gameId: $gameId, isPrivate: $isPrivate) {\n      id\n    }\n  }\n`;\n","import { gql } from \"@apollo/client\";\n\nexport const SET_GAME_ARCHIVAL = gql`\n  mutation setGameArchivalMutation($gameId: String!, $isArchival: Boolean!) {\n    setArchival(gameId: $gameId, isArchival: $isArchival) {\n      id\n    }\n  }\n`;\n","import {\n  Modal,\n  ModalOverlay,\n  ModalContent,\n  ModalHeader,\n  ModalCloseButton,\n  ModalBody,\n  ModalFooter,\n  Button,\n  FormControl,\n  FormLabel,\n  Input,\n  Checkbox,\n  Switch,\n  Flex,\n} from \"@chakra-ui/react\";\nimport React, { useEffect, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport dayjs from \"dayjs\";\nimport customParseFormat from \"dayjs/plugin/customParseFormat\";\nimport { isDateValid } from \"../AddGameModal\";\nimport StartAndEndDateInput from \"../StartAndEndDateInput\";\nimport { CHANGE_GAME_END_DATE } from \"../../graphql/changeGameEndDate\";\nimport { changeGameEndDateMutation } from \"../../generated/changeGameEndDateMutation\";\nimport { useMutation } from \"@apollo/client\";\nimport { CHANGE_GAME_START_DATE } from \"../../graphql/changeGameStartDate\";\nimport { changeGameStartDateMutation } from \"../../generated/changeGameStartDateMutation\";\nimport { SET_GAME_AVAILABILITY } from \"../../graphql/setGameAvailability\";\nimport { setGameAvailabilityMutation } from \"../../generated/setGameAvailabilityMutation\";\nimport { SET_GAME_ARCHIVAL } from \"../../graphql/setGameArchival\";\nimport { setGameArchivalMutation } from \"../../generated/setGameArchivalMutation\";\ndayjs.extend(customParseFormat);\n\nconst ChangeDetailsModal = ({\n  isOpen,\n  onClose,\n  isGamePrivate,\n  isGameArchival,\n  gameId,\n  defaultStartDate,\n  defaultEndDate,\n  refetchGame,\n}: {\n  isOpen: boolean;\n  onClose: () => void;\n  isGamePrivate: boolean;\n  isGameArchival: boolean;\n  gameId: string;\n  defaultStartDate: string;\n  defaultEndDate: string;\n  refetchGame: () => Promise<any>;\n}) => {\n  const { t } = useTranslation();\n\n  const [loading, setLoading] = useState(false);\n\n  const [gamePrivate, setGamePrivate] = useState(isGamePrivate);\n  const [gameArchival, setGameArchival] = useState(isGameArchival);\n\n  const [startDate, setStartDate] = useState(defaultStartDate || \"\");\n  const [startDateError, setStartDateError] = useState(false);\n\n  const [endDate, setEndDate] = useState(defaultEndDate || \"\");\n  const [endDateError, setEndDateError] = useState(false);\n\n  const [isEndLaterThanStart, setEndLaterThanStart] = useState(true);\n\n  const [setGameAvailability] = useMutation<setGameAvailabilityMutation>(\n    SET_GAME_AVAILABILITY\n  );\n\n  const [setGameArchivalMutate] =\n    useMutation<setGameArchivalMutation>(SET_GAME_ARCHIVAL);\n\n  const [changeGameStartDate] = useMutation<changeGameStartDateMutation>(\n    CHANGE_GAME_START_DATE\n  );\n\n  const [changeGameEndDate] =\n    useMutation<changeGameEndDateMutation>(CHANGE_GAME_END_DATE);\n\n  useEffect(() => {\n    setEndDate(defaultEndDate || \"\");\n    setStartDate(defaultStartDate || \"\");\n  }, [isOpen]);\n\n  const changeGameDetails = async () => {\n    setLoading(true);\n\n    if (startDate && !startDateError) {\n      await changeGameStartDate({\n        variables: {\n          gameId,\n          startDate,\n        },\n      });\n    }\n\n    if (endDate && !endDateError) {\n      await changeGameEndDate({\n        variables: {\n          gameId,\n          endDate,\n        },\n      });\n    }\n\n    if (gamePrivate !== isGamePrivate) {\n      await setGameAvailability({\n        variables: {\n          gameId,\n          isPrivate: gamePrivate,\n        },\n      });\n    }\n\n    if (gameArchival !== isGameArchival) {\n      await setGameArchivalMutate({\n        variables: {\n          gameId,\n          isArchival: gameArchival,\n        },\n      });\n    }\n\n    await refetchGame();\n    onClose();\n    setLoading(false);\n  };\n\n  return (\n    <Modal isOpen={isOpen} onClose={onClose}>\n      <ModalOverlay />\n      <ModalContent>\n        <ModalHeader>{t(\"Change availability\")}</ModalHeader>\n        <ModalCloseButton />\n        <ModalBody>\n          <StartAndEndDateInput\n            startDate={startDate}\n            endDate={endDate}\n            setStartDate={setStartDate}\n            setEndDate={setEndDate}\n            setEndDateError={setEndDateError}\n            setStartDateError={setStartDateError}\n            isEndLaterThanStart={isEndLaterThanStart}\n            setEndLaterThanStart={setEndLaterThanStart}\n            startDateError={startDateError}\n            endDateError={endDateError}\n          />\n          <Flex justifyContent=\"flex-start\" width=\"100%\">\n            <Checkbox\n              isChecked={gamePrivate}\n              size=\"md\"\n              marginTop={4}\n              fontWeight={500}\n              onChange={(value) => {\n                setGamePrivate(value.target.checked);\n              }}\n            >\n              {t(\"addGame.setPrivate\")}\n            </Checkbox>\n            <Checkbox\n              isChecked={gameArchival}\n              size=\"md\"\n              marginTop={4}\n              fontWeight={500}\n              onChange={(value) => {\n                setGameArchival(value.target.checked);\n              }}\n              marginLeft={4}\n            >\n              {t(\"addGame.setArchival\")}\n            </Checkbox>\n          </Flex>\n        </ModalBody>\n\n        <ModalFooter>\n          <Button\n            variant=\"outline\"\n            marginRight={2}\n            colorScheme=\"blue\"\n            onClick={onClose}\n          >\n            {t(\"Close\")}\n          </Button>\n          <Button\n            isLoading={loading}\n            colorScheme=\"blue\"\n            onClick={changeGameDetails}\n            disabled={\n              !(\n                (startDate ? !startDateError : true) &&\n                (endDate ? !endDateError : true) &&\n                (startDate || endDate ? isEndLaterThanStart : true)\n              )\n            }\n          >\n            {t(\"Submit\")}\n          </Button>\n        </ModalFooter>\n      </ModalContent>\n    </Modal>\n  );\n};\n\nexport default ChangeDetailsModal;\n","import { gql } from \"@apollo/client\";\n\nexport const GET_STUDENTS_DETAILS_BY_GAME_ID = gql`\n  query getStudentsDetailsByGameIdQuery($gameId: String!) {\n    game(id: $gameId) {\n      id\n      groups {\n        id\n        name\n        displayName\n      }\n\n      players {\n        group {\n          name\n        }\n        id\n        stats {\n          nrOfSubmissions\n          nrOfValidations\n        }\n        user {\n          id\n          firstName\n          lastName\n        }\n        learningPath {\n          progress\n        }\n      }\n    }\n  }\n`;\n","import { gql, useMutation } from \"@apollo/client\";\nimport {\n  Button,\n  FormControl,\n  FormLabel,\n  Input,\n  Modal,\n  ModalBody,\n  ModalCloseButton,\n  ModalContent,\n  ModalFooter,\n  ModalHeader,\n  ModalOverlay,\n  VStack,\n} from \"@chakra-ui/react\";\nimport React, { useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { useNotifications } from \"../Notifications\";\n\nconst ADD_GROUP = gql`\n  mutation addGroupMutation(\n    $gameId: String!\n    $groupName: String!\n    $groupDisplayName: String!\n  ) {\n    saveGroup(\n      gameId: $gameId\n      groupInput: { name: $groupName, displayName: $groupDisplayName }\n    ) {\n      id\n      name\n      displayName\n    }\n  }\n`;\n\nconst AddGroupModal = ({\n  isOpen,\n  onClose,\n  gameId,\n}: {\n  isOpen: boolean;\n  onClose: () => void;\n  gameId: string;\n}) => {\n  const { add: addNotification } = useNotifications();\n\n  const { t } = useTranslation();\n\n  const [name, setName] = useState(\"\");\n  const [displayName, setDisplayName] = useState(\"\");\n\n  const [addNewGroup, { data: addGroupData, loading: addGroupLoading }] =\n    useMutation(ADD_GROUP);\n\n  return (\n    <Modal isOpen={isOpen} onClose={onClose}>\n      <ModalOverlay />\n      <ModalContent>\n        <ModalHeader>{t(\"Add new group\")}</ModalHeader>\n        <ModalCloseButton />\n        <ModalBody>\n          <VStack spacing={1}>\n            <FormControl id=\"name\" isRequired>\n              <FormLabel>{t(\"Name\")}</FormLabel>\n              <Input\n                placeholder={t(\"placeholders.groupName\")}\n                value={name}\n                onChange={(e) => {\n                  setName(e.target.value);\n                }}\n              />\n            </FormControl>\n\n            <FormControl id=\"name\" isRequired>\n              <FormLabel>{t(\"Display name\")}</FormLabel>\n              <Input\n                placeholder={t(\"placeholders.displayGroupName\")}\n                value={displayName}\n                onChange={(e) => {\n                  setDisplayName(e.target.value);\n                }}\n              />\n            </FormControl>\n          </VStack>\n        </ModalBody>\n\n        <ModalFooter>\n          <Button mr={3} onClick={onClose} variant=\"outline\">\n            {t(\"Close\")}\n          </Button>\n          <Button\n            colorScheme=\"blue\"\n            isLoading={addGroupLoading}\n            disabled={!displayName || !name || addGroupLoading}\n            onClick={async () => {\n              try {\n                await addNewGroup({\n                  variables: {\n                    gameId,\n                    groupName: name,\n                    groupDisplayName: displayName,\n                  },\n                });\n\n                addNotification({\n                  status: \"success\",\n                  title: t(\"success.addGroup.title\"),\n                  description: t(\"success.addGroup.description\"),\n                });\n                onClose();\n              } catch (err) {\n                addNotification({\n                  status: \"error\",\n                  title: t(\"error.addGroup.title\"),\n                  description: t(\"error.addGroup.description\"),\n                });\n              }\n            }}\n          >\n            {t(\"Add\")}\n          </Button>\n        </ModalFooter>\n      </ModalContent>\n    </Modal>\n  );\n};\n\nexport default AddGroupModal;\n","import { gql } from \"@apollo/client\";\n\nexport const SET_GROUP_FOR_MULTIPLE = gql`\n  mutation setGroupForMultipleMutation(\n    $gameId: String!\n    $groupId: String!\n    $playersIds: [String!]!\n  ) {\n    setGroupForMultiple(\n      gameId: $gameId\n      groupId: $groupId\n      playersIds: $playersIds\n    ) {\n      id\n    }\n  }\n`;\n","import { useMutation } from \"@apollo/client\";\nimport {\n  Button,\n  Modal,\n  ModalBody,\n  ModalCloseButton,\n  ModalContent,\n  ModalFooter,\n  ModalHeader,\n  ModalOverlay,\n  Select,\n} from \"@chakra-ui/react\";\nimport React, { useEffect, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { getGameByIdQuery_game_groups } from \"../../generated/getGameByIdQuery\";\nimport { setGroupForMultipleMutation } from \"../../generated/setGroupForMultipleMutation\";\nimport { SET_GROUP_FOR_MULTIPLE } from \"../../graphql/setGroupForMultiple\";\n\nconst SetGroupModal = ({\n  isOpen,\n  onClose,\n  gameId,\n  groupsData,\n  selectedStudentsRef,\n  refetch,\n}: {\n  isOpen: boolean;\n  onClose: () => void;\n  gameId: string;\n  groupsData: getGameByIdQuery_game_groups[];\n  selectedStudentsRef: any;\n  refetch: () => Promise<any>;\n}) => {\n  const { t } = useTranslation();\n  const [loading, setLoading] = useState(false);\n  const [groupId, setGroupId] = useState(\"\");\n\n  const [\n    setGroupForMultiple,\n    { data: setGroupData, loading: setGroupLoading },\n  ] = useMutation<setGroupForMultipleMutation>(SET_GROUP_FOR_MULTIPLE);\n\n  const [selectedStudents, setSelectedStudents] = useState<any[]>([]);\n\n  const setGroupLoop = async () => {\n    setLoading(true);\n\n    const selectedStudentsIds = selectedStudents.map((student) => student.id);\n    await setGroupForMultiple({\n      variables: {\n        gameId,\n        groupId,\n        playersIds: selectedStudentsIds,\n      },\n    });\n\n    await refetch();\n    setLoading(false);\n    onClose();\n  };\n\n  useEffect(() => {\n    setSelectedStudents(selectedStudentsRef.current);\n  }, [isOpen]);\n\n  return (\n    <Modal isOpen={isOpen} onClose={onClose}>\n      <ModalOverlay />\n      <ModalContent>\n        <ModalHeader>{t(\"Set group\")}</ModalHeader>\n        <ModalCloseButton />\n        <ModalBody>\n          {t(\"youveChosenAmountStudents\", {\n            amount: selectedStudents.length,\n          })}\n          <Select\n            value={groupId}\n            onChange={(e) => setGroupId(e.target.value)}\n            placeholder={t(\"placeholders.chooseGroup\")}\n          >\n            {groupsData.map((group, i) => {\n              return (\n                <option value={group.id} key={i}>\n                  {group.displayName} ({group.name})\n                </option>\n              );\n            })}\n          </Select>\n        </ModalBody>\n\n        <ModalFooter>\n          <Button variant=\"outline\" mr={3} onClick={onClose}>\n            {t(\"Close\")}\n          </Button>\n          <Button\n            colorScheme=\"blue\"\n            onClick={setGroupLoop}\n            disabled={loading || !groupId}\n            isLoading={loading}\n          >\n            {t(\"Set\")}\n          </Button>\n        </ModalFooter>\n      </ModalContent>\n    </Modal>\n  );\n};\n\nexport default SetGroupModal;\n","import {\n  ApolloQueryResult,\n  FetchResult,\n  MutationFunctionOptions,\n  OperationVariables,\n  useQuery,\n} from \"@apollo/client\";\nimport { ChevronDownIcon } from \"@chakra-ui/icons\";\nimport {\n  Box,\n  Button,\n  Flex,\n  Menu,\n  MenuButton,\n  MenuItem,\n  MenuList,\n  Skeleton,\n  useDisclosure,\n} from \"@chakra-ui/react\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport React, { useMemo, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { useHistory } from \"react-router-dom\";\nimport { gameDetailsGetGameByIdQuery } from \"../../generated/gameDetailsGetGameByIdQuery\";\nimport { getGameByIdQuery_game_players } from \"../../generated/getGameByIdQuery\";\nimport { getStudentsDetailsByGameIdQuery } from \"../../generated/getStudentsDetailsByGameIdQuery\";\nimport { GET_STUDENTS_DETAILS_BY_GAME_ID } from \"../../graphql/getStudentsDetails\";\nimport { checkIfConnectionAborted } from \"../../utilities/ErrorMessages\";\nimport { useNotifications } from \"../Notifications\";\nimport RefreshCacheMenu from \"../RefreshCacheMenu\";\nimport TableComponent from \"../TableComponent\";\nimport ColumnFilter from \"../TableComponent/ColumnFilter\";\nimport AddGroupModal from \"./AddGroupModal\";\nimport SetGroupModal from \"./SetGroupModal\";\n\ninterface ContextI {\n  autoAssignGroupsLoading: boolean;\n  setLoading: (v: boolean) => void;\n  autoAssignGroups: (\n    options?: MutationFunctionOptions<any, OperationVariables> | undefined\n  ) => Promise<FetchResult<any, Record<string, any>, Record<string, any>>>;\n  refetchGame: (\n    variables?: Partial<OperationVariables> | undefined\n  ) => Promise<ApolloQueryResult<gameDetailsGetGameByIdQuery>>;\n  getSelectedStudentsAndRemoveFromGroups: () => Promise<void>;\n  getSelectedStudentAndRemoveFromGame: () => Promise<void>;\n  gameId: string;\n}\n\nconst Students = ({\n  gameId,\n  loading,\n  autoAssignGroupsLoading,\n  setLoading,\n  autoAssignGroups,\n  refetchGame,\n  getSelectedStudentsAndRemoveFromGroups,\n  getSelectedStudentAndRemoveFromGame,\n  selectedStudentsRef,\n}: {\n  gameId: string;\n  loading: boolean;\n  selectedStudentsRef: React.MutableRefObject<never[]>;\n} & ContextI) => {\n  const {\n    isOpen: isAddGroupModalOpen,\n    onOpen: onAddGroupModalOpen,\n    onClose: onAddGroupModalClose,\n  } = useDisclosure();\n\n  const {\n    isOpen: isSetGroupModalOpen,\n    onOpen: onSetGroupModalOpen,\n    onClose: onSetGroupModalClose,\n  } = useDisclosure();\n\n  const history = useHistory();\n  const memoizedSortFunc = useMemo(\n    () => (rowA: any, rowB: any) => {\n      const a =\n        rowA.original.learningPath\n          .flatMap((learningPath: any) => learningPath.progress)\n          .reduce((a: any, b: any) => a + b, 0) /\n        rowA.original.learningPath.length;\n\n      const b =\n        rowB.original.learningPath\n          .flatMap((learningPath: any) => learningPath.progress)\n          .reduce((a: any, b: any) => a + b, 0) /\n        rowB.original.learningPath.length;\n\n      if (a > b) return 1;\n\n      if (b > a) return -1;\n\n      return 0;\n    },\n    []\n  );\n\n  const [isStudentSelected, setIsStudentSelected] = useState<boolean>(false);\n  const [isRefreshing, setIsRefreshing] = useState(false);\n\n  const {\n    data: studentsDetailsData,\n    error: studentsDetailsError,\n    loading: studentsDetailsLoading,\n    refetch: refetchStudentsDetails,\n  } = useQuery<getStudentsDetailsByGameIdQuery>(\n    GET_STUDENTS_DETAILS_BY_GAME_ID,\n    {\n      variables: {\n        gameId,\n      },\n      skip: !gameId,\n      fetchPolicy: \"cache-first\",\n      onError: async (err) => {\n        const isServerConnectionError = checkIfConnectionAborted(err);\n        if (isServerConnectionError) {\n          setIsRefreshing(true);\n          await refetchStudentsDetails();\n          setIsRefreshing(false);\n        }\n      },\n    }\n  );\n\n  const { t } = useTranslation();\n\n  return (\n    <>\n      <AddGroupModal\n        isOpen={isAddGroupModalOpen}\n        onClose={onAddGroupModalClose}\n        gameId={gameId}\n      />\n      {studentsDetailsData && (\n        <SetGroupModal\n          gameId={gameId}\n          groupsData={studentsDetailsData.game.groups}\n          onClose={onSetGroupModalClose}\n          isOpen={isSetGroupModalOpen}\n          selectedStudentsRef={selectedStudentsRef}\n          refetch={refetchStudentsDetails}\n        />\n      )}\n      <Box>\n        <AnimatePresence>\n          {studentsDetailsError && !isRefreshing && (\n            <motion.div\n              initial={{ maxHeight: 0, opacity: 0 }}\n              animate={{ maxHeight: 50, opacity: 1 }}\n              exit={{ maxHeight: 0, opacity: 0 }}\n              style={{ width: \"100%\", textAlign: \"center\" }}\n            >\n              {t(\"error.title\")}\n              <br /> {t(\"error.description\")}\n            </motion.div>\n          )}\n        </AnimatePresence>\n\n        <Skeleton isLoaded={!studentsDetailsLoading && !studentsDetailsError}>\n          <Box minH={200}>\n            {studentsDetailsData &&\n              !studentsDetailsLoading &&\n              !studentsDetailsError && (\n                <TableComponent\n                  refreshData={refetchStudentsDetails}\n                  contextMenu={\n                    <>\n                      <ContextMenu\n                        studentsDetailsLoading={studentsDetailsLoading}\n                        refetchStudentsDetails={refetchStudentsDetails}\n                        autoAssignGroupsLoading={autoAssignGroupsLoading}\n                        setLoading={setLoading}\n                        autoAssignGroups={autoAssignGroups}\n                        refetchGame={refetchGame}\n                        isStudentSelected={isStudentSelected}\n                        onSetGroupModalOpen={onSetGroupModalOpen}\n                        getSelectedStudentsAndRemoveFromGroups={async () => {\n                          await getSelectedStudentsAndRemoveFromGroups();\n                          refetchStudentsDetails();\n                        }}\n                        getSelectedStudentAndRemoveFromGame={async () => {\n                          await getSelectedStudentAndRemoveFromGame();\n                          refetchStudentsDetails();\n                        }}\n                        gameId={gameId}\n                        onAddGroupModalOpen={onAddGroupModalOpen}\n                      />\n                    </>\n                  }\n                  loading={loading}\n                  onRowClick={(row: getGameByIdQuery_game_players) => {\n                    history.push({\n                      pathname: `/teacher/player-details/${row.user.id}/${gameId}`,\n                    });\n                  }}\n                  selectableRows\n                  setIsAnythingSelected={setIsStudentSelected}\n                  setSelectedStudents={(rows: any) => {\n                    selectedStudentsRef.current = rows;\n                  }}\n                  columns={[\n                    {\n                      Header: t(\"table.name\"),\n                      accessor: \"user.firstName\",\n                      Filter: ({ column }: { column: any }) => (\n                        <ColumnFilter\n                          column={column}\n                          placeholder={t(\"placeholders.name\")}\n                        />\n                      ),\n                    },\n                    {\n                      Header: t(\"table.lastName\"),\n                      accessor: \"user.lastName\",\n                      Filter: ({ column }: { column: any }) => (\n                        <ColumnFilter\n                          column={column}\n                          placeholder={t(\"placeholders.lastName\")}\n                        />\n                      ),\n                    },\n\n                    {\n                      Header: t(\"table.submissions\"),\n                      accessor: \"stats.nrOfSubmissions\",\n                      Filter: ({ column }: { column: any }) => (\n                        <ColumnFilter column={column} placeholder=\"123\" />\n                      ),\n                    },\n                    {\n                      Header: t(\"table.validations\"),\n                      accessor: \"stats.nrOfValidations\",\n                      Filter: ({ column }: { column: any }) => (\n                        <ColumnFilter column={column} placeholder=\"123\" />\n                      ),\n                    },\n                    {\n                      Header: t(\"table.group\"),\n                      accessor: \"group.name\",\n                      Cell: ({ value }: { value: any }) => {\n                        return value ? value : \"-\";\n                      },\n                      Filter: ({ column }: { column: any }) => (\n                        <ColumnFilter\n                          column={column}\n                          placeholder={t(\"table.group\")}\n                        />\n                      ),\n                    },\n                    {\n                      Header: t(\"table.progress\"),\n                      accessor: \"learningPath\",\n                      Cell: ({ value }: { value: any }) => {\n                        const totalChallengesCount = value.length || 1;\n\n                        const progressCombined =\n                          value\n                            .flatMap(\n                              (learningPath: any) => learningPath.progress\n                            )\n                            .reduce((a: any, b: any) => a + b, 0) /\n                          totalChallengesCount;\n\n                        return (progressCombined * 100).toFixed(1) + \"%\";\n                      },\n                      disableFilters: true,\n                      sortType: memoizedSortFunc,\n                    },\n                  ]}\n                  data={studentsDetailsData.game.players}\n                />\n              )}\n          </Box>\n        </Skeleton>\n      </Box>\n    </>\n  );\n};\n\nconst ContextMenu = ({\n  autoAssignGroupsLoading,\n  setLoading,\n  autoAssignGroups,\n  refetchGame,\n  isStudentSelected,\n  onSetGroupModalOpen,\n  getSelectedStudentsAndRemoveFromGroups,\n  getSelectedStudentAndRemoveFromGame,\n  gameId,\n  onAddGroupModalOpen,\n  studentsDetailsLoading,\n  refetchStudentsDetails,\n}: ContextI & {\n  isStudentSelected: boolean;\n  studentsDetailsLoading: boolean;\n  refetchStudentsDetails: () => Promise<any>;\n  onAddGroupModalOpen: () => void;\n  onSetGroupModalOpen: () => void;\n}) => {\n  const { add: addNotification } = useNotifications();\n  const { t } = useTranslation();\n\n  return (\n    <Flex justifyContent=\"flex-end\" marginBottom={4}>\n      <RefreshCacheMenu\n        loading={studentsDetailsLoading}\n        refetch={refetchStudentsDetails}\n      />\n      <Button\n        marginLeft={2}\n        marginRight={2}\n        size=\"sm\"\n        isLoading={autoAssignGroupsLoading}\n        disabled={autoAssignGroupsLoading}\n        onClick={async () => {\n          setLoading(true);\n          try {\n            await autoAssignGroups({\n              variables: {\n                gameId,\n              },\n            });\n            await refetchGame();\n          } catch (err) {\n            addNotification({\n              status: \"error\",\n              title: t(\"error.autoAssign.title\"),\n              description: t(\"error.autoAssign.description\"),\n            });\n          }\n          setLoading(false);\n        }}\n      >\n        {t(\"Auto-assign groups\")}\n      </Button>\n      <Button marginRight={2} size=\"sm\" onClick={onAddGroupModalOpen}>\n        {t(\"Add new group\")}\n      </Button>\n\n      <Menu>\n        <MenuButton\n          disabled={!isStudentSelected}\n          size=\"sm\"\n          as={Button}\n          rightIcon={<ChevronDownIcon />}\n        >\n          {t(\"Actions\")}\n        </MenuButton>\n\n        <MenuList>\n          <MenuItem onClick={onSetGroupModalOpen}>{t(\"Set group\")}</MenuItem>\n          <MenuItem onClick={getSelectedStudentsAndRemoveFromGroups}>\n            {t(\"Remove from the group\")}\n          </MenuItem>\n          <MenuItem onClick={getSelectedStudentAndRemoveFromGame}>\n            {t(\"Remove from the game\")}\n          </MenuItem>\n        </MenuList>\n      </Menu>\n    </Flex>\n  );\n};\n\nexport default Students;\n","import { useMutation, useQuery } from \"@apollo/client\";\nimport {\n  Accordion,\n  AccordionButton,\n  AccordionIcon,\n  AccordionItem,\n  AccordionPanel,\n  Alert,\n  AlertIcon,\n  Box,\n  Button,\n  Flex,\n  Heading,\n  HStack,\n  Tooltip,\n  useDisclosure,\n} from \"@chakra-ui/react\";\nimport dayjs from \"dayjs\";\nimport React, { useRef, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { Link, useParams } from \"react-router-dom\";\nimport { gameDetailsGetGameByIdQuery } from \"../../generated/gameDetailsGetGameByIdQuery\";\nimport { getGameByIdQuery_game_players } from \"../../generated/getGameByIdQuery\";\nimport { getOverallStats } from \"../../generated/getOverallStats\";\nimport { removeMultipleFromGameMutation } from \"../../generated/removeMultipleFromGameMutation\";\nimport { AUTO_ASSIGN_GROUPS } from \"../../graphql/autoAssignGroups\";\nimport { GAME_DETAILS_GET_GAME_BY_ID } from \"../../graphql/gameDetailsGetGameById\";\nimport { GET_OVERALL_STATS } from \"../../graphql/getOverallStats\";\nimport { REMOVE_MULTIPLE_FROM_GAME } from \"../../graphql/removeMultipleFromGame\";\nimport { REMOVE_MULTIPLE_FROM_GROUP } from \"../../graphql/removeMultipleFromGroup\";\nimport { checkIfConnectionAborted } from \"../../utilities/ErrorMessages\";\nimport withChangeAnimation from \"../../utilities/withChangeAnimation\";\nimport DetailsCard from \"../DetailsCard\";\nimport Error from \"../Error\";\nimport ExportGameCsvModal from \"../ExportGameCsvModal\";\nimport { useNotifications } from \"../Notifications\";\nimport RefreshCacheMenu from \"../RefreshCacheMenu\";\nimport ActivitiesStats from \"./ActivitiesStats\";\nimport ChangeDetailsModal from \"./ChangeDetailsModal\";\nimport Students from \"./Students\";\n\ninterface ParamTypes {\n  gameId: string;\n}\n\nconst InstructorGame = () => {\n  const [loading, setLoading] = useState(false);\n\n  const {\n    isOpen: isExportCsvModalOpen,\n    onOpen: onExportCsvModalOpen,\n    onClose: onExportCsvModalClose,\n  } = useDisclosure();\n\n  const {\n    isOpen: isDetailsModalOpen,\n    onOpen: onDetailsModalOpen,\n    onClose: onDetailsModalClose,\n  } = useDisclosure();\n\n  const { add: addNotification } = useNotifications();\n\n  const { gameId } = useParams<ParamTypes>();\n  const { t } = useTranslation();\n\n  const selectedStudentsRef = useRef([]);\n\n  const [removeMultipleFromGame] = useMutation<removeMultipleFromGameMutation>(\n    REMOVE_MULTIPLE_FROM_GAME\n  );\n\n  const [removeMultipleFromGroup] = useMutation(REMOVE_MULTIPLE_FROM_GROUP);\n\n  const [autoAssignGroups, { loading: autoAssignGroupsLoading }] =\n    useMutation(AUTO_ASSIGN_GROUPS);\n\n  const {\n    data: overallStatsData,\n    error: overallStatsError,\n    loading: overallStatsLoading,\n    refetch: refetchOverallStats,\n  } = useQuery<getOverallStats>(GET_OVERALL_STATS, {\n    variables: {\n      gameId,\n    },\n    skip: !gameId,\n    fetchPolicy: \"cache-first\",\n  });\n\n  const {\n    data: gameData,\n    error: gameError,\n    loading: gameLoading,\n    refetch: refetchGame,\n  } = useQuery<gameDetailsGetGameByIdQuery>(GAME_DETAILS_GET_GAME_BY_ID, {\n    variables: {\n      gameId,\n    },\n    skip: !gameId,\n    fetchPolicy: \"cache-first\",\n  });\n\n  if (!gameId) {\n    return <div>Game ID not provided</div>;\n  }\n\n  if (gameLoading || overallStatsLoading) {\n    return <div>{t(\"Loading\")}</div>;\n  }\n\n  if (!gameLoading && !overallStatsLoading && gameError) {\n    const isServerConnectionError = checkIfConnectionAborted(gameError);\n\n    if (isServerConnectionError) {\n      return <Error serverConnectionError />;\n    } else {\n      return <Error errorContent={gameError || overallStatsError} />;\n    }\n  }\n\n  if (!gameData || !overallStatsData) {\n    return (\n      <Error status=\"warning\" errorContent={gameError || overallStatsError} />\n    );\n  }\n\n  const getSelectedPlayers = () => {\n    console.log(\"getting selected players\", selectedStudentsRef);\n    return selectedStudentsRef.current.map(\n      (student: getGameByIdQuery_game_players) => student.id\n    );\n  };\n\n  const getSelectedUsers = () => {\n    return selectedStudentsRef.current.map(\n      (student: getGameByIdQuery_game_players) => student.user.id\n    );\n  };\n\n  const getSelectedStudentAndRemoveFromGame = async () => {\n    setLoading(true);\n    const selectedStudentsUserIds = getSelectedUsers();\n    try {\n      await removeMultipleFromGame({\n        variables: {\n          gameId,\n          usersIds: selectedStudentsUserIds,\n        },\n      });\n\n      await refetchGame();\n    } catch (err) {\n      addNotification({\n        status: \"error\",\n        title: t(\"error.removePlayers.title\"),\n        description: t(\"error.removePlayers.description\"),\n      });\n    }\n    setLoading(false);\n  };\n\n  const getSelectedStudentsAndRemoveFromGroups = async () => {\n    setLoading(true);\n    const selectedStudentsPlayerIds = getSelectedPlayers();\n    try {\n      await removeMultipleFromGroup({\n        variables: {\n          gameId,\n          playersIds: selectedStudentsPlayerIds,\n        },\n      });\n\n      await refetchGame();\n    } catch (err) {\n      addNotification({\n        status: \"error\",\n        title: t(\"error.title\"),\n        description: t(\"error.description\"),\n      });\n    }\n    setLoading(false);\n  };\n\n  return (\n    <>\n      <ExportGameCsvModal\n        isOpen={isExportCsvModalOpen}\n        onOpen={onExportCsvModalOpen}\n        onClose={onExportCsvModalClose}\n        gameId={gameId}\n        gameName={gameData.game.name}\n      />\n\n      <ChangeDetailsModal\n        defaultStartDate={gameData.game.startDate}\n        defaultEndDate={gameData.game.endDate}\n        gameId={gameId}\n        isOpen={isDetailsModalOpen}\n        onClose={onDetailsModalClose}\n        isGamePrivate={gameData.game.private}\n        refetchGame={refetchGame}\n        isGameArchival={gameData.game.archival}\n      />\n\n      <div>\n        {gameData.game.archival && (\n          <Alert status=\"warning\" marginBottom={2}>\n            <AlertIcon />\n            {t(\"This is an archival game\")}\n          </Alert>\n        )}\n        {gameData.game.players.length < 1 && (\n          <Alert status=\"info\">\n            <AlertIcon />\n            {t(\"teacher.noPlayersAlert\")}\n          </Alert>\n        )}\n        <Flex width=\"100%\" justifyContent=\"space-between\" alignItems=\"center\">\n          <Box>\n            <Heading as=\"h3\" size=\"md\" marginTop={5} marginBottom={5}>\n              {t(\"Game\")}: {gameData.game.name}\n            </Heading>\n          </Box>\n          <HStack>\n            <Link\n              to={{\n                pathname: \"/profile\",\n              }}\n            >\n              <Button variant=\"outline\">{t(\"Back\")}</Button>\n            </Link>\n\n            <RefreshCacheMenu\n              loading={gameLoading}\n              refetch={async () => {\n                await refetchOverallStats();\n                await refetchGame();\n              }}\n              size=\"md\"\n            />\n            <Button onClick={onDetailsModalOpen}>\n              {t(\"Change availability\")}\n            </Button>\n            <Link\n              to={{\n                pathname: `/teacher/game/${gameId}/add-players`,\n              }}\n            >\n              {gameData.game.archival ? (\n                <Tooltip\n                  label={t(\"This is an archival game\")}\n                  aria-label=\"A tooltip\"\n                  bg=\"gray.300\"\n                  color=\"black\"\n                  hasArrow\n                >\n                  <Box>\n                    <Button disabled={gameData.game.archival}>\n                      {t(\"Add or remove players\")}\n                    </Button>\n                  </Box>\n                </Tooltip>\n              ) : (\n                <Button>{t(\"Add or remove players\")}</Button>\n              )}\n            </Link>\n            <Button onClick={onExportCsvModalOpen}>CSV</Button>\n          </HStack>\n        </Flex>\n\n        <Flex\n          margin=\"auto\"\n          width=\"100%\"\n          justifyContent=\"space-between\"\n          flexDirection={{ base: \"column\", md: \"row\" }}\n        >\n          <DetailsCard\n            badgeContent\n            flexDirection=\"row\"\n            title={t(\"table.submissions\")}\n            content={\n              overallStatsData\n                ? overallStatsData.stats.nrOfSubmissions.toString()\n                : \"...\"\n            }\n          />\n          <DetailsCard\n            badgeContent\n            flexDirection=\"row\"\n            title={t(\"table.validations\")}\n            content={\n              overallStatsData\n                ? overallStatsData.stats.nrOfValidations.toString()\n                : \"...\"\n            }\n          />\n          <DetailsCard\n            badgeContent\n            flexDirection=\"row\"\n            title={t(\"table.numberOfPlayers\")}\n            content={gameData.game.players.length.toString()}\n          />\n        </Flex>\n\n        <Flex\n          margin=\"auto\"\n          width=\"100%\"\n          justifyContent=\"space-between\"\n          flexDirection={{ base: \"column\", md: \"row\" }}\n        >\n          <DetailsCard\n            badgeContent\n            flexDirection=\"row\"\n            title={t(\"addGame.startDate\")}\n            content={\n              gameData.game.startDate\n                ? dayjs(gameData.game.startDate).format(\"DD/MM/YYYY\")\n                : \"-\"\n            }\n          />\n          <DetailsCard\n            badgeContent\n            flexDirection=\"row\"\n            title={t(\"addGame.endDate\")}\n            content={\n              gameData.game.endDate\n                ? dayjs(gameData.game.endDate).format(\"DD/MM/YYYY\")\n                : \"-\"\n            }\n          />\n          <DetailsCard\n            badgeContent\n            flexDirection=\"row\"\n            title={t(\"addGame.private\")}\n            content={gameData.game.private ? t(\"Yes\") : t(\"No\")}\n          />\n        </Flex>\n        {/* <Divider marginBottom={10} /> */}\n\n        <Accordion allowToggle allowMultiple marginTop={3}>\n          <AccordionItem>\n            {({ isExpanded }: { isExpanded: boolean }) => (\n              <>\n                <AccordionButton>\n                  <Box flex=\"1\" textAlign=\"left\">\n                    <Heading as=\"h3\" size=\"sm\" marginTop={2} marginBottom={2}>\n                      {t(\"Students\")}\n                    </Heading>\n                  </Box>\n                  <AccordionIcon />\n                </AccordionButton>\n\n                <AccordionPanel pb={4} marginTop={2} marginBottom={10}>\n                  {isExpanded && (\n                    <Students\n                      selectedStudentsRef={selectedStudentsRef}\n                      gameId={gameId}\n                      loading={loading}\n                      autoAssignGroupsLoading={autoAssignGroupsLoading}\n                      setLoading={setLoading}\n                      autoAssignGroups={autoAssignGroups}\n                      refetchGame={refetchGame}\n                      getSelectedStudentsAndRemoveFromGroups={\n                        getSelectedStudentsAndRemoveFromGroups\n                      }\n                      getSelectedStudentAndRemoveFromGame={\n                        getSelectedStudentAndRemoveFromGame\n                      }\n                    />\n                  )}\n                </AccordionPanel>\n              </>\n            )}\n          </AccordionItem>\n          <AccordionItem>\n            {({ isExpanded }: { isExpanded: boolean }) => (\n              <>\n                <AccordionButton>\n                  <Box flex=\"1\" textAlign=\"left\">\n                    <Heading as=\"h3\" size=\"sm\" marginTop={2} marginBottom={2}>\n                      {t(\"Activities\")}\n                    </Heading>\n                  </Box>\n                  <AccordionIcon />\n                </AccordionButton>\n\n                <AccordionPanel pb={4} marginTop={2} marginBottom={10}>\n                  {isExpanded && <ActivitiesStats gameId={gameId} />}\n                </AccordionPanel>\n              </>\n            )}\n          </AccordionItem>\n        </Accordion>\n        {/* \n        <Flex justifyContent=\"space-between\" alignItems=\"center\">\n          <Heading as=\"h3\" size=\"sm\" marginTop={5} marginBottom={5}>\n            {t(\"Students\")}\n          </Heading>\n\n          <Flex>\n            <Button\n              marginRight={2}\n              size=\"sm\"\n              isLoading={autoAssignGroupsLoading}\n              disabled={autoAssignGroupsLoading}\n              onClick={async () => {\n                setLoading(true);\n                try {\n                  await autoAssignGroups({\n                    variables: {\n                      gameId,\n                    },\n                  });\n                  await refetchGame();\n                } catch (err) {\n                  addNotification({\n                    status: \"error\",\n                    title: t(\"error.autoAssign.title\"),\n                    description: t(\"error.autoAssign.description\"),\n                  });\n                }\n                setLoading(false);\n              }}\n            >\n              {t(\"Auto-assign groups\")}\n            </Button>\n            <Button marginRight={2} size=\"sm\" onClick={onAddGroupModalOpen}>\n              {t(\"Add new group\")}\n            </Button>\n\n            <Menu>\n              <MenuButton\n                disabled={!isStudentSelected}\n                size=\"sm\"\n                as={Button}\n                rightIcon={<ChevronDownIcon />}\n              >\n                {t(\"Actions\")}\n              </MenuButton>\n\n              <MenuList>\n                <MenuItem onClick={onSetGroupModalOpen}>\n                  {t(\"Set group\")}\n                </MenuItem>\n                <MenuItem onClick={getSelectedStudentsAndRemoveFromGroups}>\n                  {t(\"Remove from the group\")}\n                </MenuItem>\n                <MenuItem onClick={getSelectedStudentAndRemoveFromGame}>\n                  {t(\"Remove from the game\")}\n                </MenuItem>\n              </MenuList>\n            </Menu>\n          </Flex>\n        </Flex>\n\n        <Box>\n          <TableComponent\n            loading={loading}\n            onRowClick={(row: getGameByIdQuery_game_players) => {\n              history.push({\n                pathname: `/teacher/player-details/${row.user.id}/${gameId}`,\n              });\n            }}\n            selectableRows\n            setIsAnythingSelected={setIsStudentSelected}\n            setSelectedStudents={(rows: any) => {\n              selectedStudentsRef.current = rows;\n            }}\n            columns={[\n              {\n                Header: t(\"table.name\"),\n                accessor: \"user.firstName\",\n                Filter: ({ column }: { column: any }) => (\n                  <ColumnFilter\n                    column={column}\n                    placeholder={t(\"placeholders.name\")}\n                  />\n                ),\n              },\n              {\n                Header: t(\"table.lastName\"),\n                accessor: \"user.lastName\",\n                Filter: ({ column }: { column: any }) => (\n                  <ColumnFilter\n                    column={column}\n                    placeholder={t(\"placeholders.lastName\")}\n                  />\n                ),\n              },\n\n              {\n                Header: t(\"table.submissions\"),\n                accessor: \"stats.nrOfSubmissions\",\n                Filter: ({ column }: { column: any }) => (\n                  <ColumnFilter column={column} placeholder=\"123\" />\n                ),\n              },\n              {\n                Header: t(\"table.validations\"),\n                accessor: \"stats.nrOfValidations\",\n                Filter: ({ column }: { column: any }) => (\n                  <ColumnFilter column={column} placeholder=\"123\" />\n                ),\n              },\n              {\n                Header: t(\"table.group\"),\n                accessor: \"group.name\",\n                Cell: ({ value }: { value: any }) => {\n                  return value ? value : \"-\";\n                },\n                Filter: ({ column }: { column: any }) => (\n                  <ColumnFilter\n                    column={column}\n                    placeholder={t(\"table.group\")}\n                  />\n                ),\n              },\n              {\n                Header: t(\"table.progress\"),\n                accessor: \"learningPath\",\n                Cell: ({ value }: { value: any }) => {\n                  const totalChallengesCount = value.length || 1;\n\n                  const progressCombined =\n                    value\n                      .flatMap((learningPath: any) => learningPath.progress)\n                      .reduce((a: any, b: any) => a + b, 0) /\n                    totalChallengesCount;\n\n                  return (progressCombined * 100).toFixed(1) + \"%\";\n                },\n                disableFilters: true,\n                sortType: memoizedSorting,\n              },\n            ]}\n            data={gameData.game.players}\n          />\n        </Box> */}\n\n        {/* <Flex justifyContent=\"space-between\" alignItems=\"center\">\n          <Heading as=\"h3\" size=\"sm\" marginTop={5} marginBottom={5}>\n            {t(\"Activities\")}\n          </Heading>\n        </Flex>\n\n        <ActivitiesStats\n          gameData={gameData}\n          gameId={gameId}\n          statsData={overallStatsData}\n        /> */}\n      </div>\n    </>\n  );\n};\n\nexport default withChangeAnimation(InstructorGame);\n","import { gql } from \"@apollo/client\";\n\nexport const JOIN_GAME_WITH_ENROLL_TOKEN = gql`\n  mutation joinGameWithEnrollTokenMutation($token: String!) {\n    enrollWithToken(token: $token) {\n      id\n      game {\n        id\n        name\n      }\n      user {\n        username\n      }\n      points\n      submissions {\n        id\n        submittedAt\n      }\n      learningPath {\n        id\n        state\n      }\n      rewards {\n        id\n        count\n      }\n      createdAt\n      updatedAt\n    }\n  }\n`;\n","import { gql } from \"@apollo/client\";\n\nexport const JOIN_GROUP_WITH_TOKEN = gql`\n  mutation joinGroupWithToken($gameId: String!, $token: String!) {\n    addToGroupWithToken(gameId: $gameId, token: $token) {\n      id\n      game {\n        id\n        name\n      }\n      user {\n        username\n      }\n      group {\n        id\n        name\n      }\n    }\n  }\n`;\n","import { useMutation } from \"@apollo/client\";\nimport {\n  Alert,\n  AlertDescription,\n  AlertIcon,\n  AlertTitle,\n  Box,\n  Flex,\n  Spinner,\n} from \"@chakra-ui/react\";\nimport React, { useEffect } from \"react\";\nimport { useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { useHistory, useParams } from \"react-router-dom\";\nimport { joinGameWithEnrollTokenMutation } from \"../generated/joinGameWithEnrollTokenMutation\";\nimport { joinGroupWithToken } from \"../generated/joinGroupWithToken\";\nimport { JOIN_GAME_WITH_ENROLL_TOKEN } from \"../graphql/joinGameWithEnrollToken\";\nimport { JOIN_GROUP_WITH_TOKEN } from \"../graphql/joinGroupWithToken\";\nimport withChangeAnimation from \"../utilities/withChangeAnimation\";\nimport { useNotifications } from \"./Notifications\";\n\nconst JoinGameByToken = () => {\n  const { t } = useTranslation();\n  const history = useHistory();\n\n  const [loading, setLoading] = useState(false);\n  const [game, setGame] = useState<string | null>(null);\n  const [gameId, setGameId] = useState<string | null>(null);\n\n  const { gameToken, groupToken } =\n    useParams<{\n      gameToken?: string;\n      groupToken?: string;\n    }>();\n\n  const [joinGameWithToken, { error: joinGameError }] =\n    useMutation<joinGameWithEnrollTokenMutation>(JOIN_GAME_WITH_ENROLL_TOKEN);\n\n  const [joinGroupWithToken, { error: joinGroupError }] =\n    useMutation<joinGroupWithToken>(JOIN_GROUP_WITH_TOKEN);\n\n  const joinGameOnly = async (runLoading?: boolean) => {\n    try {\n      runLoading && setLoading(true);\n\n      const game = await joinGameWithToken({\n        variables: {\n          token: gameToken,\n        },\n      });\n      setGame(game.data?.enrollWithToken.game.name || null);\n      setGameId(game.data?.enrollWithToken.game.id || null);\n      runLoading && setLoading(false);\n      return game;\n    } catch (err) {\n      console.log(err);\n    }\n    runLoading && setLoading(false);\n  };\n\n  const joinGameAndGroup = async () => {\n    setLoading(true);\n    const game = await joinGameOnly();\n\n    if (game && game.data) {\n      try {\n        await joinGroupWithToken({\n          variables: {\n            token: groupToken,\n            gameId: game.data.enrollWithToken.game.id,\n          },\n        });\n      } catch (err) {\n        console.log(err);\n      }\n    }\n\n    setLoading(false);\n  };\n\n  useEffect(() => {\n    console.log(1, gameToken, 2, groupToken);\n\n    if (gameToken && !groupToken) {\n      joinGameOnly(true);\n    }\n\n    if (gameToken && groupToken) {\n      joinGameAndGroup();\n    }\n  }, []);\n\n  return (\n    <Alert\n      status={\n        loading ? \"info\" : joinGameError || joinGroupError ? \"error\" : \"success\"\n      }\n      variant=\"subtle\"\n      flexDirection=\"column\"\n      alignItems=\"center\"\n      justifyContent=\"center\"\n      textAlign=\"center\"\n      height=\"200px\"\n      maxW=\"600px\"\n      margin=\"auto\"\n      cursor={\n        loading\n          ? \"default\"\n          : joinGameError || joinGroupError\n          ? \"default\"\n          : \"pointer\"\n      }\n      onClick={() => {\n        if (gameId) {\n          history.push({\n            pathname: `/game/${gameId}`,\n          });\n        }\n      }}\n    >\n      {loading ? <Spinner size=\"xl\" /> : <AlertIcon boxSize=\"40px\" mr={0} />}\n      <AlertTitle mt={4} mb={1} fontSize=\"lg\">\n        {joinGameError || joinGroupError\n          ? t(\"error.joinGameOrGroup.title\")\n          : t(\"success.joinGameOrGroup.title\", {\n              game,\n            })}\n      </AlertTitle>\n      <AlertDescription maxWidth=\"sm\">\n        {joinGameError || joinGroupError\n          ? t(\"error.joinGameOrGroup.description\")\n          : t(\"success.joinGameOrGroup.description\")}\n      </AlertDescription>\n    </Alert>\n  );\n};\n\nexport default withChangeAnimation(JoinGameByToken);\n","import { useState, useEffect } from \"react\";\n\nconst getQueryParams = <T extends object>(): Partial<T> => {\n  // server side rendering\n  if (typeof window === \"undefined\") {\n    return {};\n  }\n\n  const params = new URLSearchParams(window.location.search);\n\n  return new Proxy(params, {\n    get(target, prop, receiver) {\n      return target.get(prop as string) || undefined;\n    },\n  }) as T;\n};\n\nconst useQueryParams = <T extends object = any>(): Partial<T> => {\n  const [queryParams, setQueryParams] = useState(getQueryParams());\n\n  const str = typeof window === \"undefined\"\n    ? \"once\"\n    : window.location.search;\n  useEffect(() => {\n    setQueryParams(getQueryParams());\n  }, [str]);\n\n  return queryParams;\n};\n\nexport default useQueryParams;\n","import { useKeycloak } from \"@react-keycloak/web\";\nimport axios from \"axios\";\nimport { useContext, useEffect } from \"react\";\nimport { useHistory } from \"react-router-dom\";\nimport { FocusActivityContextType } from \"../@types/focus-activity\";\nimport { FocusActivityContext } from \"../context/FocusActivityContext\";\n\nimport useQueryParams from \"../utilities/useQueryParams\";\nimport withChangeAnimation from \"../utilities/withChangeAnimation\";\nimport MainLoading from \"./MainLoading\";\n\nconst LtiCallback = () => {\n  const history = useHistory();\n  const queryParams = useQueryParams();\n  const { keycloak, initialized } = useKeycloak();\n  const { activate } = useContext(FocusActivityContext) as FocusActivityContextType\n\n  const { ltik, gameId, challengeId, exerciseId } = queryParams;\n\n  useEffect(() => {\n    const authenticate = async () => {\n      const time = new Date().getTime();\n      const res = await axios.post(\n        process.env.REACT_APP_API_URI + \"/lti/auth\",\n        {\n          ltik,\n          game: gameId,\n          challenge: challengeId,\n          activity: exerciseId,\n        }\n      );\n\n      keycloak.manualLogin(res.data.accessToken, res.data.refreshToken, res.data.idToken, (time + new Date().getTime())/2);\n\n      if (gameId && challengeId && res.data.role?.toLowerCase() === 'student') {\n        activate({ ltik, gameId, challengeId, activityId: exerciseId });\n      } else {\n        if (gameId && res.data.role?.toLowerCase() === 'student') {\n          history.push(`/game/${gameId}`);\n        } else {\n          history.push('/profile');\n        }\n      }\n    }\n    if (initialized && ltik) {\n      authenticate();\n    }\n  }, [activate, history, keycloak, initialized, ltik, gameId, challengeId, exerciseId]);\n\n  return (<MainLoading />);\n};\n\nexport default withChangeAnimation(LtiCallback);\n","import { gql } from \"@apollo/client\";\n\nexport const UNASSIGN_INSTRUCTOR = gql`\n  mutation unassignInstructorMutation($userId: String!, $gameId: String!) {\n    unassignInstructor(userId: $userId, gameId: $gameId) {\n      id\n    }\n  }\n`;\n","import { gql, useMutation } from \"@apollo/client\";\nimport {\n  Button,\n  Checkbox,\n  Collapse,\n  Flex,\n  FormControl,\n  FormLabel,\n  Input,\n  Modal,\n  ModalBody,\n  ModalCloseButton,\n  ModalContent,\n  ModalFooter,\n  ModalHeader,\n  ModalOverlay,\n  Select,\n  Textarea,\n  useColorMode,\n  VStack,\n} from \"@chakra-ui/react\";\nimport styled from \"@emotion/styled\";\n\nimport customParseFormat from \"dayjs/plugin/customParseFormat\";\nimport React, { useState } from \"react\";\nimport { useDropzone } from \"react-dropzone\";\nimport { useTranslation } from \"react-i18next\";\nimport { importGame } from \"../generated/importGame\";\nimport { useNotifications } from \"./Notifications\";\nimport dayjs from \"dayjs\";\nimport StartAndEndDateInput from \"./StartAndEndDateInput\";\ndayjs.extend(customParseFormat);\n\nconst IMPORT_GAME = gql`\n  mutation importGame(\n    $file: Upload!\n    $gameName: String!\n    $evaluationEngine: EvaluationEngine!\n    $gameDescription: String\n    $startDate: Date\n    $endDate: Date\n    $private: Boolean\n  ) {\n    importGEdILArchive(\n      gameInput: {\n        name: $gameName\n        description: $gameDescription\n        startDate: $startDate\n        endDate: $endDate\n        evaluationEngine: $evaluationEngine\n        private: $private\n      }\n      file: $file\n    ) {\n      id\n      name\n      description\n      courseId\n      gedilLayerId\n      gedilLayerDescription\n      startDate\n      endDate\n      evaluationEngine\n    }\n  }\n`;\n\nexport const isDateValid = (date: string) => {\n  return dayjs(date, \"YYYY-MM-DD\", true).isValid();\n};\n\nconst AddGameModal = ({\n  isOpen,\n  onOpen,\n  onClose,\n  refetchGames,\n}: {\n  isOpen: boolean;\n  onOpen: () => void;\n  onClose: () => void;\n  refetchGames: () => void;\n}) => {\n  const { add: addNotification } = useNotifications();\n\n  const { t } = useTranslation();\n  const {\n    acceptedFiles,\n    getRootProps,\n    getInputProps,\n    isDragAccept,\n    isDragReject,\n  } = useDropzone({\n    accept: [\n      \"application/zip\",\n      \"application/octet-stream\",\n      \"application/x-zip-compressed\",\n      \"multipart/x-zip\",\n    ],\n    maxFiles: 1,\n    onDropRejected: () => {\n      addNotification({\n        status: \"error\",\n        title: t(\"addGame.error.fileRejected.title\"),\n        description: t(\"addGame.error.fileRejected.description\"),\n      });\n    },\n  });\n\n  const [importNewGame, { loading: importGameLoading }] =\n    useMutation<importGame>(IMPORT_GAME, {\n      onError(data) {\n        addNotification({\n          status: \"error\",\n          title: t(\"addGame.error.cannotAddGame.title\"),\n          description: t(\"addGame.error.cannotAddGame.description\"),\n        });\n      },\n      onCompleted(data) {\n        onClose();\n        refetchGames();\n        addNotification({\n          status: \"success\",\n          title: t(\"addGame.success.title\"),\n          description: t(\"addGame.success.description\"),\n        });\n      },\n    });\n\n  const { colorMode } = useColorMode();\n\n  const [startDate, setStartDate] = useState(\"\");\n  const [startDateError, setStartDateError] = useState(false);\n\n  const [endDate, setEndDate] = useState(\"\");\n  const [endDateError, setEndDateError] = useState(false);\n\n  const [isEndLaterThanStart, setEndLaterThanStart] = useState(true);\n\n  const [gameName, setGameName] = useState(\"\");\n  const [gameDescription, setGameDescription] = useState(\"\");\n  const [evaluationEngine, setEvaluationEngine] = useState(\"\");\n  // const [courseId, setCourseId] = useState(\"\");\n  const [isPrivate, setIsPrivate] = useState(false);\n\n  const validateAndSetStartDate = (value: string) => {\n    if (isDateValid(value)) {\n      if (endDate) {\n        setEndLaterThanStart(\n          dayjs(endDate, \"YYYY-MM-DD\").isAfter(dayjs(value, \"YYYY-MM-DD\"))\n        );\n      }\n\n      setStartDateError(false);\n    } else {\n      setStartDateError(true);\n    }\n\n    setStartDate(value);\n  };\n\n  const validateAndSetEndDate = (value: string) => {\n    if (isDateValid(value)) {\n      if (startDate) {\n        setEndLaterThanStart(\n          dayjs(value, \"YYYY-MM-DD\").isAfter(dayjs(startDate, \"YYYY-MM-DD\"))\n        );\n      }\n\n      setEndDateError(false);\n    } else {\n      setEndDateError(true);\n    }\n\n    setEndDate(value);\n  };\n\n  return (\n    <Modal isOpen={isOpen} onClose={onClose} size=\"md\">\n      <ModalOverlay />\n      <ModalContent>\n        <ModalHeader>{t(\"Add new game\")}</ModalHeader>\n        <ModalCloseButton />\n        <ModalBody>\n          <VStack spacing={1}>\n            <FormControl id=\"name\" isRequired>\n              <FormLabel>{t(\"addGame.name\")}</FormLabel>\n              <Input\n                type=\"text\"\n                placeholder={t(\"addGame.namePlaceholder\")}\n                value={gameName}\n                onChange={(e) => setGameName(e.target.value)}\n              />\n            </FormControl>\n            <FormControl id=\"description\">\n              <FormLabel>{t(\"addGame.description\")}</FormLabel>\n              <Textarea\n                placeholder={t(\"addGame.descriptionPlaceholder\")}\n                value={gameDescription}\n                onChange={(e) => setGameDescription(e.target.value)}\n              />\n            </FormControl>\n\n            <StartAndEndDateInput\n              startDate={startDate}\n              endDate={endDate}\n              setStartDate={setStartDate}\n              setEndDate={setEndDate}\n              setEndDateError={setEndDateError}\n              setStartDateError={setStartDateError}\n              isEndLaterThanStart={isEndLaterThanStart}\n              setEndLaterThanStart={setEndLaterThanStart}\n              startDateError={startDateError}\n              endDateError={endDateError}\n            />\n\n            <FormControl isRequired marginBottom={2}>\n              <FormLabel id=\"engine\">{t(\"addGame.evaluationEngine\")}</FormLabel>\n              <Select\n                placeholder={t(\"Select option\")}\n                value={evaluationEngine}\n                onChange={(e: any) => {\n                  setEvaluationEngine(e.target.value);\n                }}\n              >\n                <option value=\"MOOSHAK\">MOOSHAK</option>\n              </Select>\n            </FormControl>\n            {/* <FormControl id=\"course\" isRequired marginBottom={2}>\n              <FormLabel>{t(\"addGame.courseId\")}</FormLabel>\n              <Input\n                type=\"text\"\n                placeholder={t(\"addGame.courseIdPlaceholder\")}\n                value={courseId}\n                onChange={(e) => setCourseId(e.target.value)}\n              />\n            </FormControl> */}\n\n            <DragAndDropField\n              bgColor={colorMode === \"dark\" ? \"blue.700\" : \"blue.100\"}\n              width=\"100%\"\n              justifyContent=\"center\"\n              alignItems=\"center\"\n              height={50}\n              borderRadius={4}\n              border={`2px dashed`}\n              borderColor={colorMode === \"dark\" ? \"blue.800\" : \"blue.200\"}\n              marginBottom={2}\n              cursor=\"pointer\"\n              userSelect=\"none\"\n              _hover={{ bg: colorMode === \"dark\" ? \"blue.600\" : \"blue.50\" }}\n              transition=\"background 0.5s, border 0.5s\"\n              className={\n                (isDragAccept ? \"drop-active\" : \"\") +\n                (isDragReject ? \" drop-reject\" : \"\")\n              }\n            >\n              <div\n                {...getRootProps({ className: \"dropzone\" })}\n                style={{\n                  width: \"100%\",\n                  height: \"100%\",\n                  display: \"flex\",\n                  justifyContent: \"center\",\n                  alignItems: \"center\",\n                  fontSize: 13,\n                }}\n              >\n                <input {...getInputProps()} />\n                <p style={{ textAlign: \"center\" }}>\n                  {isDragReject\n                    ? t(\"addGame.wrongFileType\")\n                    : acceptedFiles.length > 0\n                    ? acceptedFiles.map((file: any) => (\n                        <span key={file.path}>{file.path}</span>\n                      ))\n                    : t(\"addGame.dragFileOrClick\")}\n                </p>\n              </div>\n            </DragAndDropField>\n\n            <Flex justifyContent=\"space-between\" width=\"100%\">\n              <Checkbox\n                isChecked={isPrivate}\n                onChange={(e) => setIsPrivate(e.target.checked)}\n              >\n                {t(\"addGame.setPrivate\")}\n              </Checkbox>\n            </Flex>\n          </VStack>\n        </ModalBody>\n\n        <ModalFooter>\n          <Button mr={3} onClick={onClose} disabled={importGameLoading}>\n            {t(\"Close\")}\n          </Button>\n          <Button\n            onClick={() => {\n              importNewGame({\n                variables: {\n                  file: acceptedFiles[0],\n                  gameName: gameName,\n                  evaluationEngine: evaluationEngine,\n                  gameDescription: gameDescription || undefined,\n                  startDate: startDate || undefined,\n                  endDate: endDate || undefined,\n                  private: isPrivate,\n                },\n              });\n            }}\n            isLoading={importGameLoading}\n            loadingText={t(\"Adding\")}\n            colorScheme=\"blue\"\n            disabled={\n              !(\n                !importGameLoading &&\n                acceptedFiles.length > 0 &&\n                gameName &&\n                evaluationEngine &&\n                (startDate ? !startDateError : true) &&\n                (endDate ? !endDateError : true) &&\n                (startDate || endDate ? isEndLaterThanStart : true)\n              )\n            }\n          >\n            {t(\"Add\")}\n          </Button>\n        </ModalFooter>\n      </ModalContent>\n    </Modal>\n  );\n};\n\nconst DragAndDropField = styled(Flex)`\n  &.drop-active {\n    border: solid;\n  }\n\n  &.drop-reject {\n    background-color: red;\n    cursor: not-allowed;\n  }\n`;\n\nexport default AddGameModal;\n","import { gql, useMutation, useQuery } from \"@apollo/client\";\nimport { Box, Button, Flex, Heading, useDisclosure } from \"@chakra-ui/react\";\nimport { useKeycloak } from \"@react-keycloak/web\";\nimport React, { useCallback } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { Link, useHistory } from \"react-router-dom\";\nimport { getAllAvailableGames } from \"../generated/getAllAvailableGames\";\nimport { UNASSIGN_INSTRUCTOR } from \"../graphql/unassignInstructor\";\nimport { checkIfConnectionAborted } from \"../utilities/ErrorMessages\";\nimport withChangeAnimation from \"../utilities/withChangeAnimation\";\nimport AddGameModal from \"./AddGameModal\";\nimport Error from \"./Error\";\nimport { useNotifications } from \"./Notifications\";\nimport TableComponent from \"./TableComponent\";\nimport ColumnFilter from \"./TableComponent/ColumnFilter\";\n\nconst GET_ALL_AVAILABLE_GAMES = gql`\n  query getAllAvailableGames {\n    games {\n      id\n      name\n      description\n      private\n      instructors {\n        email\n        id\n      }\n    }\n  }\n`;\n\nconst ASSIGN_INSTRUCTOR = gql`\n  mutation assignInstructorMutation($gameId: String!, $userId: String!) {\n    assignInstructor(gameId: $gameId, userId: $userId) {\n      id\n    }\n  }\n`;\n\nconst REMOVE_GAME = gql`\n  mutation removeGameMutation($gameId: String!) {\n    removeGame(gameId: $gameId) {\n      id\n    }\n  }\n`;\n\nconst ManageGames = () => {\n  const { add: addNotification } = useNotifications();\n  const history = useHistory();\n\n  const {\n    data: availableGamesData,\n    error,\n    loading,\n    refetch,\n  } = useQuery<getAllAvailableGames>(GET_ALL_AVAILABLE_GAMES, {\n    fetchPolicy: \"no-cache\",\n  });\n  const { t } = useTranslation();\n  const { keycloak } = useKeycloak();\n\n  const [\n    assignInstructor,\n    { data: assignInstructorData, loading: assignInstructorLoading },\n  ] = useMutation(ASSIGN_INSTRUCTOR);\n\n  const [unassignInstructor] = useMutation(UNASSIGN_INSTRUCTOR);\n\n  const [removeGame, { data: removeGameData, loading: removeGameLoading }] =\n    useMutation(REMOVE_GAME);\n\n  const memoizedRowChecking = useCallback(\n    (row: any) => {\n      return (\n        row.instructors.filter(\n          (instructor: any) =>\n            instructor.email == keycloak.profile?.email || false\n        ).length > 0\n      );\n    },\n    [availableGamesData]\n  );\n\n  const {\n    isOpen: isAddGameModalOpen,\n    onOpen: onAddGameModalOpen,\n    onClose: onAddGameModalClose,\n  } = useDisclosure();\n\n  if (!loading && error) {\n    const isServerConnectionError = checkIfConnectionAborted(error);\n\n    if (isServerConnectionError) {\n      return <Error serverConnectionError />;\n    } else {\n      return <Error errorContent={error} />;\n    }\n  }\n\n  if (loading) {\n    return <div>{t(\"Loading\")}</div>;\n  }\n\n  return (\n    <Box>\n      <AddGameModal\n        isOpen={isAddGameModalOpen}\n        onOpen={onAddGameModalOpen}\n        onClose={onAddGameModalClose}\n        refetchGames={refetch}\n      />\n      <Flex justifyContent=\"space-between\" alignItems=\"center\">\n        <Heading as=\"h3\" size=\"md\" marginTop={5} marginBottom={5}>\n          {t(\"All available games\")}\n        </Heading>\n        <Flex>\n          <Link to=\"/profile\">\n            <Button variant=\"outline\" marginRight={2}>\n              {t(\"Back\")}\n            </Button>\n          </Link>\n\n          <Button onClick={onAddGameModalOpen}>{t(\"Add new game\")}</Button>\n        </Flex>\n      </Flex>\n\n      <Box>\n        <TableComponent\n          onRowClick={(row) => {\n            const enrolled = memoizedRowChecking(row);\n            if (enrolled) {\n              history.push({\n                pathname: `/teacher/game/${row.id}`,\n              });\n            } else {\n              addNotification({\n                status: \"warning\",\n                title: t(\"error.teacherNotEnrolled.title\"),\n                description: t(\"error.teacherNotEnrolled.description\"),\n              });\n            }\n          }}\n          columns={[\n            {\n              Header: t(\"table.gameName\"),\n              accessor: \"name\",\n              Filter: ({ column }: { column: any }) => (\n                <ColumnFilter\n                  column={column}\n                  placeholder={t(\"placeholders.gameName\")}\n                />\n              ),\n            },\n            {\n              Header: t(\"table.gameDescription\"),\n              accessor: \"description\",\n              Filter: ({ column }: { column: any }) => (\n                <ColumnFilter\n                  column={column}\n                  placeholder={t(\"placeholders.gameDescription\")}\n                />\n              ),\n            },\n            {\n              Header: t(\"table.assigned\"),\n              accessor: (row: any) => {\n                const enrolled = memoizedRowChecking(row);\n                return enrolled;\n              },\n              id: \"button-1\",\n              Cell: ({\n                value,\n                cell,\n                row,\n              }: {\n                value: boolean;\n                cell: any;\n                row: any;\n              }) => (\n                <Button\n                  size=\"sm\"\n                  isLoading={cell.state.loading}\n                  onClick={async () => {\n                    const gameId = row.original.id;\n                    cell.setState({ loading: true });\n\n                    if (!keycloak.userInfo) {\n                      await keycloak.loadUserInfo();\n                    }\n\n                    const userInfo = keycloak.userInfo as any;\n                    const userId = userInfo.sub;\n\n                    if (value) {\n                      await unassignInstructor({\n                        variables: {\n                          gameId,\n                          userId,\n                        },\n                      });\n                    } else {\n                      await assignInstructor({\n                        variables: {\n                          gameId,\n                          userId,\n                        },\n                      });\n                    }\n\n                    await refetch();\n                    cell.setState({ loading: false });\n                  }}\n                >\n                  {value ? t(\"Remove the assignment\") : t(\"Assign me\")}\n                </Button>\n              ),\n              disableFilters: true,\n            },\n            {\n              Header: t(\"table.removeGame\"),\n              // accessor: \"id\",\n              id: \"button-2\",\n              Cell: ({ cell, row }: { cell: any; row: any }) => (\n                <Button\n                  size=\"sm\"\n                  isLoading={cell.state.loading}\n                  onClick={async () => {\n                    const gameId = row.original.id;\n                    cell.setState({ loading: true });\n\n                    try {\n                      await removeGame({\n                        variables: {\n                          gameId,\n                        },\n                      });\n\n                      await refetch();\n                    } catch (err) {\n                      addNotification({\n                        status: \"error\",\n                        title: t(\"error.removeGame.title\"),\n                        description: t(\"error.removeGame.description\"),\n                      });\n                      console.log(\"Error!\");\n                    }\n\n                    cell.setState({ loading: false });\n                  }}\n                >\n                  {t(\"table.removeGame\")}\n                </Button>\n              ),\n              Filter: ({ column }: { column: any }) => (\n                <ColumnFilter\n                  column={column}\n                  placeholder={t(\"placeholders.gameDescription\")}\n                />\n              ),\n            },\n          ]}\n          data={availableGamesData?.games}\n        />\n      </Box>\n    </Box>\n  );\n};\n\nexport default withChangeAnimation(ManageGames);\n","import React from \"react\";\n\nconst NavContext = React.createContext<{\n  activeGame: { id: string; name: string } | null;\n  // activeChallenge: { id: string; name: string } | null;\n  setActiveGame: (game: { id: string; name: string } | null) => void;\n  // setActiveChallenge: (challenge: { id: string; name: string } | null) => void;\n}>({\n  activeGame: null,\n  // activeChallenge: null,\n  // setActiveChallenge: () => {},\n  setActiveGame: () => {},\n});\n\nexport default NavContext;\n","import {\n  Button,\n  Modal,\n  ModalBody,\n  ModalCloseButton,\n  ModalContent,\n  ModalFooter,\n  ModalHeader,\n  ModalOverlay,\n} from \"@chakra-ui/react\";\nimport React, { useEffect, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\n\ntype language = {\n  code: string;\n  language: string;\n};\n\nconst ChangeLanguageModal = ({\n  isOpen,\n  onOpen,\n  onClose,\n}: {\n  isOpen: boolean;\n  onOpen: () => void;\n  onClose: () => void;\n}) => {\n  const { t, i18n } = useTranslation();\n  const [supportedLanguages, setSupportedLanguages] =\n    useState<null | language[]>(null);\n\n  const getSupportedLanguages = () => {\n    fetch(`${process.env.PUBLIC_URL}/locales/supported-languages.json`, {\n      headers: {\n        \"Content-Type\": \"application/json\",\n        Accept: \"application/json\",\n      },\n    })\n      .then(function (response) {\n        return response.json();\n      })\n      .then(function (myJson) {\n        setSupportedLanguages(myJson);\n      });\n  };\n\n  useEffect(() => {\n    getSupportedLanguages();\n  }, []);\n\n  const changeLanguage = (lang: string) => {\n    i18n.changeLanguage(lang);\n    onClose();\n  };\n\n  return (\n    <Modal isOpen={isOpen} onClose={onClose} size=\"xs\">\n      <ModalOverlay />\n      <ModalContent>\n        <ModalHeader>{t(\"Language\")}</ModalHeader>\n        <ModalCloseButton />\n        <ModalBody>\n          {supportedLanguages ? (\n            supportedLanguages\n              .sort(function (a, b) {\n                if (a.language < b.language) {\n                  return -1;\n                }\n                if (a.language > b.language) {\n                  return 1;\n                }\n                return 0;\n              })\n              .map((language, i) => (\n                <Button\n                  colorScheme=\"blue\"\n                  key={i}\n                  w=\"100%\"\n                  marginBottom=\"1\"\n                  size=\"sm\"\n                  onClick={() => changeLanguage(language.code)}\n                >\n                  {language.language}\n                </Button>\n              ))\n          ) : (\n            <span>Loading...</span>\n          )}\n          {/* {SUPPORTED_LANGUAGES.sort(function (a, b) {\n            if (a.language < b.language) {\n              return -1;\n            }\n            if (a.language > b.language) {\n              return 1;\n            }\n            return 0;\n          }).map((language, i) => {\n            return (\n              <Button\n                colorScheme=\"blue\"\n                key={i}\n                w=\"100%\"\n                marginBottom=\"1\"\n                size=\"sm\"\n                onClick={() => changeLanguage(language.code)}\n              >\n                {language.language}\n              </Button>\n            );\n          })} */}\n        </ModalBody>\n\n        <ModalFooter alignItems=\"center\" justifyContent=\"center\">\n          <Button variant=\"ghost\" colorScheme=\"blue\" onClick={onClose}>\n            {t(\"Close\")}\n          </Button>\n        </ModalFooter>\n      </ModalContent>\n    </Modal>\n  );\n};\n\nexport default ChangeLanguageModal;\n","import { ChevronDownIcon, HamburgerIcon, SettingsIcon } from \"@chakra-ui/icons\";\nimport {\n  Box,\n  Button,\n  Flex,\n  IconButton,\n  Menu,\n  MenuButton,\n  MenuItem,\n  MenuList,\n  useBreakpointValue,\n  useColorMode,\n  useDisclosure,\n} from \"@chakra-ui/react\";\nimport styled from \"@emotion/styled\";\nimport { useKeycloak } from \"@react-keycloak/web\";\nimport React, { useContext, useEffect, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { BiUserCircle } from \"react-icons/bi\";\nimport { IoLanguage } from \"react-icons/io5\";\nimport { VscColorMode } from \"react-icons/vsc\";\nimport { NavLink } from \"react-router-dom\";\nimport useBreadcrumbs from \"use-react-router-breadcrumbs\";\nimport { KeycloakProfile } from \"@fgpe/keycloak-js\";\nimport NavContext from \"../context/NavContext\";\nimport LogoSVG from \"../images/logo.svg\";\nimport ChangeLanguageModal from \"./ChangeLanguageModal\";\nimport { FocusActivityContext } from \"../context/FocusActivityContext\";\nimport { FocusActivityContextType } from \"../@types/focus-activity\";\n\nconst Logo = styled.div`\n  background: url(${LogoSVG});\n  width: 100px;\n  height: 50px;\n  background-position: center;\n  background-repeat: no-repeat;\n  background-size: contain;\n  position: absolute;\n  top: 8px;\n`;\n\nconst Navbar = () => {\n  const breadcrumbs = useBreadcrumbs();\n  const {\n    isOpen: isOpenLanguageModal,\n    onOpen: onOpenLanguageModal,\n    onClose: onCloseLanguageModal,\n  } = useDisclosure();\n\n  const { t, i18n } = useTranslation();\n\n  const { activeGame } = useContext(NavContext);\n  const { keycloak, initialized } = useKeycloak();\n\n  const { deactivate: deactivateFocusMode, focusActivity } = useContext(\n    FocusActivityContext\n  ) as FocusActivityContextType;\n\n  // const resetActiveGameAndChallenge = () => {\n  //   activeGameAndChallenge.setActiveChallenge(null);\n  //   activeGameAndChallenge.setActiveGame(null);\n  // };\n\n  const { colorMode, toggleColorMode } = useColorMode();\n  const [userProfile, setUserProfile] =\n    useState<null | KeycloakProfile>(null);\n\n  const loadUserProfile = async () => {\n    setUserProfile(await keycloak.loadUserProfile());\n  };\n\n  useEffect(() => {\n    if (initialized) {\n      loadUserProfile();\n    }\n  }, [initialized]);\n\n  return (\n    <>\n      <ChangeLanguageModal\n        onClose={onCloseLanguageModal}\n        onOpen={onOpenLanguageModal}\n        isOpen={isOpenLanguageModal}\n      />\n      <NavbarStyled>\n        <Flex\n          px={2}\n          justifyContent=\"space-between\"\n          alignItems=\"center\"\n          height=\"100%\"\n        >\n          <Box width={1 / 2}>\n            {!focusActivity && (\n              <NavLink to={keycloak.authenticated ? \"/profile\" : \"/\"}>\n                <Logo />\n              </NavLink>\n            )}\n            {focusActivity && <Logo />}\n            {/* {activeGame && activeGame.name} */}\n          </Box>\n\n          <Flex\n            width={1 / 2}\n            justifyContent=\"flex-end\"\n            alignItems=\"flex-end\"\n            display={{ base: \"none\", md: \"flex\" }}\n          >\n            {keycloak.authenticated && !focusActivity && (\n              <Box>\n                <NavLink to=\"/profile\">\n                  <IconButton\n                    height={6}\n                    _focus={{}}\n                    variant=\"link\"\n                    colorScheme=\"gray\"\n                    aria-label=\"Profile\"\n                    icon={<BiUserCircle fontSize={24} />}\n                  />\n                </NavLink>\n              </Box>\n            )}\n\n            {keycloak.authenticated && !focusActivity && (\n              <Box>\n                <NavLink to=\"/profile/settings\">\n                  <IconButton\n                    height={6}\n                    _focus={{}}\n                    variant=\"link\"\n                    colorScheme=\"gray\"\n                    aria-label=\"Settings\"\n                    icon={<SettingsIcon fontSize={20} />}\n                  />\n                </NavLink>\n              </Box>\n            )}\n\n            <Box>\n              <IconButton\n                height={6}\n                _focus={{}}\n                onClick={toggleColorMode}\n                variant=\"link\"\n                colorScheme=\"gray\"\n                aria-label=\"Toggle color mode\"\n                icon={<VscColorMode fontSize={24} />}\n              />\n            </Box>\n            <Box>\n              <IconButton\n                height={6}\n                _focus={{}}\n                onClick={onOpenLanguageModal}\n                variant=\"link\"\n                colorScheme=\"gray\"\n                aria-label=\"Change language\"\n                icon={<IoLanguage fontSize={24} />}\n              />\n            </Box>\n\n            {focusActivity && (\n              <Box marginLeft={5}>\n                <button onClick={() => deactivateFocusMode()}>\n                  {t(\"Exit Focus Mode\")}\n                </button>\n              </Box>\n            )}\n            {!focusActivity && (\n              <Box marginLeft={5}>\n                {keycloak.authenticated ? (\n                  <button onClick={() => keycloak.logout()}>\n                    {t(\"Logout\")}\n                  </button>\n                ) : (\n                  <button\n                    onClick={() => {\n                      keycloak.login({\n                        redirectUri: `${window.location.origin}${process.env.PUBLIC_URL}/profile`,\n                      });\n                    }}\n                  >\n                    {t(\"Login\")}\n                  </button>\n                )}\n              </Box>\n            )}\n\n            {/* <IconButton\n              onClick={toggleColorMode}\n              aria-label=\"Toggle theme\"\n              icon={colorMode === \"light\" ? <SunIcon /> : <MoonIcon />}\n            /> */}\n          </Flex>\n          <Box display={{ base: \"box\", md: \"none\" }}>\n            <Menu>\n              <MenuButton as={Button}>\n                <HamburgerIcon />\n              </MenuButton>\n              <MenuList>\n                {!focusActivity && (<MenuItem>\n                  <NavLink to=\"/profile\">\n                    <Flex color={colorMode === \"dark\" ? \"white\" : \"black\"}>\n                      <IconButton\n                        height={6}\n                        _focus={{}}\n                        variant=\"link\"\n                        colorScheme=\"gray\"\n                        aria-label=\"Profile\"\n                        icon={<BiUserCircle fontSize={24} />}\n                      />\n                      {t(\"Your games\")}\n                    </Flex>\n                  </NavLink>\n                </MenuItem>)}\n                {!focusActivity && (<MenuItem>\n                  <NavLink to=\"/profile/settings\">\n                    <Flex color={colorMode === \"dark\" ? \"white\" : \"black\"}>\n                      <IconButton\n                        height={6}\n                        _focus={{}}\n                        variant=\"link\"\n                        colorScheme=\"gray\"\n                        aria-label=\"Settings\"\n                        icon={<SettingsIcon fontSize={20} />}\n                      />\n                      {t(\"Account settings\")}\n                    </Flex>\n                  </NavLink>\n                </MenuItem>)}\n                <MenuItem onClick={toggleColorMode}>\n                  <IconButton\n                    height={6}\n                    _focus={{}}\n                    variant=\"link\"\n                    colorScheme=\"gray\"\n                    aria-label=\"Toggle color mode\"\n                    icon={<VscColorMode fontSize={24} />}\n                  />\n                  {t(\"settings.darkMode\")}\n                </MenuItem>\n                <MenuItem onClick={onOpenLanguageModal}>\n                  <IconButton\n                    height={6}\n                    _focus={{}}\n                    variant=\"link\"\n                    colorScheme=\"gray\"\n                    aria-label=\"Change language\"\n                    icon={<IoLanguage fontSize={24} />}\n                  />\n                  {t(\"Language\")}\n                </MenuItem>\n                {focusActivity && (\n                  <MenuItem onClick={async () => await deactivateFocusMode()} paddingLeft={6}>\n                    {t(\"Exit Focus Mode\")}\n                  </MenuItem>\n                )}\n                {!focusActivity && (\n                  <>\n                    {keycloak.authenticated ? (\n                      <MenuItem onClick={() => keycloak.logout()} paddingLeft={6}>\n                        {t(\"Logout\")}\n                      </MenuItem>\n                    ) : (\n                      <MenuItem\n                        paddingLeft={6}\n                        onClick={() => {\n                          keycloak.login({\n                            redirectUri: `${window.location.origin}${process.env.PUBLIC_URL}/profile`,\n                          });\n                        }}\n                      >\n                        {t(\"Login\")}\n                      </MenuItem>\n                    )}\n                  </>\n                )}\n              </MenuList>\n            </Menu>\n          </Box>\n\n          {/* </UserMenu> */}\n        </Flex>\n      </NavbarStyled>\n    </>\n  );\n};\n\nconst UserMenu = styled.div`\n  /* display: flex; */\n  justify-content: center;\n  align-items: center;\n  width: 150px;\n  float: right;\n\n  * {\n    margin-left: 15px;\n  }\n`;\n\nconst UserIconStyled = styled.img`\n  height: 25px;\n  cursor: pointer;\n  transition: transform 0.5s;\n\n  &:hover {\n    transform: scale(1.2);\n  }\n`;\n\nconst NavbarStyled = styled(Box)`\n  a {\n    /* margin-right: 15px; */\n    color: black;\n  }\n\n  height: 65px;\n  z-index: 999;\n  box-shadow: 0px 0px 5px 1px rgba(0, 0, 0, 0.05);\n  & > div {\n    /* max-width: 1140px; */\n    padding: 0px 20px;\n    margin: auto;\n  }\n`;\n\nexport default Navbar;\n","import {\n  Alert,\n  AlertDescription,\n  AlertIcon,\n  AlertTitle,\n} from \"@chakra-ui/react\";\nimport React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport withChangeAnimation from \"../utilities/withChangeAnimation\";\n\nconst NotFound = () => {\n  const { t } = useTranslation();\n\n  return (\n    <Alert\n      status=\"warning\"\n      variant=\"subtle\"\n      flexDirection=\"column\"\n      alignItems=\"center\"\n      justifyContent=\"center\"\n      textAlign=\"center\"\n      //   height=\"200px\"\n      maxWidth=\"700px\"\n      margin=\"auto\"\n      borderRadius={5}\n    >\n      <AlertIcon boxSize=\"40px\" mr={0} />\n      <AlertTitle mt={4} mb={1} fontSize=\"lg\">\n        {t(\"error.notFound.title\")}\n      </AlertTitle>\n      <AlertDescription maxWidth=\"sm\">\n        {t(\"error.notFound.description\")}\n      </AlertDescription>\n    </Alert>\n  );\n};\n\nexport default withChangeAnimation(NotFound);\n","import { gql } from \"@apollo/client\";\n\nexport const GET_PLAYER = gql`\n  query getPlayerQuery($gameId: String!, $userId: String!) {\n    player(gameId: $gameId, userId: $userId) {\n      id\n\n      learningPath {\n        challenge {\n          id\n          name\n          refs {\n            id\n            name\n          }\n        }\n        progress\n      }\n\n      game {\n        id\n        name\n        groups {\n          id\n          name\n          displayName\n        }\n      }\n\n      user {\n        id\n        username\n        email\n        firstName\n        lastName\n      }\n\n      group {\n        id\n        name\n      }\n\n      stats {\n        nrOfSubmissions\n        nrOfValidations\n        nrOfSubmissionsByActivity\n        nrOfValidationsByActivity\n        nrOfSubmissionsByActivityAndResult\n        nrOfValidationsByActivityAndResult\n      }\n    }\n  }\n`;\n","import { gql } from \"@apollo/client\";\n\nexport const REMOVE_SINGLE_FROM_GAME = gql`\n  mutation removeSingleFromGameMutation($gameId: String!, $userId: String!) {\n    removeFromGame(gameId: $gameId, userId: $userId) {\n      id\n    }\n  }\n`;\n","import {\n  Modal,\n  ModalOverlay,\n  ModalContent,\n  ModalHeader,\n  ModalCloseButton,\n  ModalBody,\n  ModalFooter,\n  Button,\n  Text,\n  HStack,\n  Box,\n  useColorMode,\n  Stack,\n  Flex,\n  Drawer,\n  DrawerBody,\n  DrawerContent,\n  DrawerHeader,\n  DrawerOverlay,\n  Skeleton,\n} from \"@chakra-ui/react\";\nimport React, { useEffect, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\n// import {\n//   getPlayerQuery_player_submissions,\n//   getPlayerQuery_player_validations,\n// } from \"../../generated/getPlayerQuery\";\nimport DetailsCard from \"../DetailsCard\";\nimport dayjs from \"dayjs\";\nimport LocalizedFormat from \"dayjs/plugin/localizedFormat\";\n\nimport SyntaxHighlighter from \"react-syntax-highlighter\";\nimport {\n  docco,\n  atomOneDark,\n} from \"react-syntax-highlighter/dist/esm/styles/hljs\";\nimport { CalendarIcon } from \"@chakra-ui/icons\";\nimport ReactHtmlParser from \"react-html-parser\";\nimport { GET_SUBMISSION_BY_ID } from \"../../graphql/getSubmissionById\";\nimport { useLazyQuery } from \"@apollo/client\";\nimport { GET_VALIDATION_BY_ID } from \"../../graphql/getValidationById\";\nimport {\n  getSubmissionByIdQuery,\n  getSubmissionByIdQuery_submission,\n} from \"../../generated/getSubmissionByIdQuery\";\nimport {\n  getValidationByIdQuery,\n  getValidationByIdQuery_validation,\n} from \"../../generated/getValidationByIdQuery\";\nimport { useNotifications } from \"../Notifications\";\nimport { getPlayerValidationsQuery_player_validations } from \"../../generated/getPlayerValidationsQuery\";\n\ndayjs.extend(LocalizedFormat);\n\nconst getOutputs = (\n  activeAttempt: Partial<getValidationByIdQuery_validation>\n) => {\n  if (activeAttempt.outputs) {\n    return Object.keys(activeAttempt.outputs).map((objectKey, i) => {\n      return activeAttempt.outputs[objectKey];\n    });\n  } else {\n    return \"\";\n  }\n};\n\nconst getData = (data1: any, data2: any) => {\n  if (data1) {\n    return data1;\n  } else {\n    return data2;\n  }\n};\n\nconst AttemptModal = ({\n  isOpen,\n  onClose,\n  activeAttempt,\n  gameId,\n}: {\n  isOpen: boolean;\n  onClose: () => void;\n  activeAttempt?: Partial<getPlayerValidationsQuery_player_validations> & {\n    isSubmission: boolean;\n  };\n  gameId: string;\n}) => {\n  const [\n    detailedSubmissionOrValidationData,\n    setDetailedSubmissionOrValidationData,\n  ] = useState<\n    Partial<{\n      id: string;\n      feedback: string | null;\n      program: string | null;\n      outputs: any | null;\n    }>\n  >();\n\n  const { t } = useTranslation();\n  const { colorMode } = useColorMode();\n  const { add: addNotification } = useNotifications();\n\n  const [getSubmissionById, { loading: submissionLoading }] =\n    useLazyQuery<getSubmissionByIdQuery>(GET_SUBMISSION_BY_ID, {\n      onError: () => {\n        addNotification({\n          status: \"error\",\n          title: t(\"error.title\"),\n          description: t(\"error.description\"),\n        });\n      },\n      fetchPolicy: \"network-only\",\n      onCompleted: ({ submission }) => {\n        if (submission) {\n          console.log(\"lol\");\n          setDetailedSubmissionOrValidationData(submission);\n        }\n      },\n    });\n\n  const [getValidationById, { loading: validationLoading }] =\n    useLazyQuery<getValidationByIdQuery>(GET_VALIDATION_BY_ID, {\n      onError: () => {\n        addNotification({\n          status: \"error\",\n          title: t(\"error.title\"),\n          description: t(\"error.description\"),\n        });\n      },\n      fetchPolicy: \"network-only\",\n      onCompleted: ({ validation }) => {\n        if (validation) {\n          setDetailedSubmissionOrValidationData(validation);\n        }\n      },\n    });\n\n  useEffect(() => {\n    if (activeAttempt) {\n      if (activeAttempt.id) {\n        if (activeAttempt.isSubmission) {\n          console.log(\"submission\", {\n            variables: {\n              gameId,\n              submissionId: activeAttempt.id,\n            },\n          });\n          getSubmissionById({\n            variables: {\n              gameId,\n              submissionId: activeAttempt.id,\n            },\n          });\n        } else {\n          console.log(\"validation\");\n          getValidationById({\n            variables: {\n              gameId,\n              validationId: activeAttempt.id,\n            },\n          });\n        }\n      } else {\n        console.log(\"no id\");\n      }\n    }\n  }, [activeAttempt, gameId, getValidationById, getSubmissionById, isOpen]);\n\n  return (\n    <Drawer\n      onClose={() => {\n        setDetailedSubmissionOrValidationData(undefined);\n        onClose();\n      }}\n      isOpen={isOpen}\n      size=\"xl\"\n    >\n      <DrawerOverlay />\n      <DrawerContent>\n        <DrawerHeader>\n          {validationLoading || submissionLoading ? (\n            <Skeleton height=\"20px\" />\n          ) : detailedSubmissionOrValidationData?.outputs ? (\n            t(\"validation\")\n          ) : (\n            t(\"submission\")\n          )}\n          {/* {activeAttempt?.outputs ? t(\"validation\") : t(\"submission\")} */}\n        </DrawerHeader>\n        <ModalCloseButton />\n\n        <Skeleton\n          isLoaded={!submissionLoading && !validationLoading}\n          height=\"100%\"\n        >\n          <DrawerBody height=\"100%\">\n            <Stack\n              direction={{ base: \"column\", lg: \"row\" }}\n              width=\"100%\"\n              marginBottom={2}\n            >\n              {activeAttempt?.exerciseId && (\n                <DetailsCard\n                  darkerBorder\n                  title={t(\"Exercise\")}\n                  content={activeAttempt?.exerciseId}\n                  noMargins\n                />\n              )}\n              {activeAttempt?.language && (\n                <DetailsCard\n                  darkerBorder\n                  title={t(\"Language\")}\n                  content={activeAttempt?.language}\n                  noMargins\n                />\n              )}\n              {activeAttempt?.result && (\n                <DetailsCard\n                  darkerBorder\n                  title={t(\"Result\")}\n                  content={activeAttempt.result}\n                  noMargins\n                />\n              )}\n            </Stack>\n\n            {activeAttempt?.submittedAt && (\n              <Flex justifyContent=\"center\" alignItems=\"center\" marginTop={4}>\n                <CalendarIcon marginRight={2} />\n                <Text fontSize={14}>\n                  {t(\"Submitted at\")}{\" \"}\n                  {dayjs(activeAttempt?.submittedAt).format(\"lll\")}\n                </Text>\n              </Flex>\n            )}\n\n            <Flex\n              height=\"calc(100% - 155px)\"\n              flexDirection={{ base: \"column\", md: \"row\" }}\n              overflowY={{ base: \"scroll\", md: \"auto\" }}\n            >\n              {detailedSubmissionOrValidationData?.program && (\n                <Box\n                  width={\n                    detailedSubmissionOrValidationData.outputs ? 2 / 3 : \"100%\"\n                  }\n                  marginTop={4}\n                  marginBottom={4}\n                  borderRadius={4}\n                  // maxH=\"40vh\"\n                  overflowY=\"auto\"\n                >\n                  <SyntaxHighlighter\n                    wrapLines\n                    wrapLongLines\n                    customStyle={{\n                      fontSize: \"14px\",\n                      // minHeight: \"200px\",\n                      height: \"100%\",\n                    }}\n                    language={\n                      activeAttempt?.language ? activeAttempt.language : \"plain\"\n                    }\n                    style={colorMode === \"dark\" ? atomOneDark : docco}\n                  >\n                    {detailedSubmissionOrValidationData?.program || \"No data\"}\n                  </SyntaxHighlighter>\n                </Box>\n              )}\n\n              {detailedSubmissionOrValidationData?.outputs && (\n                <Box\n                  width={1 / 3}\n                  marginTop={4}\n                  marginBottom={4}\n                  borderRadius={4}\n                  marginLeft={2}\n                  // height=\"100%\"\n                  // maxHeight={\"40vh\"}\n                  overflowY=\"auto\"\n                >\n                  <SyntaxHighlighter\n                    wrapLines\n                    wrapLongLines\n                    customStyle={{\n                      fontSize: \"14px\",\n                      // minHeight: \"200px\",\n                      height: \"100%\",\n                    }}\n                    language={\n                      activeAttempt?.language ? activeAttempt.language : \"plain\"\n                    }\n                    style={colorMode === \"dark\" ? atomOneDark : docco}\n                  >\n                    {(detailedSubmissionOrValidationData.feedback\n                      ? detailedSubmissionOrValidationData.feedback\n                      : \"\") +\n                      getOutputs(detailedSubmissionOrValidationData.outputs)}\n                  </SyntaxHighlighter>\n                </Box>\n              )}\n            </Flex>\n          </DrawerBody>\n        </Skeleton>\n      </DrawerContent>\n    </Drawer>\n  );\n};\n\nexport default AttemptModal;\n","import { useQuery } from \"@apollo/client\";\nimport { Box, Skeleton } from \"@chakra-ui/react\";\nimport dayjs from \"dayjs\";\nimport LocalizedFormat from \"dayjs/plugin/localizedFormat\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport React, { useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { getPlayerRewardsQuery } from \"../../generated/getPlayerRewardsQuery\";\nimport { GET_PLAYER_REWARDS } from \"../../graphql/getPlayerRewards\";\nimport { checkIfConnectionAborted } from \"../../utilities/ErrorMessages\";\nimport RefreshCacheMenu from \"../RefreshCacheMenu\";\nimport TableComponent from \"../TableComponent\";\nimport ColumnFilter from \"../TableComponent/ColumnFilter\";\n\ndayjs.extend(LocalizedFormat);\n\nconst PlayerAttemptsTable = ({\n  userId,\n  gameId,\n}: {\n  userId: string;\n  gameId: string;\n}) => {\n  const { t } = useTranslation();\n  const [isRefreshing, setIsRefreshing] = useState(false);\n\n  const {\n    data: playerData,\n    error: playerError,\n    loading: playerLoading,\n    refetch: refetchPlayerData,\n  } = useQuery<getPlayerRewardsQuery>(GET_PLAYER_REWARDS, {\n    variables: { userId, gameId },\n    skip: !userId || !gameId,\n    fetchPolicy: \"network-only\",\n    onError: async (err) => {\n      const isServerConnectionError = checkIfConnectionAborted(err);\n      if (isServerConnectionError) {\n        setIsRefreshing(true);\n        await refetchPlayerData();\n        setIsRefreshing(false);\n      }\n    },\n  });\n\n  return (\n    <Box>\n      <AnimatePresence>\n        {playerError && !isRefreshing && (\n          <motion.div\n            initial={{ maxHeight: 0, opacity: 0 }}\n            animate={{ maxHeight: 50, opacity: 1 }}\n            exit={{ maxHeight: 0, opacity: 0 }}\n            style={{ width: \"100%\", textAlign: \"center\" }}\n          >\n            {t(\"error.title\")}\n            <br /> {t(\"error.description\")}\n          </motion.div>\n        )}\n      </AnimatePresence>\n      <AnimatePresence>\n        {isRefreshing && (\n          <motion.div\n            initial={{ maxHeight: 0, opacity: 0 }}\n            animate={{ maxHeight: 50, opacity: 1 }}\n            exit={{ maxHeight: 0, opacity: 0 }}\n            style={{ width: \"100%\", textAlign: \"center\" }}\n          >\n            {t(\"error.serverConnection.title\")}{\" \"}\n            {t(\"error.serverConnection.description\")}\n          </motion.div>\n        )}\n      </AnimatePresence>\n      <Skeleton isLoaded={!playerLoading && !playerError}>\n        <Box minH={200}>\n          {playerData && (\n            <TableComponent\n              refreshData={refetchPlayerData}\n              contextMenu={\n                <RefreshCacheMenu\n                  loading={playerLoading}\n                  refetch={refetchPlayerData}\n                />\n              }\n              columns={[\n                {\n                  Header: t(\"Name\"),\n                  accessor: \"reward.name\",\n                  Filter: ({ column }: { column: any }) => (\n                    <ColumnFilter\n                      column={column}\n                      placeholder={t(\"placeholders.string\")}\n                    />\n                  ),\n                },\n                {\n                  Header: t(\"Description\"),\n                  accessor: \"reward.description\",\n                  Filter: ({ column }: { column: any }) => (\n                    <ColumnFilter\n                      column={column}\n                      placeholder={t(\"placeholders.string\")}\n                    />\n                  ),\n                },\n                {\n                  Header: t(\"Kind\"),\n                  accessor: \"reward.kind\",\n                  Filter: ({ column }: { column: any }) => (\n                    <ColumnFilter\n                      column={column}\n                      placeholder={t(\"placeholders.string\")}\n                    />\n                  ),\n                },\n              ]}\n              data={playerData.player.rewards}\n            />\n          )}\n        </Box>\n      </Skeleton>\n    </Box>\n  );\n};\n\nexport default PlayerAttemptsTable;\n","import {\n  Button,\n  Modal,\n  ModalBody,\n  ModalCloseButton,\n  ModalContent,\n  ModalFooter,\n  ModalHeader,\n  ModalOverlay,\n  Table,\n  Tbody,\n  Td,\n  Th,\n  Thead,\n  Tr,\n} from \"@chakra-ui/react\";\nimport React from \"react\";\nimport { getPlayerQuery_player_learningPath } from \"../../generated/getPlayerQuery\";\nimport { useTranslation } from \"react-i18next\";\n\nconst ProgressModal = ({\n  isOpen,\n  onClose,\n  learningPaths,\n}: {\n  isOpen: boolean;\n  onClose: () => void;\n  learningPaths?: getPlayerQuery_player_learningPath[];\n}) => {\n  const { t } = useTranslation();\n\n  return (\n    <>\n      {learningPaths && (\n        <Modal isOpen={isOpen} onClose={onClose}>\n          <ModalOverlay />\n          <ModalContent>\n            <ModalHeader>{t(\"table.progress\")}</ModalHeader>\n            <ModalCloseButton />\n            <ModalBody>\n              <Table variant=\"simple\">\n                <Thead>\n                  <Tr>\n                    <Th>{t(\"Challenges\")}</Th>\n                    <Th>{t(\"table.progress\")}</Th>\n                  </Tr>\n                </Thead>\n                <Tbody>\n                  {learningPaths.map((learningPath, i) => {\n                    return (\n                      <Tr key={i}>\n                        <Td>{learningPath.challenge.name}</Td>\n                        <Td>{(learningPath.progress * 100).toFixed(1)}%</Td>\n                      </Tr>\n                    );\n                  })}\n                </Tbody>\n              </Table>\n            </ModalBody>\n\n            <ModalFooter>\n              <Button colorScheme=\"blue\" mr={3} onClick={onClose}>\n                Close\n              </Button>\n            </ModalFooter>\n          </ModalContent>\n        </Modal>\n      )}\n    </>\n  );\n};\n\nexport default ProgressModal;\n","import { useMutation } from \"@apollo/client\";\nimport {\n  Modal,\n  ModalOverlay,\n  ModalContent,\n  ModalHeader,\n  ModalCloseButton,\n  ModalBody,\n  ModalFooter,\n  Button,\n  Select,\n} from \"@chakra-ui/react\";\nimport React, { useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { getPlayerQuery_player_game_groups } from \"../../generated/getPlayerQuery\";\nimport { setGroupForMultipleMutation } from \"../../generated/setGroupForMultipleMutation\";\nimport { REMOVE_MULTIPLE_FROM_GROUP } from \"../../graphql/removeMultipleFromGroup\";\nimport { SET_GROUP_FOR_MULTIPLE } from \"../../graphql/setGroupForMultiple\";\nimport { useNotifications } from \"../Notifications\";\n\nconst SetGroupForSingleModal = ({\n  isOpen,\n  onClose,\n  groupsData,\n  playerId,\n  gameId,\n  refetch,\n}: {\n  isOpen: boolean;\n  onClose: () => void;\n  groupsData?: getPlayerQuery_player_game_groups[];\n  playerId: string;\n  gameId: string;\n  refetch: () => Promise<any>;\n}) => {\n  const { add: addNotification } = useNotifications();\n  const { t } = useTranslation();\n  const [loading, setLoading] = useState(false);\n  const [groupId, setGroupId] = useState(\"\");\n\n  const [\n    setGroupForMultiple,\n    { data: setGroupData, loading: setGroupLoading },\n  ] = useMutation<setGroupForMultipleMutation>(SET_GROUP_FOR_MULTIPLE);\n\n  const [removeMultipleFromGroup] = useMutation(REMOVE_MULTIPLE_FROM_GROUP);\n\n  const setGroup = async () => {\n    setLoading(true);\n    await setGroupForMultiple({\n      variables: {\n        playersIds: [playerId],\n        groupId,\n        gameId,\n      },\n    });\n    await refetch();\n    setLoading(false);\n    onClose();\n  };\n\n  const removeFromGroup = async () => {\n    setLoading(true);\n\n    try {\n      await removeMultipleFromGroup({\n        variables: {\n          playersIds: [playerId],\n          gameId,\n        },\n      });\n      await refetch();\n    } catch (err) {\n      addNotification({\n        status: \"error\",\n        title: t(\"error.removePlayers.title\"),\n        description: t(\"error.removePlayers.description\"),\n      });\n    }\n\n    setLoading(false);\n    onClose();\n  };\n\n  return (\n    <Modal isOpen={isOpen} onClose={onClose}>\n      <ModalOverlay />\n      <ModalContent>\n        <ModalHeader>{t(\"Change group\")}</ModalHeader>\n        <ModalCloseButton />\n        <ModalBody>\n          <Select\n            value={groupId}\n            onChange={(e) => setGroupId(e.target.value)}\n            placeholder={t(\"placeholders.chooseGroup\")}\n          >\n            {groupsData &&\n              groupsData.map((group, i) => {\n                return (\n                  <option value={group.id} key={i}>\n                    {group.displayName} ({group.name})\n                  </option>\n                );\n              })}\n          </Select>\n        </ModalBody>\n\n        <ModalFooter>\n          <Button\n            isLoading={loading}\n            variant=\"outline\"\n            mr={3}\n            onClick={removeFromGroup}\n            disabled={groupsData && groupsData.length <= 0}\n          >\n            {t(\"Remove from the group\")}\n          </Button>\n          <Button\n            isLoading={loading}\n            disabled={!groupId}\n            colorScheme=\"blue\"\n            onClick={setGroup}\n          >\n            {t(\"Change group\")}\n          </Button>\n        </ModalFooter>\n      </ModalContent>\n    </Modal>\n  );\n};\n\nexport default SetGroupForSingleModal;\n","import { gql } from \"@apollo/client\";\n\nexport const GET_PLAYER_SUBMISSIONS = gql`\n  query getPlayerSubmissionsQuery($gameId: String!, $userId: String!) {\n    player(gameId: $gameId, userId: $userId) {\n      id\n\n      submissions {\n        id\n        submittedAt\n        exerciseId\n        language\n        result\n      }\n    }\n  }\n`;\n","export const sortByDate = () => (rowA: any, rowB: any) => {\n  const a = new Date(rowA.original.submittedAt);\n\n  const b = new Date(rowB.original.submittedAt);\n\n  if (a > b) return 1;\n\n  if (b > a) return -1;\n\n  return 0;\n};\n","import { Box } from \"@chakra-ui/react\";\nimport dayjs from \"dayjs\";\nimport LocalizedFormat from \"dayjs/plugin/localizedFormat\";\nimport React, { useMemo } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { getPlayerQuery_player_learningPath } from \"../../generated/getPlayerQuery\";\nimport TableComponent from \"../TableComponent\";\nimport ColumnFilter from \"../TableComponent/ColumnFilter\";\nimport { sortByDate } from \"./Utils/sortByDate\";\n\ndayjs.extend(LocalizedFormat);\n\nconst getNameForExerciseId = (\n  exerciseId: string,\n  learningPaths: getPlayerQuery_player_learningPath[],\n  getChallengeName?: boolean\n) => {\n  const challenges = learningPaths;\n  // const challenges = playerGame.challenges;\n  for (let i = 0; i < challenges.length; i++) {\n    for (let ii = 0; ii < challenges[i].challenge.refs.length; ii++) {\n      if (challenges[i].challenge.refs[ii].id === exerciseId) {\n        if (getChallengeName) {\n          return challenges[i].challenge.name;\n        }\n        return challenges[i].challenge.refs[ii].name;\n      }\n    }\n  }\n};\n\n// type PlayerAttemptsTableType =\n//   | {\n//       onRowClick?: (row: any) => void;\n//     }\n//   | {\n//       isValidationsTable: true;\n//       playerData: getPlayerValidationsQuery;\n//     }\n//   | {\n//       isValidationsTable: false;\n//       playerData: getPlayerSubmissionsQuery;\n//     };\n/** a player attempt is a working name of a submission or validation */\nconst PlayerAttemptsTable = ({\n  playerData,\n  isValidationsTable,\n  onRowClick,\n  gameData,\n  contextMenu,\n  refreshData,\n}: {\n  isValidationsTable?: boolean;\n  playerData: any;\n  gameData: getPlayerQuery_player_learningPath[];\n  onRowClick?: (row: any) => void;\n  contextMenu: React.ReactNode;\n  refreshData?: () => Promise<any>;\n}) => {\n  const memoizedSortDateFunc = useMemo(sortByDate, []);\n\n  const { t } = useTranslation();\n  return (\n    <Box>\n      <TableComponent\n        refreshData={refreshData}\n        contextMenu={contextMenu}\n        onRowClick={(row: any) => {\n          onRowClick &&\n            onRowClick({\n              ...row,\n              exerciseId: getNameForExerciseId(row.exerciseId, gameData),\n            });\n        }}\n        columns={[\n          {\n            Header: t(\"Exercise\"),\n            accessor: ({ exerciseId }: { exerciseId: string }) =>\n              getNameForExerciseId(exerciseId, gameData),\n            Filter: ({ column }: { column: any }) => (\n              <ColumnFilter column={column} placeholder={\"abc\"} />\n            ),\n          },\n          {\n            Header: t(\"Challenges\"),\n            accessor: ({ exerciseId }: { exerciseId: string }) =>\n              getNameForExerciseId(exerciseId, gameData, true),\n            Filter: ({ column }: { column: any }) => (\n              <ColumnFilter column={column} placeholder={\"abc\"} />\n            ),\n          },\n          {\n            Header: t(\"Language\"),\n            accessor: \"language\",\n            Filter: ({ column }: { column: any }) => (\n              <ColumnFilter column={column} placeholder={\"abc\"} />\n            ),\n          },\n          {\n            Header: t(\"Result\"),\n            accessor: \"result\",\n            Filter: ({ column }: { column: any }) => (\n              <ColumnFilter column={column} placeholder={\"abc\"} />\n            ),\n          },\n          {\n            Header: t(\"Submitted at\"),\n            accessor: ({ submittedAt }: { submittedAt: Date }) =>\n              dayjs(submittedAt).format(\"lll\"),\n            Filter: ({ column }: { column: any }) => (\n              <ColumnFilter column={column} placeholder={\"abc\"} />\n            ),\n            sortType: memoizedSortDateFunc,\n          },\n        ]}\n        data={\n          isValidationsTable\n            ? playerData.player.validations\n            : playerData.player.submissions\n        }\n      />\n    </Box>\n  );\n};\n\nexport default PlayerAttemptsTable;\n","import { useKeycloak } from \"@react-keycloak/web\";\nimport React from \"react\";\nimport StudentProfile from \"./StudentProfile\";\nimport TeacherProfile from \"./TeacherProfile\";\n\nenum Roles {\n  teacher = \"teacher\",\n  student = \"student\",\n}\n\nconst Profile = () => {\n  const { keycloak } = useKeycloak();\n\n  if (keycloak.hasRealmRole(Roles.teacher)) {\n    return <TeacherProfile />;\n  } else {\n    return <StudentProfile />;\n  }\n};\n\nexport default Profile;\n","import { useQuery } from \"@apollo/client\";\nimport { Box, Skeleton } from \"@chakra-ui/react\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport React, { useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { getPlayerQuery_player_learningPath } from \"../../generated/getPlayerQuery\";\nimport { getPlayerSubmissionsQuery } from \"../../generated/getPlayerSubmissionsQuery\";\nimport { GET_PLAYER_SUBMISSIONS } from \"../../graphql/getPlayerSubmissions\";\nimport { checkIfConnectionAborted } from \"../../utilities/ErrorMessages\";\nimport RefreshCacheMenu from \"../RefreshCacheMenu\";\nimport PlayerAttemptsTable from \"./PlayerAttemptsTable\";\n\nconst SubmissionsTable = ({\n  userId,\n  gameId,\n  onSubmissionRowClick,\n  learningPaths: gameData,\n}: {\n  userId: string;\n  gameId: string;\n  onSubmissionRowClick: (row: any) => void;\n  learningPaths: getPlayerQuery_player_learningPath[];\n}) => {\n  const [isRefreshing, setIsRefreshing] = useState(false);\n  const { t } = useTranslation();\n\n  const {\n    data: playerData,\n    error: playerError,\n    loading: playerLoading,\n    refetch: refetchPlayerData,\n  } = useQuery<getPlayerSubmissionsQuery>(GET_PLAYER_SUBMISSIONS, {\n    variables: { userId, gameId },\n    skip: !userId || !gameId,\n    fetchPolicy: \"cache-first\",\n    onError: async (err) => {\n      const isServerConnectionError = checkIfConnectionAborted(err);\n      if (isServerConnectionError) {\n        setIsRefreshing(true);\n        await refetchPlayerData();\n        setIsRefreshing(false);\n      }\n    },\n  });\n\n  return (\n    <div>\n      <AnimatePresence>\n        {playerError && !isRefreshing && (\n          <motion.div\n            initial={{ maxHeight: 0, opacity: 0 }}\n            animate={{ maxHeight: 50, opacity: 1 }}\n            exit={{ maxHeight: 0, opacity: 0 }}\n            style={{ width: \"100%\", textAlign: \"center\" }}\n          >\n            {t(\"error.title\")}\n            <br /> {t(\"error.description\")}\n          </motion.div>\n        )}\n      </AnimatePresence>\n      <AnimatePresence>\n        {isRefreshing && (\n          <motion.div\n            initial={{ maxHeight: 0, opacity: 0 }}\n            animate={{ maxHeight: 50, opacity: 1 }}\n            exit={{ maxHeight: 0, opacity: 0 }}\n            style={{ width: \"100%\", textAlign: \"center\" }}\n          >\n            {t(\"error.serverConnection.title\")}{\" \"}\n            {t(\"error.serverConnection.description\")}\n          </motion.div>\n        )}\n      </AnimatePresence>\n      <Skeleton isLoaded={!playerLoading && !playerError}>\n        <Box minHeight={200}>\n          {playerData && (\n            <PlayerAttemptsTable\n              contextMenu={\n                <RefreshCacheMenu\n                  loading={playerLoading}\n                  refetch={refetchPlayerData}\n                />\n              }\n              onRowClick={onSubmissionRowClick}\n              playerData={playerData}\n              gameData={gameData}\n              refreshData={refetchPlayerData}\n            />\n          )}\n        </Box>\n      </Skeleton>\n    </div>\n  );\n};\n\nexport default SubmissionsTable;\n","import { gql } from \"@apollo/client\";\n\nexport const GET_PLAYER_VALIDATIONS = gql`\n  query getPlayerValidationsQuery($gameId: String!, $userId: String!) {\n    player(gameId: $gameId, userId: $userId) {\n      id\n\n      validations {\n        id\n        submittedAt\n        exerciseId\n        language\n        result\n      }\n    }\n  }\n`;\n","import { useQuery } from \"@apollo/client\";\nimport { Box, Skeleton } from \"@chakra-ui/react\";\nimport React, { useState } from \"react\";\nimport {\n  getPlayerQuery_player_game,\n  getPlayerQuery_player_learningPath,\n} from \"../../generated/getPlayerQuery\";\nimport { getPlayerValidationsQuery } from \"../../generated/getPlayerValidationsQuery\";\nimport { GET_PLAYER_VALIDATIONS } from \"../../graphql/getPlayerValidations\";\nimport { checkIfConnectionAborted } from \"../../utilities/ErrorMessages\";\nimport PlayerAttemptsTable from \"./PlayerAttemptsTable\";\nimport { useTranslation } from \"react-i18next\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport RefreshCacheMenu from \"../RefreshCacheMenu\";\n\nconst ValidationsTable = ({\n  userId,\n  gameId,\n  onValidationRowClick,\n  learningPaths: gameData,\n}: {\n  userId: string;\n  gameId: string;\n  onValidationRowClick: (row: any) => void;\n  learningPaths: getPlayerQuery_player_learningPath[];\n}) => {\n  const [isRefreshing, setIsRefreshing] = useState(false);\n  const { t } = useTranslation();\n\n  const {\n    data: playerData,\n    error: playerError,\n    loading: playerLoading,\n    refetch: refetchPlayerData,\n  } = useQuery<getPlayerValidationsQuery>(GET_PLAYER_VALIDATIONS, {\n    variables: { userId, gameId },\n    skip: !userId || !gameId,\n    fetchPolicy: \"cache-first\",\n    onError: async (err) => {\n      const isServerConnectionError = checkIfConnectionAborted(err);\n      if (isServerConnectionError) {\n        setIsRefreshing(true);\n        await refetchPlayerData();\n        setIsRefreshing(false);\n      }\n    },\n  });\n\n  return (\n    <div>\n      <AnimatePresence>\n        {playerError && !isRefreshing && (\n          <motion.div\n            initial={{ maxHeight: 0, opacity: 0 }}\n            animate={{ maxHeight: 50, opacity: 1 }}\n            exit={{ maxHeight: 0, opacity: 0 }}\n            style={{ width: \"100%\", textAlign: \"center\" }}\n          >\n            {t(\"error.title\")}\n            <br /> {t(\"error.description\")}\n          </motion.div>\n        )}\n      </AnimatePresence>\n      <AnimatePresence>\n        {isRefreshing && (\n          <motion.div\n            initial={{ maxHeight: 0, opacity: 0 }}\n            animate={{ maxHeight: 50, opacity: 1 }}\n            exit={{ maxHeight: 0, opacity: 0 }}\n            style={{ width: \"100%\", textAlign: \"center\" }}\n          >\n            {t(\"error.serverConnection.title\")}{\" \"}\n            {t(\"error.serverConnection.description\")}\n          </motion.div>\n        )}\n      </AnimatePresence>\n\n      <Skeleton isLoaded={!playerLoading && !playerError}>\n        <Box minHeight={200}>\n          {playerData && (\n            <PlayerAttemptsTable\n              contextMenu={\n                <RefreshCacheMenu\n                  loading={playerLoading}\n                  refetch={refetchPlayerData}\n                />\n              }\n              onRowClick={onValidationRowClick}\n              isValidationsTable\n              playerData={playerData}\n              gameData={gameData}\n              refreshData={refetchPlayerData}\n            />\n          )}\n        </Box>\n      </Skeleton>\n    </div>\n  );\n};\n\nexport default ValidationsTable;\n","import { useMutation, useQuery } from \"@apollo/client\";\nimport {\n  Accordion,\n  AccordionButton,\n  AccordionIcon,\n  AccordionItem,\n  AccordionPanel,\n  Box,\n  Button,\n  Divider,\n  Flex,\n  Heading,\n  HStack,\n  useDisclosure,\n  Link as ChakraLink,\n} from \"@chakra-ui/react\";\nimport { AnimatePresence } from \"framer-motion\";\nimport React, { useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { Link, useHistory, useParams } from \"react-router-dom\";\nimport { getPlayerQuery } from \"../../generated/getPlayerQuery\";\nimport { getPlayerValidationsQuery_player_validations } from \"../../generated/getPlayerValidationsQuery\";\nimport { GET_PLAYER } from \"../../graphql/getPlayer\";\nimport { REMOVE_SINGLE_FROM_GAME } from \"../../graphql/removeSingleFromGame\";\nimport { checkIfConnectionAborted } from \"../../utilities/ErrorMessages\";\nimport withChangeAnimation from \"../../utilities/withChangeAnimation\";\nimport DetailsCard from \"../DetailsCard\";\nimport Error from \"../Error\";\nimport { useNotifications } from \"../Notifications\";\nimport RefreshCacheMenu from \"../RefreshCacheMenu\";\nimport AttemptModal from \"./AttemptModal\";\nimport PlayerRewards from \"./PlayerRewards\";\nimport ProgressModal from \"./ProgressModal\";\nimport SetGroupForSingleModal from \"./SetGroupForSingleModal\";\nimport SubmissionsTable from \"./SubmissionsTable\";\nimport ValidationsTable from \"./ValidationsTable\";\n\n/** Returns page with game player details such as submissions, validations, submitted code, code results etc.\n *  Needs userId and gameId url params\n */\nconst PlayerDetails = () => {\n  const {\n    isOpen: isOpenProgress,\n    onOpen: onOpenProgress,\n    onClose: onCloseProgress,\n  } = useDisclosure();\n  const {\n    isOpen: isOpenAttempt,\n    onOpen: onOpenAttempt,\n    onClose: onCloseAttempt,\n  } = useDisclosure();\n  const {\n    isOpen: isOpenGroupSet,\n    onOpen: onOpenGroupSet,\n    onClose: onCloseGroupSet,\n  } = useDisclosure();\n\n  const { add: addNotification } = useNotifications();\n  const history = useHistory();\n  const { t } = useTranslation();\n  const { userId, gameId } = useParams<{ userId: string; gameId: string }>();\n\n  const [activeAttempt, setActiveAttempt] = useState<\n    Partial<getPlayerValidationsQuery_player_validations> & {\n      isSubmission: boolean;\n    }\n  >();\n\n  const [removeFromGame, { loading: removeSingleLoading }] = useMutation(\n    REMOVE_SINGLE_FROM_GAME\n  );\n\n  const {\n    data: playerData,\n    error: playerError,\n    loading: playerLoading,\n    refetch: playerRefetch,\n  } = useQuery<getPlayerQuery>(GET_PLAYER, {\n    variables: { userId, gameId },\n    skip: !userId || !gameId,\n    fetchPolicy: \"cache-first\",\n  });\n\n  const onSubmissionRowClick = (row: any) => {\n    onRowClick(row, true);\n  };\n\n  const onRowClick = (row: any, isSubmission?: boolean) => {\n    setActiveAttempt({\n      id: row.id,\n      exerciseId: row.exerciseId,\n      // program: row.program,\n      result: row.result,\n      // metrics: row.metrics,\n      submittedAt: row.submittedAt,\n      // feedback: row.feedback,\n      language: row.language,\n      // outputs: row.outputs ? row.outputs : undefined,\n      isSubmission: isSubmission ? isSubmission : false,\n    });\n    onOpenAttempt();\n  };\n\n  if (!userId || !gameId) {\n    return <Error />;\n  }\n\n  if (!playerLoading && playerError) {\n    const isServerConnectionError = checkIfConnectionAborted(playerError);\n\n    if (isServerConnectionError) {\n      return <Error serverConnectionError />;\n    } else {\n      return <Error errorContent={playerError} />;\n    }\n  }\n\n  if (playerLoading || !playerData) {\n    return <Box>{t(\"Loading\")}</Box>;\n  }\n\n  return (\n    <Box>\n      <ProgressModal\n        onClose={onCloseProgress}\n        isOpen={isOpenProgress}\n        learningPaths={playerData.player.learningPath}\n      />\n      <AttemptModal\n        onClose={onCloseAttempt}\n        isOpen={isOpenAttempt}\n        activeAttempt={activeAttempt}\n        gameId={gameId}\n      />\n      <SetGroupForSingleModal\n        onClose={onCloseGroupSet}\n        isOpen={isOpenGroupSet}\n        groupsData={playerData.player.game.groups}\n        playerId={playerData.player.id}\n        gameId={gameId}\n        refetch={playerRefetch}\n      />\n      <Flex justifyContent=\"space-between\" alignItems=\"center\" marginBottom={4}>\n        <Heading as=\"h3\" size=\"md\">\n          {t(\"Game profile\")}:{\" \"}\n          <Link to={`/teacher/student-details/${userId}`}>\n            <ChakraLink color=\"blue.500\">\n              {playerData.player.user.firstName}{\" \"}\n              {playerData.player.user.lastName}\n            </ChakraLink>\n          </Link>\n        </Heading>\n\n        <HStack spacing={2}>\n          <RefreshCacheMenu\n            loading={playerLoading}\n            refetch={playerRefetch}\n            size=\"md\"\n          />\n          <Button\n            isLoading={removeSingleLoading}\n            onClick={async () => {\n              try {\n                await removeFromGame({\n                  variables: {\n                    userId,\n                    gameId,\n                  },\n                });\n\n                history.push({\n                  pathname: `/teacher/game/${gameId}`,\n                });\n\n                addNotification({\n                  status: \"success\",\n                  title: t(\"success.title\"),\n                  description: t(\"success.description\"),\n                });\n              } catch (err) {\n                addNotification({\n                  status: \"error\",\n                  title: t(\"error.title\"),\n                  description: t(\"error.description\"),\n                });\n\n                console.log(err);\n              }\n            }}\n          >\n            {t(\"Remove from the game\")}\n          </Button>\n          <Button onClick={onOpenGroupSet}>{t(\"Change group\")}</Button>\n          <Link to={`/teacher/student-details/${userId}`}>\n            <Button>{t(\"User profile\")}</Button>\n          </Link>\n        </HStack>\n      </Flex>\n\n      <Flex flexDirection={{ base: \"column\", md: \"row\" }}>\n        <Box width=\"100%\" marginRight={{ base: 0, md: 2 }}>\n          <Link to={`/teacher/game/${gameId}`}>\n            <DetailsCard\n              title={t(\"Game\")}\n              content={playerData.player.game.name}\n              active\n            />\n          </Link>\n        </Box>\n\n        <DetailsCard\n          title={t(\"table.group\")}\n          content={playerData.player.group?.name || \"-\"}\n        />\n        <DetailsCard\n          title={t(\"table.submissions\")}\n          content={playerData.player.stats.nrOfSubmissions.toString()}\n        />\n        <DetailsCard\n          title={t(\"table.validations\")}\n          content={playerData.player.stats.nrOfValidations.toString()}\n        />\n        {/* {playerData.player.game} */}\n        <DetailsCard\n          active\n          onClick={onOpenProgress}\n          title={t(\"table.progress\")}\n          content={\n            (\n              (playerData.player.learningPath\n                .flatMap((learningPath: any) => learningPath.progress)\n                .reduce((a: any, b: any) => a + b, 0) /\n                playerData.player.learningPath.length) *\n              100\n            ).toFixed(1) + \"%\"\n          }\n        />\n      </Flex>\n\n      <Divider marginBottom={8} />\n\n      <Accordion allowToggle allowMultiple>\n        <AccordionItem>\n          {({ isExpanded }: { isExpanded: boolean }) => (\n            <>\n              <AccordionButton>\n                <Box flex=\"1\" textAlign=\"left\">\n                  <Heading as=\"h3\" size=\"sm\" marginTop={2} marginBottom={2}>\n                    {t(\"submissions\")}\n                  </Heading>\n                </Box>\n                <AccordionIcon />\n              </AccordionButton>\n\n              <AccordionPanel pb={4} marginTop={2} marginBottom={10}>\n                {/* <PlayerAttemptsTable\n                  onRowClick={onSubmissionRowClick}\n                  playerData={playerData}\n                /> */}\n                {isExpanded && (\n                  <SubmissionsTable\n                    userId={userId}\n                    gameId={gameId}\n                    onSubmissionRowClick={onSubmissionRowClick}\n                    learningPaths={playerData.player.learningPath}\n                  />\n                )}\n              </AccordionPanel>\n            </>\n          )}\n        </AccordionItem>\n\n        <AccordionItem>\n          {({ isExpanded }: { isExpanded: boolean }) => (\n            <>\n              <AccordionButton>\n                <Box flex=\"1\" textAlign=\"left\">\n                  <Heading as=\"h3\" size=\"sm\" marginTop={2} marginBottom={2}>\n                    {t(\"validations\")}\n                  </Heading>\n                </Box>\n                <AccordionIcon />\n              </AccordionButton>\n\n              <AccordionPanel pb={4} marginTop={2} marginBottom={10}>\n                {/* <PlayerAttemptsTable\n                  onRowClick={onRowClick}\n                  playerData={playerData}\n                  isValidationsTable\n                /> */}\n                {isExpanded && (\n                  <ValidationsTable\n                    userId={userId}\n                    gameId={gameId}\n                    onValidationRowClick={onRowClick}\n                    learningPaths={playerData.player.learningPath}\n                  />\n                )}\n              </AccordionPanel>\n            </>\n          )}\n        </AccordionItem>\n\n        <AccordionItem>\n          {({ isExpanded }: { isExpanded: boolean }) => (\n            <>\n              <AccordionButton>\n                <Box flex=\"1\" textAlign=\"left\">\n                  <Heading as=\"h3\" size=\"sm\" marginTop={2} marginBottom={2}>\n                    {t(\"Rewards\")}\n                  </Heading>\n                </Box>\n                <AccordionIcon />\n              </AccordionButton>\n\n              <AccordionPanel pb={4} marginTop={2} marginBottom={10}>\n                <AnimatePresence>\n                  {isExpanded && (\n                    <PlayerRewards gameId={gameId} userId={userId} />\n                  )}\n                </AnimatePresence>\n              </AccordionPanel>\n            </>\n          )}\n        </AccordionItem>\n      </Accordion>\n    </Box>\n  );\n};\n\nexport default withChangeAnimation(PlayerDetails);\n","import { gql } from \"@apollo/client\";\n\nexport const GET_TEACHER_GAMES = gql`\n  query getTeacherGamesQuery {\n    myGames {\n      id\n      name\n      description\n      private\n      archival\n      startDate\n      endDate\n      state\n      players {\n        id\n      }\n    }\n  }\n`;\n","import { useQuery } from \"@apollo/client\";\nimport {\n  Alert,\n  AlertIcon,\n  Box,\n  Heading,\n  Skeleton,\n  useColorModeValue,\n} from \"@chakra-ui/react\";\nimport styled from \"@emotion/styled\";\nimport dayjs from \"dayjs\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport React, { useMemo, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { Link, useHistory } from \"react-router-dom\";\nimport { getTeacherGamesQuery } from \"../generated/getTeacherGamesQuery\";\nimport { GET_TEACHER_GAMES } from \"../graphql/getTeacherGamesQuery\";\nimport { checkIfConnectionAborted } from \"../utilities/ErrorMessages\";\nimport RefreshCacheMenu from \"./RefreshCacheMenu\";\nimport TableComponent from \"./TableComponent\";\nimport ColumnFilter from \"./TableComponent/ColumnFilter\";\n\nexport const checkIsActive = (row: any) => {\n  if (row.state !== \"OPEN\") {\n    return false;\n  }\n\n  if (!row.startDate && !row.endDate) {\n    return true;\n  }\n\n  if (row.startDate && !row.endDate) {\n    return dayjs(row.startDate).isBefore(dayjs());\n  }\n\n  if (!row.startDate && row.endDate) {\n    return dayjs(row.endDate).isAfter(dayjs());\n  }\n\n  const startDate = dayjs(row.startDate);\n  const endDate = dayjs(row.endDate);\n\n  if (startDate.isBefore(dayjs(new Date()))) {\n    if (endDate.isAfter(dayjs())) {\n      return true;\n    }\n  }\n\n  return false;\n};\n\nconst InstructorGames = () => {\n  const memoizedArchivalSort = useMemo(\n    () => (rowA: any, rowB: any) => {\n      const a = rowA.original.archival;\n\n      const b = rowB.original.archival;\n\n      if (a > b) return 1;\n\n      if (b > a) return -1;\n\n      return 0;\n    },\n    []\n  );\n\n  const memoizedPrivateSort = useMemo(\n    () => (rowA: any, rowB: any) => {\n      const a = rowA.original.private;\n\n      const b = rowB.original.private;\n\n      if (a > b) return 1;\n\n      if (b > a) return -1;\n\n      return 0;\n    },\n    []\n  );\n\n  const memoizedSortFunc = useMemo(\n    () => (rowA: any, rowB: any) => {\n      const a = rowA.original.name;\n\n      const b = rowB.original.name;\n\n      if (a > b) return 1;\n\n      if (b > a) return -1;\n\n      return 0;\n    },\n    []\n  );\n  const history = useHistory();\n  const [isRefreshing, setIsRefreshing] = useState(false);\n\n  const { t } = useTranslation();\n\n  const {\n    data: teacherGamesData,\n    error: teacherGamesError,\n    loading: teacherGamesLoading,\n    refetch: refetchTeacherGames,\n  } = useQuery<getTeacherGamesQuery>(GET_TEACHER_GAMES, {\n    fetchPolicy: \"cache-first\",\n    onError: async (err) => {\n      const isServerConnectionError = checkIfConnectionAborted(err);\n      if (isServerConnectionError) {\n        setIsRefreshing(true);\n        await refetchTeacherGames();\n        setIsRefreshing(false);\n      }\n    },\n  });\n\n  return (\n    <div>\n      <AnimatePresence>\n        {teacherGamesError && !isRefreshing && (\n          <motion.div\n            initial={{ maxHeight: 0, opacity: 0 }}\n            animate={{ maxHeight: 50, opacity: 1 }}\n            exit={{ maxHeight: 0, opacity: 0 }}\n            style={{ width: \"100%\", textAlign: \"center\" }}\n          >\n            {t(\"error.title\")}\n            <br /> {t(\"error.description\")}\n          </motion.div>\n        )}\n      </AnimatePresence>\n\n      <AnimatePresence>\n        {isRefreshing && (\n          <motion.div\n            initial={{ maxHeight: 0, opacity: 0 }}\n            animate={{ maxHeight: 50, opacity: 1 }}\n            exit={{ maxHeight: 0, opacity: 0 }}\n            style={{ width: \"100%\", textAlign: \"center\" }}\n          >\n            {t(\"error.serverConnection.title\")}{\" \"}\n            {t(\"error.serverConnection.description\")}\n          </motion.div>\n        )}\n      </AnimatePresence>\n      <Box>\n        <Skeleton isLoaded={!teacherGamesLoading && !teacherGamesError}>\n          <Box minH={200}>\n            {teacherGamesData?.myGames.length === 0 && (\n              <Alert status=\"info\">\n                <AlertIcon />\n                {t(\"No games available\")}\n              </Alert>\n            )}\n\n            {teacherGamesData && (\n              <Box>\n                <TableComponent\n                  refreshData={refetchTeacherGames}\n                  contextMenu={\n                    <RefreshCacheMenu\n                      loading={teacherGamesLoading}\n                      refetch={refetchTeacherGames}\n                    />\n                  }\n                  onRowClick={(row) => {\n                    history.push({\n                      pathname: `/teacher/game/${row.id}`,\n                    });\n                  }}\n                  columns={[\n                    {\n                      Header: t(\"table.gameName\"),\n                      accessor: (row: any) => {\n                        const isActive = checkIsActive(row);\n                        return isActive ? (\n                          row.name\n                        ) : (\n                          <span style={{ opacity: 0.4 }}>{row.name}</span>\n                        );\n                      },\n                      Cell: ({ value }: { value: any }) => {\n                        return value ? value : \"-\";\n                      },\n                      Filter: ({ column }: { column: any }) => (\n                        <ColumnFilter\n                          column={column}\n                          placeholder={t(\"placeholders.gameName\")}\n                        />\n                      ),\n                      sortType: memoizedSortFunc,\n                    },\n                    {\n                      Header: t(\"table.gameDescription\"),\n                      accessor: \"description\",\n                      Cell: ({ value }: { value: any }) => {\n                        return value ? value : \"-\";\n                      },\n                      Filter: ({ column }: { column: any }) => (\n                        <ColumnFilter\n                          column={column}\n                          placeholder={t(\"placeholders.gameDescription\")}\n                        />\n                      ),\n                    },\n                    {\n                      Header: t(\"table.numberOfPlayers\"),\n                      accessor: \"players.length\",\n                      Filter: ({ column }: { column: any }) => (\n                        <ColumnFilter\n                          column={column}\n                          placeholder={t(\"placeholders.numberOfPlayers\")}\n                        />\n                      ),\n                    },\n                    {\n                      Header: t(\"addGame.private\"),\n                      accessor: \"private\",\n                      Cell: ({ value }: { value: any }) => {\n                        return value ? t(\"Yes\") : t(\"No\");\n                      },\n                      disableFilters: true,\n                      sortType: memoizedPrivateSort,\n                    },\n                    {\n                      Header: t(\"archival\"),\n                      accessor: \"archival\",\n                      Cell: ({ value }: { value: any }) => {\n                        return value ? t(\"Yes\") : t(\"No\");\n                      },\n                      disableFilters: true,\n                      sortType: memoizedArchivalSort,\n                    },\n                    // {\n                    //   Header: t(\"Active\"),\n                    //   accessor: (row: any) => {\n                    //     if (row.state != \"OPEN\") {\n                    //       return false;\n                    //     }\n\n                    //     if (!row.startDate && !row.endDate) {\n                    //       return true;\n                    //     }\n\n                    //     if (row.startDate && !row.endDate) {\n                    //       return dayjs(row.startDate).isBefore(dayjs());\n                    //     }\n\n                    //     if (!row.startDate && row.endDate) {\n                    //       return dayjs(row.endDate).isAfter(dayjs());\n                    //     }\n\n                    //     const startDate = dayjs(row.startDate);\n                    //     const endDate = dayjs(row.endDate);\n\n                    //     if (startDate.isBefore(dayjs(new Date()))) {\n                    //       console.log(\"it happened\");\n                    //       if (endDate.isAfter(dayjs())) {\n                    //         return true;\n                    //       }\n                    //     }\n\n                    //     return false;\n                    //   },\n                    //   Cell: ({ value }: { value: any }) => {\n                    //     return <span>{value ? \"Yes\" : \"No\"}</span>;\n                    //   },\n                    //   disableFilters: true,\n                    // },\n                  ]}\n                  data={teacherGamesData?.myGames}\n                />\n              </Box>\n            )}\n          </Box>\n        </Skeleton>\n      </Box>\n    </div>\n  );\n};\n\nconst Game = ({\n  name,\n  description,\n  id,\n}: {\n  name: string;\n  description: string | null;\n  id: string;\n}) => {\n  const color = useColorModeValue(\"gray.100\", \"gray.700\");\n\n  return (\n    <Link\n      to={{\n        pathname: `/teacher/game/${id}`,\n      }}\n      onClick={() => {}}\n    >\n      <GameStyled bg={color}>\n        <div>\n          <Heading size=\"sm\">{name}</Heading>\n          {description && <div>{description}</div>}\n        </div>\n      </GameStyled>\n    </Link>\n  );\n};\n\nconst GameStyled = styled(Box)`\n  height: 50px;\n  width: 100%;\n  border-radius: 5px;\n  /* background-color: white; */\n  display: flex;\n  align-items: center;\n  padding: 15px;\n  transition: transform 0.5s;\n\n  &:hover {\n    transform: scale(0.97);\n  }\n  & > div > div {\n    font-size: 12px;\n  }\n`;\n\nexport default InstructorGames;\n","import {\n  Box,\n  Divider,\n  Flex,\n  Heading,\n  Input,\n  StackDivider,\n  useColorModeValue,\n  VStack,\n} from \"@chakra-ui/react\";\nimport styled from \"@emotion/styled\";\nimport { useKeycloak } from \"@react-keycloak/web\";\nimport React, { useContext, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { Link } from \"react-router-dom\";\nimport NavContext from \"../context/NavContext\";\nimport {\n  PlayerGameProfiles,\n  PlayerGameProfiles_myGameProfiles_game,\n} from \"../generated/PlayerGameProfiles\";\nimport { checkIsActive } from \"./InstructorGames\";\n\n// name={gameProfile.game.name}\n//                 description={\n//                   gameProfile.game.description\n//                     ? gameProfile.game.description\n//                     : \"No description\"\n//                 }\n\nconst Game = ({\n  game,\n  small,\n  progress,\n}: {\n  game: PlayerGameProfiles_myGameProfiles_game;\n  progress: number;\n  small?: number;\n}) => {\n  const color = useColorModeValue(\"gray.100\", \"gray.700\");\n  const { t } = useTranslation();\n\n  return (\n    <GameStyled\n      bg={color}\n      opacity={game.state === \"LOCKED\" ? 0.5 : 1}\n      pointerEvents={game.state === \"LOCKED\" ? \"none\" : \"all\"}\n      small={small}\n      archival={game.archival}\n    >\n      <Flex justifyContent=\"space-between\" width=\"100%\" alignItems=\"center\">\n        <Box>\n          <div>\n            <Heading size={small ? \"md\" : \"lg\"}>{game.name}</Heading>\n            <div>\n              {game.description ? game.description : t(\"No description\")}\n            </div>\n          </div>\n        </Box>\n        <Box paddingRight={4} display={{ base: \"none\", sm: \"block\" }}>\n          <Flex flexDirection=\"column\" fontSize={14}>\n            <Box>\n              {t(\"table.progress\")}: {(progress * 100).toFixed(1)}%\n            </Box>\n          </Flex>\n        </Box>\n      </Flex>\n    </GameStyled>\n  );\n};\n\nexport const isGameAvailable = (gameData: {\n  state: string;\n  endDate: Date;\n  startDate: Date;\n  [key: string]: any;\n}) => {\n  return checkIsActive({\n    state: gameData.state,\n    endDate: gameData.endDate,\n    startDate: gameData.startDate,\n  });\n};\n\nconst GamesList = ({ data }: { data: PlayerGameProfiles }) => {\n  const [searchValue, setSearchValue] = useState(\"\");\n  const { setActiveGame } = useContext(NavContext);\n  const { t } = useTranslation();\n  const small = data.myGameProfiles.length > 5 ? 1 : 0;\n\n  return (\n    <Box>\n      <Flex\n        justifyContent=\"space-between\"\n        width=\"100%\"\n        flexDirection=\"row\"\n        marginTop={10}\n        alignItems=\"center\"\n      >\n        <Heading as=\"h3\" size=\"md\">\n          {t(\"Games\")}\n        </Heading>\n        {/* <Input\n          maxWidth={200}\n          value={searchValue}\n          onChange={(e) => setSearchValue(e.target.value)}\n        /> */}\n      </Flex>\n\n      <Divider marginTop={4} />\n      <VStack\n        divider={<StackDivider />}\n        spacing={small ? 2 : 4}\n        align=\"stretch\"\n        marginTop={4}\n      >\n        {data.myGameProfiles\n          .sort((a, b) => (a.game.archival > b.game.archival ? 1 : 0))\n          .map((gameProfile, i) => {\n            if (isGameAvailable(gameProfile.game)) {\n              return gameProfile.game.archival ? (\n                <Game\n                  game={gameProfile.game}\n                  small={small}\n                  progress={\n                    gameProfile.learningPath\n                      .flatMap((learningPath) => learningPath.progress)\n                      .reduce((a, b) => a + b, 0) /\n                    (gameProfile.learningPath.length || 1)\n                  }\n                  key={i}\n                />\n              ) : (\n                <Link\n                  key={i}\n                  to={{\n                    pathname: `/game/${gameProfile.game.id}`,\n                  }}\n                  onClick={() => {\n                    !gameProfile.game.archival &&\n                      setActiveGame({\n                        id: gameProfile.game.id,\n                        name: gameProfile.game.name,\n                      });\n                  }}\n                >\n                  <Game\n                    game={gameProfile.game}\n                    small={small}\n                    progress={\n                      gameProfile.learningPath\n                        .flatMap((learningPath) => learningPath.progress)\n                        .reduce((a, b) => a + b, 0) /\n                      (gameProfile.learningPath.length || 1)\n                    }\n                  />\n                </Link>\n              );\n            }\n          })}\n      </VStack>\n    </Box>\n  );\n};\n\nconst GameStyled = styled(Box)<{\n  locked?: boolean;\n  small?: number;\n  archival?: boolean;\n}>`\n  min-height: ${({ small }) => (small ? 50 : 80)}px;\n  width: 100%;\n  border-radius: 5px;\n  /* background-color: white; */\n  display: flex;\n  align-items: center;\n  padding: 15px;\n  transition: transform 0.5s;\n\n  opacity: ${({ archival }) => (archival ? 0.5 : 1)};\n\n  &:hover {\n    transform: scale(${({ archival }) => (archival ? 1 : 0.97)});\n  }\n  & > div > div {\n    font-size: 12px;\n  }\n`;\n\nexport default GamesList;\n","import { gql } from \"@apollo/client\";\n\nexport const ENROLL = gql`\n  mutation enrollMutation($gameId: String!) {\n    enroll(gameId: $gameId) {\n      id\n    }\n  }\n`;\n","import {\n  ApolloError,\n  ApolloQueryResult,\n  OperationVariables,\n  useMutation,\n} from \"@apollo/client\";\nimport { Box, Button, Tooltip } from \"@chakra-ui/react\";\nimport React, { useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { enrollMutation } from \"../generated/enrollMutation\";\nimport {\n  PlayerGameProfiles,\n  PlayerGameProfiles_games,\n  PlayerGameProfiles_myGameProfiles,\n} from \"../generated/PlayerGameProfiles\";\nimport { ENROLL } from \"../graphql/enroll\";\nimport { useNotifications } from \"./Notifications\";\nimport TableComponent from \"./TableComponent\";\nimport ColumnFilter from \"./TableComponent/ColumnFilter\";\n\nconst PublicGames = ({\n  gamesData,\n  gameProfiles,\n  refetch,\n}: {\n  gamesData: PlayerGameProfiles_games[];\n  gameProfiles: PlayerGameProfiles_myGameProfiles[];\n  refetch: (\n    variables?: Partial<OperationVariables> | undefined\n  ) => Promise<ApolloQueryResult<PlayerGameProfiles>>;\n}) => {\n  const { t } = useTranslation();\n  const gameProfileIds = gameProfiles.map((gameProfile) => gameProfile.game.id);\n  const [loading, setLoading] = useState(false);\n  const [enroll] = useMutation<enrollMutation>(ENROLL);\n  const { add: addNotification } = useNotifications();\n\n  const enrollInGame = async (id: string) => {\n    setLoading(true);\n    try {\n      await enroll({\n        variables: {\n          gameId: id,\n        },\n      });\n    } catch (err: any) {\n      if (\n        (err as ApolloError).graphQLErrors[0].message ===\n        \"The archival game cannot be accessed.\"\n      ) {\n        addNotification({\n          status: \"error\",\n          title: t(\"You cannot just an archival game\"),\n        });\n      } else {\n        addNotification({\n          status: \"error\",\n          title: t(\"error.title\"),\n        });\n      }\n    }\n    await refetch();\n    setLoading(false);\n  };\n\n  return (\n    <Box>\n      <TableComponent\n        loading={loading}\n        columns={[\n          {\n            Header: t(\"table.gameName\"),\n            accessor: \"name\",\n            Filter: ({ column }: { column: any }) => (\n              <ColumnFilter\n                column={column}\n                placeholder={t(\"placeholders.gameName\")}\n              />\n            ),\n          },\n          {\n            Header: t(\"table.gameDescription\"),\n            accessor: \"description\",\n            Filter: ({ column }: { column: any }) => (\n              <ColumnFilter\n                column={column}\n                placeholder={t(\"placeholders.gameDescription\")}\n              />\n            ),\n          },\n          {\n            Header: t(\"settings.action\"),\n            // accessor: \"id\",\n            accessor: (row: PlayerGameProfiles_games) => {\n              return gameProfileIds.includes(row.id) ? (\n                <Button size=\"sm\" variant=\"outline\" disabled={true}>\n                  {t(\"You're assigned\")}\n                </Button>\n              ) : row.archival ? (\n                <Tooltip\n                  label={t(\"This is an archival game\")}\n                  aria-label=\"A tooltip\"\n                  bg=\"gray.300\"\n                  color=\"black\"\n                  hasArrow\n                >\n                  <Box>\n                    <Button\n                      size=\"sm\"\n                      colorScheme=\"gray\"\n                      disabled={row.archival}\n                    >\n                      {t(\"Assign me\")}\n                    </Button>\n                  </Box>\n                </Tooltip>\n              ) : (\n                <Button\n                  size=\"sm\"\n                  colorScheme=\"blue\"\n                  onClick={() => enrollInGame(row.id)}\n                >\n                  {t(\"Assign me\")}\n                </Button>\n              );\n            },\n            disableFilters: true,\n            // accessor: (row: any) => {\n            //   // console.log(\"row\", row);\n            //   const acceptedSubmissions =\n            //     row.nrOfSubmissionsByActivityAndResult.ACCEPT || 0;\n            //   const totalSubmissions = row.nrOfSubmissionsByActivity;\n\n            //   return `${\n            //     totalSubmissions > 0\n            //       ? `${(\n            //           100 -\n            //           (acceptedSubmissions / totalSubmissions) * 100\n            //         ).toFixed(1)}%`\n            //       : \"-\"\n            //   }`;\n            // },\n          },\n        ]}\n        data={gamesData}\n      />\n    </Box>\n  );\n};\n\nexport default PublicGames;\n","import {\n  Box,\n  Button,\n  Flex,\n  List,\n  ListIcon,\n  ListItem,\n  Modal,\n  ModalBody,\n  ModalCloseButton,\n  ModalContent,\n  ModalFooter,\n  ModalHeader,\n  ModalOverlay,\n  useColorModeValue,\n  useDisclosure,\n} from \"@chakra-ui/react\";\nimport styled from \"@emotion/styled\";\nimport dayjs from \"dayjs\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport React, { useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { MdCheckCircle, MdDateRange } from \"react-icons/md\";\nimport { RiGamepadFill } from \"react-icons/ri\";\nimport { RewardType } from \"../generated/globalTypes\";\nimport {\n  PlayerGameProfiles,\n  PlayerGameProfiles_myGameProfiles,\n  PlayerGameProfiles_myGameProfiles_rewards_reward,\n} from \"../generated/PlayerGameProfiles\";\nimport ScrollbarWrapper from \"./ScrollbarWrapper\";\n\nconst getRewardsCount = (gameProfiles: PlayerGameProfiles_myGameProfiles[]) => {\n  let rewardsCount = 0;\n  gameProfiles.forEach((gameProfile) => {\n    gameProfile.rewards.forEach(({ reward }) => {\n      if (\n        reward.kind == RewardType.BADGE ||\n        reward.kind == RewardType.VIRTUAL_ITEM\n      ) {\n        rewardsCount++;\n      }\n    });\n  });\n\n  return rewardsCount;\n  // const rewards = gameProfiles.filter((gameProfile, i, array) => {\n  //   return (\n  //     gameProfile.rewards.length > 0 &&\n  //     gameProfile.rewards.map(({ reward }, i) => {\n  //       if (\n  //         reward.kind != RewardType.BADGE &&\n  //         reward.kind != RewardType.VIRTUAL_ITEM\n  //       ) {\n  //         return false;\n  //       }\n  //       return true;\n  //     })\n  //   );\n  // });\n  // console.log(rewards.length);\n  // return rewards.length;\n};\n\nconst getGridDimensions = (rewardsCount: number) => {\n  if (rewardsCount == 1) {\n    return { columns: 1, rows: 1 };\n  }\n  const sqrt = Math.sqrt(rewardsCount);\n  // Math.ceil(Math.sqrt(arrayLength) * 2)}\n  const columns = Math.floor(sqrt * 2) || 1;\n  console.log(columns);\n  const rows = Math.ceil(sqrt / 2) || 1;\n  return { columns, rows };\n};\n\nconst Rewards = ({ data }: { data: PlayerGameProfiles }) => {\n  const { t } = useTranslation();\n\n  const { isOpen, onOpen, onClose } = useDisclosure();\n  const [rewardForModal, setRewardForModal] =\n    useState<null | PlayerGameProfiles_myGameProfiles_rewards_reward>(null);\n\n  const gameProfiles = data.myGameProfiles;\n  // .flatMap((i) => [i, i])\n  // .flatMap((i) => [i, i])\n  // .flatMap((i) => [i, i])\n  // .flatMap((i) => [i, i])\n  // .flatMap((i) => [i, i])\n  // .flatMap((i) => [i, i]);\n\n  const color = useColorModeValue(\"gray.100\", \"gray.700\");\n  const rewardColor = useColorModeValue(\"gray.200\", \"gray.800\");\n  const [zoom, setZoom] = useState(false);\n\n  const [showRewardsAlert, setShowRewardsAlert] = useState(true);\n\n  return (\n    <>\n      <RewardModal\n        isOpen={isOpen && rewardForModal != null}\n        onClose={onClose}\n        reward={rewardForModal}\n      />\n      <Box>\n        <Box position=\"relative\">\n          <Button\n            onClick={() => setZoom(!zoom)}\n            position=\"absolute\"\n            right={4}\n            bottom={4}\n            zIndex=\"999\"\n            colorScheme=\"teal\"\n            size=\"sm\"\n            opacity={0.7}\n            _hover={{ opacity: 1 }}\n          >\n            {t(\"Toggle view\")}\n          </Button>\n\n          <RewardsWrapper bg={color}>\n            <ScrollbarWrapper thin>\n              <DynamicGrid\n                gridDimensions={getGridDimensions(\n                  getRewardsCount(gameProfiles)\n                )}\n                className={zoom ? \"zoom\" : \"\"}\n              >\n                {data &&\n                  gameProfiles.map((gameProfile, i, array) => {\n                    return (\n                      gameProfile.rewards.length > 0 &&\n                      gameProfile.rewards.map(({ reward }, i) => {\n                        if (\n                          reward.kind != RewardType.BADGE &&\n                          reward.kind != RewardType.VIRTUAL_ITEM\n                        ) {\n                          return;\n                        }\n                        if (showRewardsAlert) {\n                          setShowRewardsAlert(false);\n                        }\n                        return (\n                          <RewardStyle\n                            textAlign=\"center\"\n                            bg={rewardColor}\n                            cursor=\"pointer\"\n                            key={i}\n                            onClick={() => {\n                              setRewardForModal(reward);\n                              onOpen();\n                            }}\n                          >\n                            <RewardImage imageData={reward.image} zoom={zoom} />\n                            <AnimatePresence>\n                              {(zoom || gameProfiles.length < 12) && (\n                                <motion.div\n                                  initial={{\n                                    opacity: 0,\n                                    maxHeight: 0,\n                                    maxWidth: 0,\n                                    transform: \"scale(0)\",\n                                  }}\n                                  animate={{\n                                    opacity: 1,\n                                    maxHeight: 40,\n                                    maxWidth: 120,\n                                    transform: \"scale(1)\",\n                                  }}\n                                  exit={{\n                                    opacity: 0,\n                                    maxHeight: 0,\n                                    maxWidth: 0,\n                                    transform: \"scale(0)\",\n                                  }}\n                                  transition={{ duration: 0.2 }}\n                                  className={\"name\" + (zoom ? \" show\" : \"\")}\n                                >\n                                  <div>{reward.name}</div>\n                                </motion.div>\n                              )}\n                            </AnimatePresence>\n\n                            {/* <p>{reward.description}</p> */}\n                          </RewardStyle>\n                        );\n                      })\n                    );\n                  })}\n              </DynamicGrid>\n            </ScrollbarWrapper>\n            {showRewardsAlert && <RewardsAlert>{t(\"No rewards\")}</RewardsAlert>}\n          </RewardsWrapper>\n        </Box>\n      </Box>\n    </>\n  );\n};\n\nconst RewardsAlert = styled.div`\n  position: absolute;\n  height: 100%;\n  width: 100%;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  padding: 14px;\n  text-align: center;\n`;\n\nconst RewardModal = ({\n  isOpen,\n  onClose,\n  reward,\n}: {\n  isOpen: boolean;\n  onClose: () => void;\n  reward: PlayerGameProfiles_myGameProfiles_rewards_reward | null;\n}) => {\n  const { t } = useTranslation();\n\n  return (\n    <>\n      {reward && (\n        <Modal isOpen={isOpen} onClose={onClose}>\n          <ModalOverlay />\n          <ModalContent>\n            <ModalHeader>{reward.name}</ModalHeader>\n            <ModalCloseButton />\n            <ModalBody\n              display=\"flex\"\n              alignItems=\"center\"\n              flexDirection=\"column\"\n            >\n              <Box width=\"100%\" height=\"250px\">\n                <RewardImage imageData={reward.image} />\n              </Box>\n              <List spacing={3}>\n                {reward.description && (\n                  <ListItem>\n                    <ListIcon as={MdCheckCircle} color=\"green.500\" />\n                    {reward.description}\n                  </ListItem>\n                )}\n                {reward.parentChallenge && (\n                  <ListItem>\n                    <ListIcon as={MdCheckCircle} color=\"green.500\" />\n                    {t(\"Challenge\")}: {reward.parentChallenge.name}\n                  </ListItem>\n                )}\n                {reward.createdAt && (\n                  <ListItem>\n                    <ListIcon as={MdDateRange} color=\"green.500\" />\n                    {dayjs(reward.createdAt).format(\"DD/MM/YYYY\")}\n                  </ListItem>\n                )}\n\n                {reward.game && (\n                  <ListItem>\n                    <ListIcon as={RiGamepadFill} color=\"green.500\" />\n                    {t(\"Game\")}: {reward.game.name}\n                  </ListItem>\n                )}\n\n                {/* <ListItem>\n                  <ListIcon as={VscDebugBreakpointLog} color=\"green.500\" />\n                  Cost: {reward.cost}\n                </ListItem> */}\n              </List>\n            </ModalBody>\n            <ModalFooter>\n              <Button colorScheme=\"blue\" mr={3} onClick={onClose}>\n                {t(\"Close\")}\n              </Button>\n            </ModalFooter>\n          </ModalContent>\n        </Modal>\n      )}\n    </>\n  );\n};\n\nconst RewardImage = styled.div<{ imageData: string | null; zoom?: boolean }>`\n  width: 85%;\n  transition: height 0.5s;\n  height: ${({ zoom }) => (zoom ? 55 : 75)}%;\n\n  background: ${({ imageData }) =>\n    imageData ? `url(${imageData})` : \"#e2e2e2\"};\n  background-position: center;\n  background-size: cover;\n  border-radius: 5px;\n  margin: auto;\n  @media only screen and (max-width: 600px) {\n    height: 95%;\n    width: 95%;\n  }\n`;\n\nconst DynamicGrid = styled.div<{\n  gridDimensions: { columns: number; rows: number };\n}>`\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  display: grid;\n  padding: 10px;\n  grid-template-columns: repeat(\n    ${({ gridDimensions }) => gridDimensions.columns},\n    minmax(auto, 180px)\n  );\n  grid-template-rows: repeat(\n    ${({ gridDimensions }) => gridDimensions.rows},\n    minmax(auto, 180px)\n  );\n\n  gap: ${({ gridDimensions }) => (gridDimensions.columns > 20 ? 4 : 8)}px;\n  @media only screen and (max-width: 600px) {\n    gap: 4px;\n  }\n\n  justify-content: center;\n\n  &.zoom {\n    grid-template-columns: repeat(auto-fill, 120px);\n    grid-template-rows: repeat(auto-fill, 120px);\n    grid-auto-rows: 120px;\n    margin: auto;\n    justify-content: center;\n  }\n\n  overflow-y: scroll;\n  overflow-x: hidden;\n`;\n\nconst RewardsWrapper = styled(Box)`\n  width: 100%;\n  height: 250px;\n  margin-bottom: 10px;\n  border-radius: 5px;\n\n  .highlight {\n    width: 100%;\n    height: 100%;\n    filter: brightness(1.75);\n  }\n\n  .zoom-icon {\n    position: absolute;\n    right: 4px;\n    bottom: 4px;\n    cursor: pointer;\n    z-index: 999;\n  }\n\n  overflow-x: hidden;\n  overflow-y: hidden;\n`;\n\nconst RewardStyle = styled(Flex)`\n  width: 100%;\n  height: 100%;\n  display: flex;\n  flex-direction: column;\n  font-size: 13px;\n  /* min-width: 150px; */\n  /* margin: 5px; */\n  /* padding-top: 10px; */\n  justify-content: space-evenly;\n  align-items: center;\n  border-radius: 5px;\n  user-select: none;\n\n  transition: transform 0.5s;\n\n  @media only screen and (max-width: 600px) {\n    .name {\n      display: none;\n    }\n    height: 75%;\n  }\n\n  .name.show {\n    display: inline-block;\n  }\n\n  &:hover {\n    transform: scale(1.1);\n  }\n`;\n\nexport default Rewards;\n","import { gql, useQuery } from \"@apollo/client\";\nimport { Heading } from \"@chakra-ui/react\";\nimport { useKeycloak } from \"@react-keycloak/web\";\nimport React, { useEffect, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { PlayerGameProfiles } from \"../generated/PlayerGameProfiles\";\nimport { checkIfConnectionAborted } from \"../utilities/ErrorMessages\";\nimport withChangeAnimation from \"../utilities/withChangeAnimation\";\nimport Error from \"./Error\";\nimport GamesList from \"./GamesList\";\nimport PublicGames from \"./PublicGames\";\nimport Rewards from \"./Rewards\";\n\nconst PLAYER_GAME_PROFILES = gql`\n  query PlayerGameProfiles {\n    myGameProfiles {\n      id\n      game {\n        archival\n        id\n        name\n        description\n        startDate\n        endDate\n        state\n      }\n      user {\n        id\n      }\n\n      learningPath {\n        id\n        progress\n      }\n      rewards {\n        id\n        reward {\n          id\n          name\n          description\n          image\n          kind\n          cost\n          createdAt\n          game {\n            name\n          }\n          parentChallenge {\n            name\n          }\n        }\n      }\n    }\n\n    games {\n      id\n      name\n      description\n      archival\n    }\n  }\n`;\n\nconst StudentProfile: React.ComponentType = () => {\n  const { t, i18n } = useTranslation();\n  const { keycloak, initialized } = useKeycloak();\n  const { data, error, loading, refetch } = useQuery<PlayerGameProfiles>(\n    PLAYER_GAME_PROFILES,\n    {\n      fetchPolicy: \"no-cache\",\n    }\n  );\n\n  const [userProfile, setUserProfile] =\n    useState<null | Keycloak.KeycloakProfile>(null);\n  //   console.log(\"userProfile\", userProfile);\n  const loadUserProfile = async () => {\n    setUserProfile(await keycloak.loadUserProfile());\n  };\n\n  useEffect(() => {\n    if (initialized) {\n      loadUserProfile();\n    }\n  }, [initialized]);\n\n  if (loading) {\n    return <div>{t(\"Loading\")}</div>;\n  }\n\n  if (!loading && error) {\n    const isServerConnectionError = checkIfConnectionAborted(error);\n\n    if (isServerConnectionError) {\n      return <Error serverConnectionError />;\n    } else {\n      return <Error errorContent={error} />;\n    }\n  }\n\n  if (!data) {\n    return <Error />;\n  }\n\n  return (\n    <div>\n      {/* Hello, {userProfile?.firstName} {userProfile?.lastName} */}\n      <Heading as=\"h3\" size=\"md\" marginTop={5} marginBottom={5}>\n        {t(\"Rewards\")}\n      </Heading>\n      <Rewards data={data} />\n\n      <GamesList data={data} />\n      {data.myGameProfiles.length < 1 && t(\"No games\")}\n\n      <Heading as=\"h3\" size=\"md\" marginTop={10}>\n        {t(\"All available games\")}\n      </Heading>\n\n      <PublicGames\n        gamesData={data.games}\n        gameProfiles={data.myGameProfiles}\n        refetch={refetch}\n      />\n    </div>\n  );\n};\n\nexport default withChangeAnimation(StudentProfile);\n","import { gql } from \"@apollo/client\";\n\nexport const GET_TEACHER_STUDENTS_DETAILS = gql`\n  query getTeacherStudentsDetails {\n    myGames {\n      id\n      name\n      players {\n        stats {\n          nrOfSubmissions\n          nrOfValidations\n        }\n\n        # points\n\n        group {\n          name\n        }\n        user {\n          id\n          lastName\n          firstName\n        }\n\n        learningPath {\n          progress\n        }\n      }\n    }\n  }\n`;\n","import { useQuery } from \"@apollo/client\";\nimport { Alert, AlertIcon, Box, Skeleton } from \"@chakra-ui/react\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport React, { useMemo, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { useHistory } from \"react-router-dom\";\nimport { getTeacherStudentsDetails } from \"../generated/getTeacherStudentsDetails\";\nimport { GET_TEACHER_STUDENTS_DETAILS } from \"../graphql/getTeacherStudentsDetails\";\nimport { checkIfConnectionAborted } from \"../utilities/ErrorMessages\";\nimport RefreshCacheMenu from \"./RefreshCacheMenu\";\nimport TableComponent from \"./TableComponent\";\nimport ColumnFilter from \"./TableComponent/ColumnFilter\";\n\nconst getPlayers = (data: getTeacherStudentsDetails | undefined) => {\n  if (!data) {\n    return [];\n  }\n\n  const players = data.myGames.flatMap((game) => {\n    return game.players.flatMap((player) => {\n      // const totalExercises = player.learningPath.flatMap((learningPath) =>\n      //   learningPath.refs.flatMap((ref) => ref)\n      // );\n\n      // const progress = {\n      //   total: totalExercises.length,\n      //   progress: totalExercises.filter((item) => item.solved).length,\n      // };\n\n      const totalChallengesCount = player.learningPath.length || 1;\n\n      const progressCombined =\n        player.learningPath\n          .flatMap((learningPath) => learningPath.progress)\n          .reduce((a, b) => a + b, 0) / totalChallengesCount;\n\n      return { ...player, progress: progressCombined, game };\n    });\n  });\n\n  return players;\n};\n\nconst TeacherStudents = () => {\n  const memoizedSortFunc = useMemo(\n    () => (rowA: any, rowB: any) => {\n      const a = rowA.original.progress;\n      const b = rowB.original.progress;\n\n      if (a > b) return 1;\n\n      if (b > a) return -1;\n\n      return 0;\n    },\n    []\n  );\n  const history = useHistory();\n  const [isRefreshing, setIsRefreshing] = useState(false);\n\n  const { t } = useTranslation();\n\n  const {\n    data: teacherStudentsData,\n    error: teacherStudentsError,\n    loading: teacherStudentsLoading,\n    refetch: refetchTeacherStudents,\n  } = useQuery<getTeacherStudentsDetails>(GET_TEACHER_STUDENTS_DETAILS, {\n    fetchPolicy: \"cache-first\",\n    onError: async (err) => {\n      const isServerConnectionError = checkIfConnectionAborted(err);\n      if (isServerConnectionError) {\n        setIsRefreshing(true);\n        await refetchTeacherStudents();\n        setIsRefreshing(false);\n      }\n    },\n  });\n\n  const players = getPlayers(teacherStudentsData);\n\n  return (\n    <div>\n      <Box>\n        <AnimatePresence>\n          {teacherStudentsError && !isRefreshing && (\n            <motion.div\n              initial={{ maxHeight: 0, opacity: 0 }}\n              animate={{ maxHeight: 50, opacity: 1 }}\n              exit={{ maxHeight: 0, opacity: 0 }}\n              style={{ width: \"100%\", textAlign: \"center\" }}\n            >\n              {t(\"error.title\")}\n              <br /> {t(\"error.description\")}\n            </motion.div>\n          )}\n        </AnimatePresence>\n\n        <AnimatePresence>\n          {isRefreshing && (\n            <motion.div\n              initial={{ maxHeight: 0, opacity: 0 }}\n              animate={{ maxHeight: 50, opacity: 1 }}\n              exit={{ maxHeight: 0, opacity: 0 }}\n              style={{ width: \"100%\", textAlign: \"center\" }}\n            >\n              {t(\"error.serverConnection.title\")}{\" \"}\n              {t(\"error.serverConnection.description\")}\n            </motion.div>\n          )}\n        </AnimatePresence>\n        {/* <Heading as=\"h3\" size=\"md\" marginTop={5} marginBottom={5}>\n          {t(\"All your students\")}\n        </Heading> */}\n        <Skeleton isLoaded={!teacherStudentsLoading && !teacherStudentsError}>\n          <Box minH={200}>\n            {players.length === 0 && (\n              <Alert status=\"info\">\n                <AlertIcon />\n                {t(\"You have no students yet\")}\n              </Alert>\n            )}\n            {teacherStudentsData && (\n              <Box>\n                <TableComponent\n                  refreshData={refetchTeacherStudents}\n                  contextMenu={\n                    <RefreshCacheMenu\n                      loading={teacherStudentsLoading}\n                      refetch={refetchTeacherStudents}\n                    />\n                  }\n                  onRowClick={(row: typeof players[number]) => {\n                    history.push({\n                      pathname: `/teacher/student-details/${row.user.id}`,\n                    });\n                  }}\n                  columns={[\n                    {\n                      Header: t(\"table.name\"),\n                      accessor: \"user.firstName\",\n                      Filter: ({ column }: { column: any }) => (\n                        <ColumnFilter\n                          column={column}\n                          placeholder={t(\"placeholders.name\")}\n                        />\n                      ),\n                    },\n                    {\n                      Header: t(\"table.lastName\"),\n                      accessor: \"user.lastName\",\n                      Filter: ({ column }: { column: any }) => (\n                        <ColumnFilter\n                          column={column}\n                          placeholder={t(\"placeholders.lastName\")}\n                        />\n                      ),\n                    },\n                    {\n                      Header: t(\"table.game\"),\n                      accessor: \"game.name\",\n                      Filter: ({ column }: { column: any }) => (\n                        <ColumnFilter\n                          column={column}\n                          placeholder={t(\"placeholders.game\")}\n                        />\n                      ),\n                    },\n                    {\n                      Header: t(\"table.submissions\"),\n                      accessor: \"stats.nrOfSubmissions\",\n                      Filter: ({ column }: { column: any }) => (\n                        <ColumnFilter column={column} placeholder=\"123\" />\n                      ),\n                    },\n                    {\n                      Header: t(\"table.validations\"),\n                      accessor: \"stats.nrOfValidations\",\n                      Filter: ({ column }: { column: any }) => (\n                        <ColumnFilter column={column} placeholder=\"123\" />\n                      ),\n                    },\n                    {\n                      Header: t(\"table.group\"),\n                      accessor: \"group.name\",\n                      Cell: ({ value }: { value: any }) => {\n                        return value ? value : \"-\";\n                      },\n                      Filter: ({ column }: { column: any }) => (\n                        <ColumnFilter\n                          column={column}\n                          placeholder={t(\"placeholders.group\")}\n                        />\n                      ),\n                    },\n                    {\n                      Header: t(\"table.progress\"),\n                      accessor: \"progress\",\n                      Cell: ({ value }: { value: any }) => {\n                        return (value * 100).toFixed(1) + \"%\";\n                      },\n                      disableFilters: true,\n                      sortType: memoizedSortFunc,\n                    },\n                  ]}\n                  data={players}\n                />\n              </Box>\n            )}\n          </Box>\n        </Skeleton>\n      </Box>\n    </div>\n  );\n};\n\nexport default TeacherStudents;\n","import {\n  Accordion,\n  AccordionButton,\n  AccordionIcon,\n  AccordionItem,\n  AccordionPanel,\n  Box,\n  Button,\n  Flex,\n  Heading,\n} from \"@chakra-ui/react\";\nimport React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { Link } from \"react-router-dom\";\nimport withChangeAnimation from \"../utilities/withChangeAnimation\";\nimport InstructorGames from \"./InstructorGames\";\nimport TeacherStudents from \"./TeacherStudents\";\n\nconst TeacherProfile = () => {\n  const { t } = useTranslation();\n\n  return (\n    <div>\n      <Flex justifyContent=\"flex-end\" alignItems=\"center\" marginBottom={4}>\n        {/* <Heading as=\"h3\" size=\"md\" marginTop={5} marginBottom={5}>\n            {t(\"Your games\")}\n          </Heading> */}\n\n        <Link to=\"/teacher/manage-games\">\n          <Button marginRight={5}>{t(\"Manage games\")}</Button>\n        </Link>\n      </Flex>\n      <Accordion allowToggle allowMultiple>\n        <AccordionItem>\n          {({ isExpanded }: { isExpanded: boolean }) => (\n            <>\n              <AccordionButton>\n                <Box flex=\"1\" textAlign=\"left\">\n                  <Heading as=\"h3\" size=\"md\" marginTop={5} marginBottom={5}>\n                    {t(\"Your games\")}\n                  </Heading>\n                </Box>\n                <AccordionIcon />\n              </AccordionButton>\n\n              <AccordionPanel pb={4} marginTop={2} marginBottom={10}>\n                {isExpanded && <InstructorGames />}\n              </AccordionPanel>\n            </>\n          )}\n        </AccordionItem>\n        <AccordionItem>\n          {({ isExpanded }: { isExpanded: boolean }) => (\n            <>\n              <AccordionButton>\n                <Box flex=\"1\" textAlign=\"left\">\n                  <Heading as=\"h3\" size=\"md\" marginTop={5} marginBottom={5}>\n                    {t(\"All your students\")}\n                  </Heading>\n                </Box>\n                <AccordionIcon />\n              </AccordionButton>\n\n              <AccordionPanel pb={4} marginTop={2} marginBottom={10}>\n                {isExpanded && <TeacherStudents />}\n              </AccordionPanel>\n            </>\n          )}\n        </AccordionItem>\n      </Accordion>\n    </div>\n  );\n};\n\nexport default withChangeAnimation(TeacherProfile);\n","import { Box, Flex, Table, Tbody, Td, Th, Thead, Tr } from \"@chakra-ui/react\";\nimport styled from \"@emotion/styled\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport React, { useMemo } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport Pagination from \"react-js-pagination\";\nimport { useFilters, usePagination, useTable } from \"react-table\";\nimport ScrollbarWrapper from \"../ScrollbarWrapper\";\n\nconst TableComponent = ({\n  columns: columnsProp,\n  data: dataProp,\n  dontRecomputeChange,\n}: {\n  columns: any;\n  data: any;\n  dontRecomputeChange?: boolean;\n}) => {\n  const { i18n } = useTranslation();\n  const columns = useMemo(\n    () => columnsProp,\n    [dontRecomputeChange ? null : columnsProp, i18n.language]\n  );\n  const data = useMemo(\n    () => dataProp,\n    [dontRecomputeChange ? null : dataProp, i18n.language]\n  );\n\n  const tableInstance = useTable(\n    {\n      columns,\n      data,\n    },\n    useFilters,\n    usePagination\n  );\n\n  const { getTableProps, getTableBodyProps, headerGroups, prepareRow } =\n    tableInstance;\n\n  const { page, state, gotoPage }: any = tableInstance;\n  const { pageSize, pageIndex } = state;\n\n  return (\n    <ScrollbarWrapper>\n      <Box overflowX=\"auto\">\n        <Table {...getTableProps()} maxWidth=\"100%\">\n          <Thead userSelect=\"none\">\n            {headerGroups.map((headerGroup) => (\n              <Tr {...headerGroup.getHeaderGroupProps()}>\n                {headerGroup.headers.map((column: any, i) => (\n                  <Th {...column.getHeaderProps()}>\n                    <Flex justifyContent=\"space-between\">\n                      <Box color={column.isSorted ? \"deepskyblue\" : \"default\"}>\n                        {column.render(\"Header\")}\n                      </Box>\n                    </Flex>\n                  </Th>\n                ))}\n              </Tr>\n            ))}\n          </Thead>\n          <Tbody {...getTableBodyProps()}>\n            {page.map((row: any) => {\n              prepareRow(row);\n              return (\n                <Tr {...row.getRowProps()}>\n                  {row.cells.map((cell: any) => (\n                    <Td {...cell.getCellProps()}>{cell.render(\"Cell\")}</Td>\n                  ))}\n                </Tr>\n              );\n            })}\n          </Tbody>\n        </Table>\n      </Box>\n      <PaginationStyled>\n        <Pagination\n          activePage={pageIndex + 1}\n          itemsCountPerPage={pageSize}\n          totalItemsCount={data.length}\n          pageRangeDisplayed={5}\n          onChange={(pageNumber: number) => {\n            gotoPage(pageNumber - 1);\n          }}\n        />\n      </PaginationStyled>\n    </ScrollbarWrapper>\n  );\n};\n\nconst PaginationStyled = styled.div`\n  .pagination {\n    height: 30px;\n    display: flex;\n    flex-direction: row;\n    justify-content: space-between;\n    align-items: center;\n\n    li {\n      list-style: none;\n    }\n\n    .disabled {\n      opacity: 0.2;\n      pointer-events: none;\n    }\n\n    .active {\n      color: deepskyblue;\n    }\n  }\n\n  width: 200px;\n\n  margin: auto;\n`;\n\nconst AnimatedSortIcon = ({\n  icon,\n  isVisible,\n}: {\n  icon: React.ReactNode;\n  isVisible: boolean;\n}) => {\n  return (\n    <AnimatePresence>\n      {isVisible && (\n        <motion.div\n          initial={{ opacity: 0, maxHeight: 0, maxWidth: 0 }}\n          animate={{ opacity: 1, maxHeight: 5, maxWidth: 20 }}\n          exit={{ opacity: 0, maxHeight: 0, maxWidth: 0 }}\n        >\n          {icon}\n        </motion.div>\n      )}\n    </AnimatePresence>\n  );\n};\n\nexport default TableComponent;\n","import { gql, useQuery } from \"@apollo/client\";\nimport { Box } from \"@chakra-ui/react\";\nimport { useKeycloak } from \"@react-keycloak/web\";\nimport React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { getGroupRankingsQuery } from \"../generated/getGroupRankingsQuery\";\nimport { getLeaderboardsQuery } from \"../generated/getLeaderboardsQuery\";\nimport Error from \"./Error\";\nimport ColumnFilter from \"./TableComponent/ColumnFilter\";\nimport TableComponent from \"./TableComponent/TableNoSorting\";\n\nconst GET_LEADERBOARDS = gql`\n  query getLeaderboardsQuery($gameId: String!) {\n    leaderboards(gameId: $gameId) {\n      id\n      game {\n        id\n        name\n      }\n      parentChallenge {\n        id\n      }\n      name\n    }\n  }\n`;\n\nconst GET_GROUP_RANKINGS = gql`\n  query getGroupRankingsQuery($gameId: String!, $leaderboardId: String!) {\n    groupRankings(gameId: $gameId, leaderboardId: $leaderboardId) {\n      player {\n        id\n        group {\n          id\n          name\n        }\n        user {\n          id\n          username\n        }\n      }\n      score\n    }\n  }\n`;\n\nconst RankingTable = ({ gameId }: { gameId: string }) => {\n  const { t } = useTranslation();\n\n  const {\n    loading: loadingLeaderboards,\n    error: errorLeaderboards,\n    data: dataLeaderboards,\n  } = useQuery<getLeaderboardsQuery>(GET_LEADERBOARDS, {\n    fetchPolicy: \"network-only\",\n    variables: { gameId },\n  });\n\n  if (loadingLeaderboards) {\n    return <div>{t(\"Loading\")}</div>;\n  }\n\n  if (errorLeaderboards) {\n    return <Error errorContent={errorLeaderboards} />;\n  }\n\n  if (!dataLeaderboards && !loadingLeaderboards) {\n    return <Error />;\n  }\n\n  return (\n    <>\n      {dataLeaderboards?.leaderboards.map((leaderboard, i) => {\n        if (leaderboard.id) {\n          return (\n            <Ranking key={i} leaderboardId={leaderboard.id} gameId={gameId} />\n          );\n        }\n      })}\n    </>\n  );\n};\n\nconst getMetrics = (\n  groupRankings: any,\n  tFunction: (value: string) => string\n) => {\n  let metricsArray: any = [];\n  if (groupRankings.length < 1) {\n    return metricsArray;\n  }\n\n  const score = groupRankings[0].score;\n  const keys = Object.keys(score);\n\n  for (let i = 0; i < keys.length; i++) {\n    metricsArray.push({\n      Header: `${tFunction(\"table.metric\")} [${tFunction(keys[i])}]`,\n      accessor: `score.${keys[i]}`,\n      Cell: ({ value }: { value: any }) => {\n        if (typeof value != \"undefined\") {\n          if (typeof value == \"object\") {\n            let sum = 0;\n            Object.keys(value).map((key) => {\n              sum += value[key];\n            });\n\n            return <span key={i}>{sum}</span>;\n          }\n          return <span key={i}>{JSON.stringify(value)}</span>;\n        } else {\n          return <span key={i}>{tFunction(\"NA\")}</span>;\n        }\n      },\n    });\n  }\n\n  return metricsArray;\n};\n\nconst Ranking = ({\n  gameId,\n  leaderboardId,\n}: {\n  gameId: string;\n  leaderboardId: string;\n}) => {\n  const { t } = useTranslation();\n  const { keycloak } = useKeycloak();\n\n  const {\n    loading: loadingGroupRankings,\n    error: errorGroupRankings,\n    data: dataGroupRankings,\n  } = useQuery<getGroupRankingsQuery>(GET_GROUP_RANKINGS, {\n    fetchPolicy: \"network-only\",\n    variables: { gameId, leaderboardId },\n  });\n\n  if (loadingGroupRankings) {\n    return <div>{t(\"Loading\")}</div>;\n  }\n\n  if (errorGroupRankings) {\n    console.log(\"ERROR\", errorGroupRankings);\n    return <Error errorContent={errorGroupRankings} />;\n  }\n\n  if (!dataGroupRankings && !loadingGroupRankings) {\n    return <Error />;\n  }\n\n  if (!dataGroupRankings) {\n    return <Error />;\n  }\n\n  const metrics = getMetrics(dataGroupRankings.groupRankings, t);\n\n  return (\n    <Box>\n      <TableComponent\n        dontRecomputeChange\n        columns={[\n          {\n            Header: t(\"Rank\"),\n            accessor: \"\",\n            Cell: (row: { row: { id: string } }) => {\n              return <div>{Number(row.row.id) + 1}</div>;\n            },\n            disableSortBy: true,\n            disableFilters: true,\n          },\n          {\n            Header: t(\"table.username\"),\n            accessor: \"player.user.username\",\n            Cell: ({ value }: { value: any }) =>\n              keycloak.profile?.username == value ? (\n                <Box color=\"deepskyblue\">{value}</Box>\n              ) : (\n                <Box>{value}</Box>\n              ),\n            Filter: ({ column }: { column: any }) => (\n              <ColumnFilter\n                column={column}\n                placeholder={t(\"placeholders.username\")}\n              />\n            ),\n          },\n\n          ...metrics,\n        ]}\n        data={dataGroupRankings.groupRankings}\n      />\n    </Box>\n  );\n};\n\nexport default RankingTable;\n","import { gql, useQuery } from \"@apollo/client\";\nimport {\n  Box,\n  Heading,\n  Icon,\n  Progress,\n  Text,\n  useColorModeValue,\n} from \"@chakra-ui/react\";\nimport styled from \"@emotion/styled\";\nimport React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { BiCheck, BiCircle, BiXCircle } from \"react-icons/bi\";\nimport { HiLockClosed, HiLockOpen } from \"react-icons/hi\";\nimport { Link, Redirect, useParams } from \"react-router-dom\";\nimport { State } from \"../generated/globalTypes\";\nimport {\n  ProfileInGameQuery,\n  ProfileInGameQuery_profileInGame_learningPath,\n  ProfileInGameQuery_profileInGame_learningPath_challenge_parentChallenge,\n} from \"../generated/ProfileInGameQuery\";\nimport { checkIfConnectionAborted } from \"../utilities/ErrorMessages\";\nimport withChangeAnimation from \"../utilities/withChangeAnimation\";\nimport Error from \"./Error\";\nimport { isGameAvailable } from \"./GamesList\";\nimport RankingTable from \"./RankingTable\";\n\ninterface ParamTypes {\n  gameId: string;\n}\n\nconst PROFILE_IN_GAME = gql`\n  query ProfileInGameQuery($gameId: String!) {\n    profileInGame(gameId: $gameId) {\n      id\n      game {\n        id\n        name\n        startDate\n        endDate\n        state\n      }\n\n      learningPath {\n        id\n        challenge {\n          id\n          name\n          description\n          parentChallenge {\n            id\n            name\n            description\n          }\n        }\n        state\n        progress\n        startedAt\n        openedAt\n        endedAt\n      }\n    }\n  }\n`;\n\nconst getChallengeChildren = (\n  parentChallenge: ProfileInGameQuery_profileInGame_learningPath_challenge_parentChallenge | null,\n  learningPath: ProfileInGameQuery_profileInGame_learningPath[]\n) => {\n  if (!parentChallenge) {\n    return null;\n  }\n\n  // return learningPath.map(({ challenge }, i) => {\n  //   return challenge;\n  // });\n\n  return learningPath.map(({ challenge }, i) => {\n    if (challenge.parentChallenge?.id === parentChallenge.id) {\n      return challenge;\n    }\n  });\n};\n\nconst isChallengeWithoutChildren = (children: any) => {\n  if (!children) {\n    return false;\n  } else {\n    return true;\n  }\n};\n\nconst getIconForLearningPathState = (state: State) => {\n  switch (state) {\n    case State.AVAILABLE:\n      return BiCircle;\n\n    case State.COMPLETED:\n      return BiCheck;\n\n    case State.FAILED:\n      return BiXCircle;\n\n    case State.HIDDEN:\n      return HiLockClosed;\n\n    case State.LOCKED:\n      return HiLockClosed;\n\n    case State.OPENED:\n      return HiLockOpen;\n\n    case State.REJECTED:\n      return HiLockClosed;\n\n    default:\n      return BiCircle;\n  }\n};\n\nconst ProfileInGame = () => {\n  // const { setActiveChallenge } = useContext(NavContext);\n  const { gameId } = useParams<ParamTypes>();\n  const { t } = useTranslation();\n\n  const {\n    loading: loadingProfile,\n    error: errorProfile,\n    data: dataProfile,\n  } = useQuery<ProfileInGameQuery>(PROFILE_IN_GAME, {\n    fetchPolicy: \"no-cache\",\n    variables: { gameId },\n  });\n\n  if (!gameId) {\n    return <Text>Game ID not provided</Text>;\n  }\n\n  if (loadingProfile) return <div>{t(\"Loading\")}</div>;\n\n  if (!loadingProfile && errorProfile) {\n    const isServerConnectionError = checkIfConnectionAborted(errorProfile);\n\n    if (isServerConnectionError) {\n      return <Error serverConnectionError />;\n    } else {\n      return <Error errorContent={errorProfile} />;\n    }\n  }\n\n  if (!dataProfile) return <Text>{t(\"error.noData.title\")}</Text>;\n\n  if (!isGameAvailable(dataProfile.profileInGame.game)) {\n    return <Redirect to=\"/profile\" />;\n  }\n\n  return (\n    <Box>\n      {/* Breadcrumb has been removed, because there's a game name in the header */}\n      {/* <BreadcrumbComponent\n        gameName={dataProfile.profileInGame.game.name}\n        gameId={gameId}\n      /> */}\n\n      <Heading as=\"h3\" size=\"lg\">\n        {t(\"Game\")}: {dataProfile.profileInGame.game.name}\n      </Heading>\n      <Box>\n        <RankingTable gameId={gameId} />\n      </Box>\n\n      <Heading as=\"h3\" size=\"md\">\n        {t(\"Challenges\")}\n      </Heading>\n      <Box>\n        {dataProfile.profileInGame.learningPath.map((learningPath, i) => {\n          if (\n            learningPath.state === State.HIDDEN ||\n            learningPath.state === State.REJECTED\n          ) {\n            return;\n          }\n\n          return (\n            !learningPath.challenge.parentChallenge && (\n              <ParentChallenge\n                key={i}\n                available={learningPath.state !== State.LOCKED}\n                withoutChildren={isChallengeWithoutChildren(\n                  getChallengeChildren(\n                    learningPath.challenge,\n                    dataProfile.profileInGame.learningPath\n                  )\n                )}\n              >\n                {\n                  <Icon\n                    w={6}\n                    h={6}\n                    m={4}\n                    float=\"right\"\n                    as={getIconForLearningPathState(learningPath.state)}\n                  />\n                }\n\n                {!isChallengeWithoutChildren(\n                  getChallengeChildren(\n                    learningPath.challenge,\n                    dataProfile.profileInGame.learningPath\n                  )\n                ) && (\n                  <div className=\"challenge-info\">\n                    <h3>{learningPath.challenge.name}</h3>\n                    <p>{learningPath.challenge.description}</p>\n                  </div>\n                )}\n\n                {getChallengeChildren(\n                  learningPath.challenge,\n                  dataProfile.profileInGame.learningPath\n                )?.map((childChallenge, i) => {\n                  return (\n                    childChallenge && (\n                      <ChildrenChallenge>\n                        <Link\n                          key={i}\n                          to={{\n                            pathname: \"/profile/game/challenge\",\n                            state: {\n                              gameId: dataProfile.profileInGame.game.id,\n                              challengeId: childChallenge.id,\n                            },\n                          }}\n                          // onClick={() =>\n                          //   setActiveChallenge({\n                          //     id: childChallenge.id,\n                          //     name: childChallenge.name,\n                          //   })\n                          // }\n                        >\n                          <h4>{childChallenge.name}</h4>\n                          <Text>{childChallenge.description}</Text>\n                        </Link>\n                      </ChildrenChallenge>\n                    )\n                  );\n                })}\n\n                {isChallengeWithoutChildren(\n                  getChallengeChildren(\n                    learningPath.challenge,\n                    dataProfile.profileInGame.learningPath\n                  )\n                ) && (\n                  <Link\n                    to={{\n                      pathname: `/game/${dataProfile.profileInGame.game.id}/challenge/${learningPath.challenge.id}`,\n                    }}\n                    // onClick={() =>\n                    //   setActiveChallenge({\n                    //     id: learningPath.challenge.id,\n                    //     name: learningPath.challenge.name,\n                    //   })\n                    // }\n                  >\n                    <ChallengeBox\n                      progress={learningPath.progress}\n                      name={learningPath.challenge.name}\n                      description={\n                        learningPath.challenge.description\n                          ? learningPath.challenge.description\n                          : t(\"No description\")\n                      }\n                    />\n                  </Link>\n                )}\n              </ParentChallenge>\n            )\n          );\n        })}\n      </Box>\n    </Box>\n  );\n};\n\nconst ChallengeBox = ({\n  progress,\n  name,\n  description,\n}: {\n  progress: number;\n  name: string;\n  description: string;\n}) => {\n  const color = useColorModeValue(\"gray.100\", \"gray.700\");\n  const progressBarBg = useColorModeValue(\"gray.200\", \"gray.800\");\n\n  const textColor = useColorModeValue(\"black\", \"white\");\n\n  return (\n    <Box bg={color} p={3} borderRadius={5}>\n      <Heading size=\"md\" color={textColor}>\n        {name}\n      </Heading>\n      <Text color={textColor}>{description}</Text>\n      <Progress\n        colorScheme=\"blue\"\n        size=\"lg\"\n        value={progress * 100}\n        marginTop={2}\n        borderRadius={5}\n        bg={progressBarBg}\n      />\n    </Box>\n  );\n};\n\n// const ParentChallenge = styled.div``;\n\nconst ChildrenChallenge = styled.div`\n  margin-bottom: 12px;\n  padding: 10px;\n  p {\n    font-size: 13px;\n  }\n  transition: transform 0.5s;\n\n  &:hover {\n    transform: scale(0.97);\n  }\n`;\n\nconst ParentChallenge = styled.div<{\n  available: boolean;\n  withoutChildren: boolean;\n}>`\n  .challenge-info {\n    margin-bottom: 12px;\n  }\n\n  border-radius: 5px;\n  padding: 15px;\n  transition: transform 0.5s;\n  cursor: ${({ available }) => (available ? \"pointer\" : \"initial\")};\n  h3 {\n    margin-bottom: 15px;\n  }\n\n  a {\n    color: black;\n  }\n\n  &:hover {\n    transform: scale(0.97);\n  }\n\n  opacity: ${({ available }) => (available ? \"1\" : 0.5)};\n  pointer-events: ${({ available }) => (available ? \"all\" : \"none\")};\n`;\n\nexport default withChangeAnimation(ProfileInGame);\n","import React, { useEffect, useState } from \"react\";\nimport withChangeAnimation from \"../utilities/withChangeAnimation\";\n\nconst ToS = () => {\n  //   const { t, i18n } = useTranslation();\n  const [tosHtml, setTosHtml] = useState(\"\");\n\n  useEffect(() => {\n    getDataForActiveLanguage();\n  }, []);\n\n  const getDataForActiveLanguage = () => {\n    fetch(`${process.env.PUBLIC_URL}/tos.html`, {\n      headers: {\n        \"Content-Type\": \"text/html\",\n        Accept: \"text/html\",\n      },\n    })\n      .then(function (response) {\n        return response.text();\n      })\n      .then(function (response) {\n        if (response) {\n          setTosHtml(response);\n        }\n      })\n      .catch((err) => {\n        setTosHtml(\"\");\n      });\n  };\n\n  return <div dangerouslySetInnerHTML={{ __html: tosHtml }}></div>;\n};\n\nexport default withChangeAnimation(ToS);\n","import { gql } from \"@apollo/client\";\n\nexport const GET_ALL_GAME_PROFILES = gql`\n  query allGameProfilesQuery($userId: String!) {\n    allGameProfiles(userId: $userId) {\n      id\n\n      game {\n        id\n        name\n      }\n\n      group {\n        id\n        name\n      }\n\n      points\n      rewards {\n        id\n        reward {\n          name\n        }\n      }\n\n      stats {\n        nrOfSubmissions\n        nrOfValidations\n      }\n\n      learningPath {\n        progress\n      }\n    }\n  }\n`;\n","import { gql } from \"@apollo/client\";\n\nexport const GET_USER_DETAILS = gql`\n  query getUserDetails($userId: String!) {\n    user(id: $userId) {\n      id\n      emailVerified\n      username\n      firstName\n      lastName\n      username\n      email\n    }\n  }\n`;\n","import { useQuery } from \"@apollo/client\";\nimport { Box, Flex, Heading } from \"@chakra-ui/react\";\nimport React, { useMemo } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { useHistory, useParams } from \"react-router-dom\";\nimport {\n  allGameProfilesQuery,\n  allGameProfilesQuery_allGameProfiles,\n} from \"../generated/allGameProfilesQuery\";\nimport { getUserDetails } from \"../generated/getUserDetails\";\nimport { GET_ALL_GAME_PROFILES } from \"../graphql/getAllGameProfiles\";\nimport { GET_USER_DETAILS } from \"../graphql/getUserDetails\";\nimport { checkIfConnectionAborted } from \"../utilities/ErrorMessages\";\nimport withChangeAnimation from \"../utilities/withChangeAnimation\";\nimport DetailsCard from \"./DetailsCard\";\nimport Error from \"./Error\";\nimport RefreshCacheMenu from \"./RefreshCacheMenu\";\nimport TableComponent from \"./TableComponent\";\nimport ColumnFilter from \"./TableComponent/ColumnFilter\";\n\nconst UserDetails = () => {\n  const { userId } = useParams<{ userId: string }>();\n  const history = useHistory();\n  const memoizedSorting = useMemo(\n    () => (rowA: any, rowB: any) => {\n      const a =\n        rowA.original.learningPath\n          .flatMap((learningPath: any) => learningPath.progress)\n          .reduce((a: any, b: any) => a + b, 0) /\n        rowA.original.learningPath.length;\n\n      const b =\n        rowB.original.learningPath\n          .flatMap((learningPath: any) => learningPath.progress)\n          .reduce((a: any, b: any) => a + b, 0) /\n        rowB.original.learningPath.length;\n\n      if (a > b) return 1;\n\n      if (b > a) return -1;\n\n      return 0;\n    },\n    []\n  );\n\n  const {\n    data: userData,\n    error: userError,\n    loading: userLoading,\n  } = useQuery<getUserDetails>(GET_USER_DETAILS, {\n    variables: {\n      userId: userId,\n    },\n    fetchPolicy: \"no-cache\",\n    skip: !userId,\n  });\n\n  const {\n    data: gameProfilesData,\n    error: gameProfilesError,\n    loading: gameProfilesLoading,\n    refetch: refetchGameProfiles,\n  } = useQuery<allGameProfilesQuery>(GET_ALL_GAME_PROFILES, {\n    variables: {\n      userId: userId,\n    },\n    fetchPolicy: \"cache-first\",\n    skip: !userId,\n  });\n\n  const { t } = useTranslation();\n\n  if (!userId) {\n    return <Error />;\n  }\n\n  if (!userLoading && userError) {\n    const isServerConnectionError = checkIfConnectionAborted(userError);\n\n    if (isServerConnectionError) {\n      return <Error serverConnectionError />;\n    } else {\n      return <Error errorContent={userError} />;\n    }\n  }\n\n  if (!gameProfilesLoading && gameProfilesError) {\n    const isServerConnectionError = checkIfConnectionAborted(gameProfilesError);\n\n    if (isServerConnectionError) {\n      return <Error serverConnectionError />;\n    } else {\n      return <Error errorContent={gameProfilesError} />;\n    }\n  }\n\n  if (userLoading || gameProfilesLoading) {\n    return <div>{t(\"Loading\")}</div>;\n  }\n\n  console.log(\"data\", gameProfilesData?.allGameProfiles);\n\n  return (\n    <div>\n      <Flex justifyContent=\"space-between\" alignItems=\"center\">\n        <Heading as=\"h3\" size=\"md\" marginTop={5} marginBottom={5}>\n          User: {userData?.user.firstName} {userData?.user.lastName}\n        </Heading>\n      </Flex>\n\n      <Flex\n        margin=\"auto\"\n        width=\"100%\"\n        justifyContent=\"space-between\"\n        flexDirection={{ base: \"column\", md: \"row\" }}\n      >\n        <DetailsCard\n          title={t(\"Full name\")}\n          content={`${userData?.user.firstName} ${userData?.user.lastName}`}\n        />\n\n        <DetailsCard title={\"E-Mail\"} content={userData?.user.email || \"N/A\"} />\n\n        <DetailsCard\n          title={t(\"E-Mail verified\")}\n          content={userData?.user.emailVerified ? t(\"Yes\") : t(\"No\")}\n        />\n\n        <DetailsCard\n          title={t(\"Username\")}\n          content={userData?.user.username || \"N/A\"}\n        />\n      </Flex>\n\n      <Flex justifyContent=\"space-between\" alignItems=\"center\"></Flex>\n      <Box>\n        <TableComponent\n          tableHeader={\n            <Heading as=\"h3\" size=\"md\" marginTop={5} marginBottom={5}>\n              {t(\"All game profiles\")}\n            </Heading>\n          }\n          refreshData={refetchGameProfiles}\n          contextMenu={\n            <RefreshCacheMenu\n              loading={gameProfilesLoading}\n              refetch={refetchGameProfiles}\n            />\n          }\n          onRowClick={(row: allGameProfilesQuery_allGameProfiles) => {\n            history.push({\n              pathname: `/teacher/player-details/${userData?.user.id}/${row.game.id}`,\n            });\n          }}\n          columns={[\n            {\n              Header: t(\"Game\"),\n              accessor: \"game.name\",\n              Filter: ({ column }: { column: any }) => (\n                <ColumnFilter column={column} placeholder={\"abc\"} />\n              ),\n            },\n            {\n              Header: t(\"table.group\"),\n              accessor: \"group.name\",\n              Filter: ({ column }: { column: any }) => (\n                <ColumnFilter column={column} placeholder={\"abc\"} />\n              ),\n            },\n            {\n              Header: t(\"points\"),\n              accessor: \"points\",\n              Filter: ({ column }: { column: any }) => (\n                <ColumnFilter column={column} placeholder={\"abc\"} />\n              ),\n            },\n            {\n              Header: t(\"table.submissions\"),\n              accessor: (\n                row: allGameProfilesQuery_allGameProfiles | undefined\n              ) => {\n                if (row) {\n                  return row.stats.nrOfSubmissions;\n                }\n              },\n              Filter: ({ column }: { column: any }) => (\n                <ColumnFilter column={column} placeholder={\"abc\"} />\n              ),\n            },\n            {\n              Header: t(\"table.validations\"),\n              accessor: (\n                row: allGameProfilesQuery_allGameProfiles | undefined\n              ) => {\n                if (row) {\n                  return row.stats.nrOfValidations;\n                }\n              },\n              Filter: ({ column }: { column: any }) => (\n                <ColumnFilter column={column} placeholder={\"abc\"} />\n              ),\n            },\n            {\n              Header: t(\"Rewards\"),\n              accessor: (\n                row: allGameProfilesQuery_allGameProfiles | undefined\n              ) => {\n                if (row) {\n                  return row.rewards.length;\n                }\n              },\n              Filter: ({ column }: { column: any }) => (\n                <ColumnFilter column={column} placeholder={\"abc\"} />\n              ),\n            },\n            {\n              Header: t(\"table.progress\"),\n              accessor: \"learningPath\",\n              Cell: ({ value }: { value: any }) => {\n                const totalChallengesCount = value.length || 1;\n\n                const progressCombined =\n                  value\n                    .flatMap((learningPath: any) => learningPath.progress)\n                    .reduce((a: any, b: any) => a + b, 0) /\n                  totalChallengesCount;\n\n                return (progressCombined * 100).toFixed(1) + \"%\";\n              },\n              disableFilters: true,\n              sortType: memoizedSorting,\n            },\n          ]}\n          data={gameProfilesData?.allGameProfiles}\n        />\n      </Box>\n    </div>\n  );\n};\n\nexport default withChangeAnimation(UserDetails);\n","import { useKeycloak } from \"@react-keycloak/web\";\nimport React from \"react\";\nimport { Redirect, Route, RouteProps } from \"react-router-dom\";\nimport { motion } from \"framer-motion\";\nimport { rolesTypes } from \"./types\";\n\ninterface PrivateRouteI extends RouteProps {\n  component: React.ComponentType<any>;\n  roles: rolesTypes;\n  redirectTo?: string;\n}\n\nexport default function PrivateRoute({\n  component: Component,\n  roles,\n  redirectTo,\n  ...rest\n}: PrivateRouteI) {\n  const { keycloak } = useKeycloak();\n\n  const isAuthorized = (roles: rolesTypes) => {\n    if (keycloak && roles) {\n      return roles.some((r) => {\n        const realm = keycloak.hasRealmRole(r);\n        const resource = keycloak.hasResourceRole(r);\n        return realm || resource;\n      });\n    }\n    return false;\n  };\n\n  return (\n    <Route\n      {...rest}\n      render={(props) => {\n        return isAuthorized(roles) ? (\n          <Component {...props} />\n        ) : (\n          <motion.div exit=\"undefined\">\n            <Redirect to={{ pathname: redirectTo ? redirectTo : \"/\" }} />\n          </motion.div>\n        );\n      }}\n    />\n  );\n}\n","import styled from \"@emotion/styled\";\nimport { useKeycloak } from \"@react-keycloak/web\";\nimport { AnimatePresence } from \"framer-motion\";\nimport React, { useContext, useState } from \"react\";\n// import \"./i18n/config\";\nimport { useTranslation } from \"react-i18next\";\nimport { BrowserRouter, Route, Switch } from \"react-router-dom\";\nimport { FocusActivityContextType } from \"./@types/focus-activity\";\nimport AccountSettings from \"./components/AccountSettings\";\nimport AddPlayersToGame from \"./components/AddPlayersToGame\";\nimport Challenge from \"./components/Challenge\";\nimport Homepage from \"./components/HomePage\";\nimport InstructorGame from \"./components/InstructorGame\";\nimport JoinGameByToken from \"./components/JoinGameByToken\";\nimport LtiCallback from \"./components/LtiCallback\";\nimport MainLoading from \"./components/MainLoading\";\nimport ManageGames from \"./components/ManageGames\";\nimport Navbar from \"./components/Navbar\";\nimport NotFound from \"./components/NotFound\";\nimport { NotificationsProvider } from \"./components/Notifications\";\nimport PlayerDetails from \"./components/PlayerDetails\";\nimport Profile from \"./components/Profile\";\n// import MainLoading from \"./components/MainLoading\";\nimport ProfileInGame from \"./components/ProfileInGame\";\nimport ToS from \"./components/ToS\";\nimport UserDetails from \"./components/UserDetails\";\nimport { FocusActivityContextProvider } from \"./context/FocusActivityContext\";\nimport NavContext from \"./context/NavContext\";\nimport ZoomContext from \"./context/ZoomContext\";\nimport PrivateRoute from \"./utilities/PrivateRoute\";\n\nconst getZoomFactorFromLocalStorage = () => {\n  const zoomFactor = localStorage.getItem(\"zoom\");\n  return zoomFactor ? Number(zoomFactor) : null;\n};\n\nconst MainWrapper = styled.div`\n  max-width: 1140px;\n  padding: 15px;\n  margin: auto;\n`;\n\nfunction App() {\n  const { ready } = useTranslation();\n  const [zoomFactor, setZoomFactor] = useState(\n    getZoomFactorFromLocalStorage() || 1\n  );\n  const [activeGame, setActiveGame] = useState<{\n    id: string;\n    name: string;\n  } | null>(null);\n\n  const { initialized: keycloakInitialized } = useKeycloak();\n\n  if (!ready || !keycloakInitialized) {\n    return <MainLoading />;\n  }\n\n  return (\n    <BrowserRouter basename={process.env.PUBLIC_URL}>\n      <Route\n        render={({ location }) => (\n          <>\n            <FocusActivityContextProvider>\n              <ZoomContext.Provider\n                value={{\n                  zoomFactor,\n                  setZoomFactor: (value: number) => {\n                    setZoomFactor(value);\n                  },\n                }}\n              >\n                <NavContext.Provider value={{ setActiveGame, activeGame }}>\n                  <ZoomWrapper zoomFactor={zoomFactor}>\n                    <NotificationsProvider>\n                      <Navbar />\n                      <MainWrapper>\n                        <AnimatePresence exitBeforeEnter initial={false}>\n                          <Switch location={location} key={location.pathname}>\n                            <Route\n                              exact\n                              path=\"/(|learning-platform)/\"\n                              component={Homepage}\n                            />\n                            <Route exact path=\"/tos\" component={ToS} />\n                            <Route exact path=\"/lti-callback\" component={LtiCallback} />\n                            <PrivateRoute\n                              exact\n                              path=\"/profile\"\n                              roles={[\"student\", \"teacher\"]}\n                              component={Profile}\n                            />\n\n                            <PrivateRoute\n                              exact\n                              path=\"/game/:gameId\"\n                              roles={[\"student\"]}\n                              component={ProfileInGame}\n                            />\n\n                            <PrivateRoute\n                              exact\n                              path=\"/teacher/game/:gameId\"\n                              roles={[\"teacher\"]}\n                              component={InstructorGame}\n                            />\n\n                            <PrivateRoute\n                              exact\n                              path=\"/game/:gameId/challenge/:challengeId/:exerciseId?\"\n                              roles={[\"student\"]}\n                              component={Challenge}\n                            />\n\n                            <PrivateRoute\n                              exact\n                              path=\"/teacher/game/:gameId/add-players\"\n                              roles={[\"teacher\"]}\n                              component={AddPlayersToGame}\n                            />\n\n                            <PrivateRoute\n                              exact\n                              path=\"/teacher/manage-games\"\n                              roles={[\"teacher\"]}\n                              component={ManageGames}\n                            />\n\n                            <PrivateRoute\n                              exact\n                              path=\"/teacher/student-details/:userId\"\n                              roles={[\"teacher\"]}\n                              component={UserDetails}\n                            />\n\n                            <PrivateRoute\n                              exact\n                              path=\"/teacher/player-details/:userId/:gameId\"\n                              roles={[\"teacher\"]}\n                              component={PlayerDetails}\n                            />\n\n                            <PrivateRoute\n                              exact\n                              path=\"/profile/settings\"\n                              roles={[\"teacher\", \"student\"]}\n                              component={AccountSettings}\n                            />\n\n                            <PrivateRoute\n                              exact\n                              path=\"/game/enroll/:gameToken/:groupToken?\"\n                              roles={[\"student\"]}\n                              component={JoinGameByToken}\n                            />\n\n                            <Route component={NotFound} />\n                          </Switch>\n                        </AnimatePresence>\n                      </MainWrapper>\n                    </NotificationsProvider>\n                  </ZoomWrapper>\n                </NavContext.Provider>\n              </ZoomContext.Provider>\n            </FocusActivityContextProvider>\n            {/* </MainContext.Provider> */}\n            {/* </NavContext.Provider> */}\n          </>\n        )}\n      />\n    </BrowserRouter>\n  );\n}\n\nconst ZoomWrapper = styled.div<{ zoomFactor: number }>`\n  zoom: ${({ zoomFactor }) => zoomFactor};\n`;\n\nexport default App;\n","import i18n from \"i18next\";\nimport Backend from \"i18next-http-backend\";\nimport LanguageDetector from \"i18next-browser-languagedetector\";\nimport { initReactI18next } from \"react-i18next\";\n\ni18n\n  // load translation using http -> see /public/locales\n  // learn more: https://github.com/i18next/i18next-http-backend\n  .use(Backend)\n  // detect user language\n  // learn more: https://github.com/i18next/i18next-browser-languageDetector\n  .use(LanguageDetector)\n  // pass the i18n instance to react-i18next.\n  .use(initReactI18next)\n  // init i18next\n  // for all options read: https://www.i18next.com/overview/configuration-options\n  .init({\n    fallbackLng: \"en\",\n    debug: true,\n    backend: {\n      loadPath: `${process.env.PUBLIC_URL}/locales/{{lng}}/{{ns}}.json`,\n    },\n    interpolation: {\n      escapeValue: false, // not needed for react as it escapes by default\n    },\n  });\n\nexport default i18n;\n","import Keycloak from '@fgpe/keycloak-js';\n\nconst keycloakConfig: Keycloak.KeycloakConfig = {\n  url: process.env.REACT_APP_KEYCLOAK_URL,\n  realm: process.env.REACT_APP_KEYCLOAK_REALM,\n  clientId: process.env.REACT_APP_KEYCLOAK_CLIENT_ID,\n};\n\nconst keycloak = new Keycloak(keycloakConfig);\n\nexport default keycloak;\n","// 1. import `extendTheme` function\nimport { extendTheme } from \"@chakra-ui/react\";\nimport { mode } from \"@chakra-ui/theme-tools\";\n\n// 2. Add your color mode config\n\nexport const breakpoints: string[] & {\n  sm?: string;\n  md?: string;\n  lg?: string;\n  xl?: string;\n  xxl?: string;\n} = [\"360px\", \"768px\", \"1024px\", \"1280px\", \"1600px\"];\n\nbreakpoints.sm = breakpoints[0];\nbreakpoints.md = breakpoints[1];\nbreakpoints.lg = breakpoints[2];\nbreakpoints.xl = breakpoints[3];\nbreakpoints.xxl = breakpoints[4];\n\nconst Container = {\n  baseStyle: {\n    border: \"1px solid rgba(0,0,0,0.2)\",\n    borderRadius: 10,\n  },\n};\n\nconst theme = extendTheme({\n  components: {\n    Container,\n    Text: {\n      baseStyle: {\n        color: (props: any) => mode(\"red\", \"green\")(props),\n      },\n    },\n  },\n  breakpoints,\n  colors: {\n    borderLight: \"red\",\n    borderDark: \"white\",\n  },\n  config: {\n    lightTheme: \"light\",\n    darkTheme: \"dark\",\n    useSystemColorMode: false,\n  },\n  styles: {\n    global: () => ({\n      html: {\n        height: \"100%\",\n      },\n    }),\n    // global: (props) => ({\n    //   body: {\n    //     // fontFamily: `\"Open sans\", sans-serif`,\n    //     color: mode(\"black\", \"whiteAlpha.900\")(props),\n    //     bg: mode(\"#f5f7fa\", \"#141214\")(props),\n    //   },\n    // }),\n  },\n});\n\n// export type ThemeType = typeof theme;\n\n// const darkTheme: ThemeType = {\n//   primary: \"rgba(220,120,95,1)\",\n//   text: \"rgba(241,233,231,1)\",\n//   textSecondary: \"rgba(241,233,231,0.6)\",\n//   background: \"rgba(0,0,0,1)\",\n//   backgroundVariant: \"rgba(28,26,26,1)\",\n//   border: \"rgba(241,233,231,0.15)\",\n//   borderLight: \"rgba(241,233,231,0.05)\",\n//   breakpoints,\n// };\n\n// export type ThemeType = typeof lightTheme;\n\n// export const themes = {\n//   light: lightTheme,\n//   dark: darkTheme,\n// };\n\nexport default theme;\n","const ClearLocalStorage = () => {\n  // Notice change here\n  let keys = Object.keys(localStorage);\n  let i = keys.length;\n\n  while (i--) {\n    if (keys[i].substring(0, 4) === \"FGPE\") {\n      const item = localStorage.getItem(keys[i]);\n      if (item) {\n        if (item.startsWith('{') && item.endsWith('}')) {\n          const userData = JSON.parse(item);\n          const date1 = new Date();\n          const date2 = new Date(userData.time);\n          const diff = Math.abs(date1.getTime() - date2.getTime());\n          const diffDays = Math.ceil(diff / (1000 * 3600 * 24));\n\n          if (diffDays > 30) {\n            localStorage.removeItem(keys[i]);\n          }\n        }\n      }\n    }\n  }\n};\n\nexport default ClearLocalStorage;\n","const isLocalhost = Boolean(\n  window.location.hostname === \"localhost\"\n  || window.location.hostname === \"[::1]\"\n  || window.location.hostname.match(/^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/)\n);\n\ntype Config = {\n  onSuccess?: (registration: ServiceWorkerRegistration) => void;\n  onUpdate?: (registration: ServiceWorkerRegistration) => void;\n};\n\nexport function register(config?: Config) {\n  if (process.env.NODE_ENV === \"production\" && \"serviceWorker\" in navigator) {\n    const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n    if (publicUrl.origin !== window.location.origin) {\n      return;\n    }\n\n    window.addEventListener(\"load\", () => {\n      const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n      if (isLocalhost) {\n        checkValidServiceWorker(swUrl, config);\n\n        navigator.serviceWorker.ready.then(() => {\n          console.log(\"This web app is being served cache-first by a service \" + \"worker. To learn more, visit https://cra.link/PWA\");\n        });\n      } else {\n        registerValidSW(swUrl, config);\n      }\n    });\n  }\n}\n\nfunction registerValidSW(swUrl: string, config?: Config) {\n  navigator.serviceWorker\n    .register(swUrl)\n    .then((registration) => {\n      registration.onupdatefound = () => {\n        const installingWorker = registration.installing;\n        if (installingWorker == null) {\n          return;\n        }\n        installingWorker.onstatechange = () => {\n          if (installingWorker.state === \"installed\") {\n            if (navigator.serviceWorker.controller) {\n              console.log(\"New content is available and will be used when all \" + \"tabs for this page are closed. See https://cra.link/PWA.\");\n\n              if (config && config.onUpdate) {\n                config.onUpdate(registration);\n              }\n            } else {\n              console.log(\"Content is cached for offline use.\");\n\n              if (config && config.onSuccess) {\n                config.onSuccess(registration);\n              }\n            }\n          }\n        };\n      };\n    })\n    .catch((error) => {\n      console.error(\"Error during service worker registration:\", error);\n    });\n}\n\nfunction checkValidServiceWorker(swUrl: string, config?: Config) {\n  fetch(swUrl, {\n    headers: { \"Service-Worker\": \"script\" }\n  })\n    .then((response) => {\n      const contentType = response.headers.get(\"content-type\");\n      if (response.status === 404 || (contentType != null && contentType.indexOf(\"javascript\") === -1)) {\n        navigator.serviceWorker.ready.then((registration) => {\n          registration.unregister().then(() => {\n            window.location.reload();\n          });\n        });\n      } else {\n        registerValidSW(swUrl, config);\n      }\n    })\n    .catch(() => {\n      console.log(\"No internet connection found. App is running in offline mode.\");\n    });\n}\n\nexport function unregister() {\n  if (\"serviceWorker\" in navigator) {\n    navigator.serviceWorker.ready\n      .then((registration) => {\n        registration.unregister();\n      })\n      .catch((error) => {\n        console.error(error.message);\n      });\n  }\n}\n","import {\n  ApolloClient,\n  ApolloProvider,\n  InMemoryCache,\n  split,\n} from \"@apollo/client\";\nimport { setContext } from \"@apollo/client/link/context\";\nimport { WebSocketLink } from \"@apollo/client/link/ws\";\nimport { getMainDefinition } from \"@apollo/client/utilities\";\nimport {\n  ChakraProvider,\n  ColorModeScript,\n  localStorageManager,\n} from \"@chakra-ui/react\";\nimport { createUploadLink } from \"apollo-upload-client\";\nimport React, { Suspense } from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { ReactKeycloakProvider } from \"@react-keycloak/web\";\nimport App from \"./App\";\nimport MainLoading from \"./components/MainLoading\";\nimport \"./i18n/config\";\nimport keycloak from \"./keycloak\";\nimport theme from \"./styles/theme/themes\";\nimport ClearLocalStorage from \"./utilities/ClearLocalStorage\";\nimport { persistCache, LocalStorageWrapper } from \"apollo3-cache-persist\";\nimport * as serviceWorkerRegistration from \"./service-worker-registration\";\nimport { restoreTokens, storeTokens } from \"./utilities/Storage\";\n\n\nClearLocalStorage();\n\nconst wsLink = new WebSocketLink({\n  uri: process.env.REACT_APP_GRAPHQL_WS,\n  options: {\n    reconnect: true,\n    lazy: true,\n    connectionParams: () => {\n      const token = keycloak.token;\n      if (keycloak.isTokenExpired()) {\n        keycloak\n          .updateToken(1)\n          .then(function (refreshed: boolean) {\n            if (refreshed) {\n              console.log(\"Token was successfully refreshed\");\n            } else {\n              console.log(\"Token is still valid\");\n            }\n            return {\n              headers: {\n                authorization: token ? `bearer ${token}` : \"\",\n              },\n            };\n          })\n          .catch(function () {\n            console.log(\n              \"Failed to refresh the token, or the session has expired\"\n            );\n          });\n      } else {\n        return {\n          headers: {\n            authorization: token ? `bearer ${token}` : \"\",\n          },\n        };\n      }\n\n      // return {\n      //   headers: {\n      //     authorization: `bearer ${keycloak.token}`,\n      //   },\n      // };\n    },\n  },\n});\n\nconst httpLink = createUploadLink({\n  uri: process.env.REACT_APP_GRAPHQL_URI,\n});\n\nconst authLink = setContext((_, { headers }) => {\n  const token = keycloak.token;\n  if (keycloak.isTokenExpired()) {\n    keycloak\n      .updateToken(1)\n      .then(function (refreshed: boolean) {\n        if (refreshed) {\n          console.log(\"Token was successfully refreshed\");\n        } else {\n          console.log(\"Token is still valid\");\n        }\n        return {\n          headers: {\n            ...headers,\n            Authorization: token ? `bearer ${token}` : \"\",\n          },\n        };\n      })\n      .catch(function () {\n        console.log(\"Failed to refresh the token, or the session has expired\");\n      });\n  } else {\n    return {\n      headers: {\n        ...headers,\n        Authorization: token ? `bearer ${token}` : \"\",\n      },\n    };\n  }\n});\n\nconst splitLink = split(\n  ({ query }) => {\n    const definition = getMainDefinition(query);\n    return (\n      definition.kind === \"OperationDefinition\" &&\n      definition.operation === \"subscription\"\n    );\n  },\n  wsLink,\n  authLink.concat(httpLink)\n);\n\nconst cache = new InMemoryCache();\n\npersistCache({\n  cache,\n  storage: new LocalStorageWrapper(window.localStorage),\n}).then(() => {\n  const client = new ApolloClient({\n    link: splitLink,\n    cache: cache,\n  });\n\n  keycloak.onTokenExpired = () => {\n    console.log(\"expired \" + new Date());\n    keycloak\n      .updateToken(50)\n      .then((refreshed: boolean) => {\n        if (refreshed) {\n          console.log(\"refreshed \" + new Date());\n        } else {\n          console.log(\"not refreshed \" + new Date());\n        }\n      })\n      .catch(() => {\n        console.error(\"Failed to refresh token \" + new Date());\n      });\n  };\n\n  const tokens = restoreTokens();\n\n  ReactDOM.render(\n    <ChakraProvider theme={theme} colorModeManager={localStorageManager}>\n      <ColorModeScript initialColorMode={theme.config.lightTheme} />\n      <ReactKeycloakProvider\n        authClient={keycloak}\n        initOptions={{\n          onLoad: \"check-sso\",\n          checkLoginIframe: false,\n          enableLogging: true,\n          token: tokens.token,\n          idToken: tokens.idToken,\n          refreshToken: tokens.refreshToken,\n        }}\n        LoadingComponent={<MainLoading />}\n        onTokens={(tokens) => storeTokens(tokens.token, tokens.idToken, tokens.refreshToken)}\n      >\n        <ApolloProvider client={client}>\n          <Suspense fallback=\"loading\">\n            <App />\n          </Suspense>\n        </ApolloProvider>\n      </ReactKeycloakProvider>\n    </ChakraProvider>,\n    document.getElementById(\"root\")\n  );\n});\n\nserviceWorkerRegistration.register();\n"],"sourceRoot":""}