{"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":""}