{"version":3,"sources":["images/small.png","images/medium.png","images/large.png","components/SessionContext.jsx","components/auth/Login.jsx","components/auth/Register.jsx","components/Nav.jsx","components/util/ConfirmDelete.jsx","components/ChooseQuiz.jsx","components/ClassroomGrid.jsx","components/util/Label.jsx","components/util/GeneratePronoun.jsx","components/util/FlashcardForms.jsx","components/util/useKeyPress.jsx","components/FlashcardGrid.jsx","components/MiniDeckSelection.jsx","components/DeckSelection.jsx","components/Explore.jsx","components/Home.jsx","components/Results.jsx","components/Classroom.jsx","components/Analyze.jsx","components/Search.jsx","components/util/Explanation.jsx","components/Quiz.jsx","components/Linguistics.jsx","components/Feedback.jsx","components/Account.jsx","components/util/PrivateRoute.jsx","components/App.jsx","serviceWorker.js","index.js"],"names":["module","exports","SessionContext","React","createContext","SessionUpdateContext","useSession","useContext","useSessionUpdate","SessionContextProvider","children","useState","isLoggedIn","setIsLoggedIn","hasLoginCheckRun","setHasLoginCheckRun","username","setUsername","language","setLanguage","accountType","setAccountType","a","fetch","response","ok","Error","json","data","status","account_type","useEffect","checkLoginStatus","catch","error","Provider","value","handleLogout","insertStringInPhrase","phrase","toInsert","amountToInsert","replace","length","finalPhrase","openInsert","indexOf","closeInsert","start","i","nextInsert","slice","Login","props","usernameOrEmail","setUsernameOrEmail","password","setPassword","handleSuccessfulLogin","alert","requestOptions","method","headers","body","JSON","stringify","lang","history","push","window","location","className","type","placeholder","onChange","e","target","required","onKeyPress","event","keyCode","which","Button","onClick","to","Register","email","setEmail","confirmPassword","setConfirmPassword","undefined","autoComplete","name","handleSuccessfulRegister","Nav","style","display","exact","activeClassName","titles","home","verb_analyzer","verb_search","linguistics","id","logout","ConfirmDelete","parent","manipulateClassroom","setShowConfirmDelete","deleteFunc","objectToDelete","chosenDeck","setChosenDeck","setObjectToDelete","getCollections","are_you_sure","deleteType","yes","no","ChooseQuiz","quizAttributes","pathname","chosenClassroom","class_id","flashcards","quizzes","quizType","flashcardsToMix","compatibleFlashcards","remove","tense","splice","filterIncompatibleFlashcards","j","k","Math","floor","random","mixFlashcards","conjugate","disabled","identify_tense","mixture","empty_deck_message","ClassroomGrid","classes","setClasses","chosenClassrooms","setChosenClassrooms","openInput","setOpenInput","classNameInput","setClassNameInput","getClasses","collection","collectionForClass","Array","fill","newClassroom","newClassFunc","class_code","alertMessage","collection_id","class_ids","map","filter","setCollectionForClass","stringOfChosenClassrooms","join","select_instruction","classroom","c","key","alreadyAdded","isChosen","chosen","setChosenClassroom","sessionStorage","setItem","teacher","studentAmount","add_collections_to_class","addCollectionToClasses","icon","faArrowLeft","class_name","create_class","join_class","cancel","Label","verbForm","attribute","linguisticInfo","form","tags","tag_name","GeneratePronoun","possiblePronouns","pronoun","person","number","FlashcardForms","verbInput","setVerbInput","inputMode","setInputMode","isCorrect","flashcardMode","verb","processResult","choice","answered","questionNumber","attributesSide","infinitive","conjugatedSide","mood","correct","attempt","questionAmount","nextQuestion","setAnswered","onPaste","preventDefault","onCopy","faLongArrowAltDown","useKeyPress","keys","callback","node","callbackRef","useRef","useLayoutEffect","current","handleKeyPress","useCallback","some","targetNode","document","addEventListener","removeEventListener","FlashcardGrid","selectStatus","setSelectStatus","tabStatus","setTabStatus","flashcardForm","setFlashcardForm","viewMode","setViewMode","flashcardNumber","setFlashcardNumber","showFormFilters","setShowFormFilters","formFilter","setFormFilter","filteredFlashcards","setFilteredFlashcards","selectDeselectAll","command","chosenCardsClone","selectStatusClone","setChosenCards","navigateFlashcards","movement","setManageFlashcards","decks","filteredFlashcardsClone","flashcard","filtered","forEach","filterFlashcards","study","chosenUserID","edit","copy","justifyContent","title","select_all","deselect_all","add_cards","flip_cards","spell_conjuagation","faChevronUp","faChevronDown","f","card","chosenCards","sort","updateChosenCards","faArrowCircleLeft","faArrowCircleRight","MiniDeckSelection","saveMessage","setSaveMessage","faCaretUp","openCloseArrow","setOpenCloseArrow","chosenCollectionOption","setChosenCollectionOption","copyToDeck","setCopyToDeck","cardOperations","addOrDeleteFunc","deck_id","cards","getFlashcards","setInterval","collections","user","findIndex","decksInCollection","deck","faCaretDown","d","backgroundColor","size","new_deck","deckName","setDeckName","add","faPlusCircle","copy_to","substr","add_to","delete_from","DeckSelection","other","setCollections","setDecks","setFlashcards","nameEdit","pluses","collectionEditMode","setCollectionEditMode","deckEditMode","setDeckEditMode","isPublic","setIsPublic","renamedDeck","setRenamedDeck","collectionName","setCollectionName","renamedCollection","setRenamedCollection","editEnabled","setEditEnabled","manageFlashcards","userID","user_id","chosenClassroomID","recieveCollections","initializeUnclick","enableNameEdit","oldName","editMode","collectionID","addFunc","rename","renamedType","newFlashcards","tense_tag","mood_tag","person_tag","number_tag","root_tag","updateMultiplayerFlashcards","highlightDeck","deckID","highlight","border","chosenDecks","cd","chosenDeckLink","userOrOther","trueStartIndex","DSclassName","setOpenDeckSelection","faPen","public","faEye","faEyeSlash","then","changePublicity","faUserGraduate","faTrashAlt","faCheck","faCopy","trueIndex","boxShadow","background","src","SmallDeck","alt","MediumDeck","LargeDeck","new_collection","faArrowsAltV","classroom_instructions","classroom_instructions_student","Explore","users","setUsers","usersData","setChosenUserID","explore","u","numberOfCollections","numberOfDecks","Home","isExploring","setIsExploring","Results","parentProps","points","previousAttempt","setHistory","deckSize","deck_size","score","time","quiz_type","attempts","class_history_id","addRecord","getRecord","results","attemptNumber","setAttemptToView","Classroom","memberData","setMemberData","tab","setTab","renameClassroom","setRenameClassroom","classCollections","setClassCollections","classDecks","setClassDecks","chosenDeckID","setChosenDeckID","chosenQuizType","setChosenQuizType","showConfirmDelete","maxAttempts","setMaxAttempts","attemptToView","averageScore","lowestScore","highestScore","overallStats","setOverallStats","statFilter","setStatFilter","findFirstDeckID","getClassroomMembers","attemptsLengths","members","m","max","generateOverallStats","initialMemberData","attemptsToFilter","memberDataClone","classAverage","reduce","sum","prev","curr","toFixed","func","chosenClassroomClone","classrooms","faBook","color","faUsers","faCog","parse","member","ma","created","all_attempts","average","lowest","highest","rename_classroom","delete_classroom","unenroll","faSignOutAlt","teacher_id","least_correct","faLongArrowAltRight","most_correct","correct_attempts","find","Analyze","setVerb","analyzeVerb","flashcardsClone","analysis","verb_analyzer_instructions","faSearch","VerbSearch","selectedForms","setSelectedForms","searchVerbWithFilters","attributes","selectedFormsClone","handleCheckChange","Explanation","explanation","setExplanation","explainPage","setExplainPage","navExplainGallery","wrongAnswer","randomType","explanationClone","getExplanation","explanationGallery","Quiz","state","incorrect","showChoices","result","choices","chosenStatus","bind","getFlashcardFromDeck","getRandomFlashcard","mixMultipleChoice","saveChoice","setChoice","getQuestionType","this","setState","tagForm","choicesClone","answer","conjuagtedVerb","randomTenseIndex","Set","Promise","resolve","reject","chosenStatusClone","currentHistory","rewardedPoints","newChoice","isAnswered","resultData","hint","choice_","check","next","finish","Component","Linguistics","href","rel","Feedback","height","width","overflow","pointerEvents","Account","PrivateRoute","render","component","from","App","path","Search","Boolean","hostname","match","ReactDOM","StrictMode","getElementById","navigator","serviceWorker","ready","registration","unregister"],"mappings":"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","file":"static/js/main.0ee64d9f.chunk.js","sourcesContent":["module.exports = __webpack_public_path__ + \"static/media/small.9519a053.png\";","module.exports = __webpack_public_path__ + \"static/media/medium.c89321d4.png\";","module.exports = __webpack_public_path__ + \"static/media/large.b0bdb20f.png\";","import React, { useState, useContext, useEffect } from 'react'\n\nconst SessionContext = React.createContext();\nconst SessionUpdateContext = React.createContext();\n\nexport function useSession() {\n return useContext(SessionContext);\n}\n\nexport function useSessionUpdate() {\n return useContext(SessionUpdateContext);\n}\n\n// Common variables and functions for all components\nexport function SessionContextProvider({ children }) {\n const [isLoggedIn, setIsLoggedIn] = useState(false);\n const [hasLoginCheckRun, setHasLoginCheckRun] = useState(false);\n const [username, setUsername] = useState('');\n const [language, setLanguage] = useState('tag_en');\n const [accountType, setAccountType] = useState('student');\n\n useEffect(() => {\n checkLoginStatus().catch(error =>\n console.error(\"Fetch operation failed.\", error));\n }, []);\n\n async function checkLoginStatus() {\n const response = await fetch('/api/checkLoginStatus');\n if (!response.ok) throw new Error('Network response was not ok');\n const data = await response.json();\n\n if (data.status && !isLoggedIn) {\n setIsLoggedIn(data.status);\n setUsername(data.username);\n setLanguage(data.language);\n setAccountType(data.account_type);\n } else if (!data.status && isLoggedIn) {\n setIsLoggedIn(data.status);\n }\n\n setHasLoginCheckRun(true);\n }\n\n async function handleLogout() { // Logout user so stop working with the user data\n const response = await fetch('/api/logout');\n if (!response.ok) throw new Error('Network response was not ok');\n setUsername('');\n setIsLoggedIn(false);\n }\n\n function insertStringInPhrase(phrase, toInsert) { // string, list of strings to insert (make sure they are in the right order)\n let amountToInsert = phrase.replace(/[^<]/g, '').length;\n let finalPhrase = \"\";\n\n let openInsert = phrase.indexOf('<');\n let closeInsert = phrase.indexOf('>') + 1;\n let start = 0;\n\n for (let i = 0; i < amountToInsert; i++) {\n let nextInsert = phrase.indexOf('<', openInsert + 1);\n // console.log(nextInsert);\n\n finalPhrase += phrase.slice(start, openInsert) + toInsert[i];\n finalPhrase += nextInsert === -1 ? phrase.slice(closeInsert) : phrase.slice(closeInsert, nextInsert);\n // console.log(finalPhrase)\n\n start = openInsert = nextInsert;\n closeInsert = phrase.indexOf('>', closeInsert) + 1;\n }\n\n return finalPhrase;\n }\n\n return (\n \n \n {hasLoginCheckRun && // assists PrivateRoute.jsx\n <>{children}\n }\n \n \n )\n}","import React, { useEffect, useState } from 'react';\nimport '../styles/Auth.scss';\nimport { Link } from 'react-router-dom';\nimport Button from 'react-bootstrap/Button';\nimport { useSession } from '../SessionContext';\n\nfunction Login(props) {\n const [usernameOrEmail, setUsernameOrEmail] = useState('');\n const [password, setPassword] = useState('');\n\n const { setUsername, setLanguage, setAccountType, isLoggedIn, setIsLoggedIn } = useSession();\n\n useEffect(() => {\n if (isLoggedIn) window.location.replace(\"/home\");\n }, []);\n\n // Login user if their credentials match\n async function handleSuccessfulLogin() {\n if (usernameOrEmail === \"\" || password === \"\") {\n alert(\"Enter all fields.\");\n return;\n }\n\n const requestOptions = {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ usernameOrEmail: usernameOrEmail, password: password })\n };\n const response = await fetch('/api/login', requestOptions);\n const data = await response.json();\n if (!response.ok) {\n alert(data['message']);\n return;\n }\n\n // if (data.verified === 0) {\n // alert(\"Please verify your email.\");\n // return;\n // }\n\n // If the user exists go to homepage and save user data for this session\n if (data.username != null) {\n console.log(data)\n setUsername(data.username);\n setLanguage(data.lang);\n setAccountType(data.account_type);\n setIsLoggedIn(true);\n props.history.push(\"/home\");\n }\n }\n\n return (\n
\n
\n

Login

\n
\n setUsernameOrEmail(e.target.value)}\n required\n onKeyPress={event => {\n if (event.keyCode || event.which === 13) {\n handleSuccessfulLogin();\n }\n }}\n />\n
\n
\n setPassword(e.target.value)}\n required\n onKeyPress={event => {\n if (event.keyCode || event.which === 13) {\n handleSuccessfulLogin();\n }\n }}\n />\n
\n
\n \n
\n
\n Not registered? Create account\n
\n
\n
\n );\n}\n\nexport default Login;","import React, { useState, useEffect } from 'react';\nimport '../styles/Auth.scss';\nimport { Link } from 'react-router-dom';\nimport Button from 'react-bootstrap/Button';\nimport { useSession } from '../SessionContext';\n\nfunction Register(props) {\n const [email, setEmail] = useState('');\n const [username, setUsername] = useState('');\n const [language, setLanguage] = useState('tag_en');\n const [accountType, setAccountType] = useState('student');\n const [password, setPassword] = useState('');\n const [confirmPassword, setConfirmPassword] = useState('');\n\n const { isLoggedIn } = useSession();\n\n useEffect(() => {\n if (isLoggedIn) window.location.replace(\"/home\");\n }, []);\n\n async function handleSuccessfulRegister() {\n if (email === \"\" || username === \"\" || password === \"\" || confirmPassword === \"\") {\n alert(\"Enter all fields.\");\n return;\n }\n if (password !== confirmPassword) {\n alert(\"Passwords do not match.\");\n return;\n }\n\n const requestOptions = {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ email: email, username: username, lang: language, account_type: accountType, password: password })\n };\n const response = await fetch('/api/registerUser', requestOptions);\n if (!response.ok) return;\n const data = await response.json();\n\n if (data['usernameIsTaken'] !== undefined) {\n alert(data['usernameIsTaken']);\n return;\n }\n if (data['comboIsTaken'] !== undefined) {\n alert(data['comboIsTaken']);\n return;\n }\n\n alert(\"Account created.\");// A verification email has been sent to you, please verify your email so you can access your account.\");\n window.location.replace(\"/login\");\n }\n\n return (\n
\n
\n

Register

\n
\n \n setEmail(e.target.value)}\n autoComplete=\"new-password\"\n required\n />\n
\n
\n \n setUsername(e.target.value)}\n autoComplete=\"new-password\"\n required\n />\n
\n
\n \n setAccountType(event.target.value)}\n >\n \n \n \n
\n
\n \n setLanguage(event.target.value)}\n >\n \n \n \n
\n
\n \n setPassword(e.target.value)}\n autoComplete=\"new-password\"\n required\n />\n
\n
\n \n setConfirmPassword(e.target.value)}\n autoComplete=\"new-password\"\n required\n />\n
\n
\n \n
\n
\n Already a member? Click to login\n
\n
\n
\n );\n}\n\nexport default Register;","import React from 'react';\nimport './styles/Nav.scss';\nimport { NavLink } from 'react-router-dom';\nimport titles from '../data/titles.json';\nimport { useSession, useSessionUpdate } from './SessionContext';\n//import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\n//import { faUserCircle } from '@fortawesome/free-solid-svg-icons'\n\nconst Nav = () => {\n\tconst { language, setLanguage, username, isLoggedIn } = useSession();\n\tconst { handleLogout } = useSessionUpdate();\n\n\treturn (\n\t\t\n\t);\n}\n\nexport default Nav;","import React from 'react';\nimport '../styles/ConfirmDelete.scss';\nimport titles from '../../data/titles.json';\nimport { useSession, useSessionUpdate } from '../SessionContext';\n\nconst ConfirmDelete = (props) => {\n\n const { language } = useSession();\n const { insertStringInPhrase } = useSessionUpdate();\n\n async function deleteType() {\n if (props.parent === 'Classroom') {\n props.manipulateClassroom('/api/deleteClassroom');\n props.setShowConfirmDelete(false);\n return;\n }\n\n const deleteFunc = props.objectToDelete.type === 'collection' ? '/api/deleteCollection' : '/api/deleteDeck';\n\n const requestOptions = {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ id: props.objectToDelete.id })\n };\n const response = await fetch(deleteFunc, requestOptions);\n if (!response.ok) return;\n\n // If the chosen deck is being deleted unchoose it\n if ((props.objectToDelete.type === 'deck') &&\n (props.objectToDelete.id === props.chosenDeck.id)) {\n props.setChosenDeck({ id: -1 });\n }\n\n props.setObjectToDelete({ name: \"\", id: -1, type: \"\" });\n props.getCollections();\n }\n\n console.log(props.objectToDelete);\n\n return (\n
\n
\n
\n {insertStringInPhrase(titles[language].are_you_sure, [props.objectToDelete.name])}\n
\n \n \n
\n
\n );\n}\n\nexport default ConfirmDelete;","import React from 'react';\nimport { Link } from 'react-router-dom';\nimport './styles/ChooseQuiz.scss';\nimport titles from '../data/titles.json';\nimport { useSession } from './SessionContext';\n\nconst ChooseQuiz = (props) => {\n const { language } = useSession();\n\n function filterIncompatibleFlashcards() {\n let compatibleFlashcards = [...props.flashcards];\n let remove = false;\n\n // Remove cards that are not compatible with the chosen quiz type\n for (let i = 0; i < compatibleFlashcards.length; i++) {\n let flashcard = compatibleFlashcards[i];\n remove = false;\n\n if (flashcard.tense === \"\") remove = true;\n\n if (remove) {\n compatibleFlashcards.splice(i, 1);\n i--;\n }\n }\n\n return compatibleFlashcards;\n }\n\n function mixFlashcards(quizType) {\n let flashcardsToMix = filterIncompatibleFlashcards(quizType);\n\n for (let j = flashcardsToMix.length - 1; j > 0; j--) {\n const k = Math.floor(Math.random() * (j + 1));\n [flashcardsToMix[j], flashcardsToMix[k]] = [flashcardsToMix[k], flashcardsToMix[j]];\n }\n\n return flashcardsToMix;\n }\n\n let quizAttributes = {\n pathname: `/quiz/${props.chosenDeck.name}`,\n chosenClassroom: props.chosenClassroom,\n chosenDeck: props.chosenDeck,\n parent: props.parent,\n class_id: props.class_id,\n language: language // passed to quiz as a prop.location ideally should change to grabbing from session context\n }\n\n return (\n -1 ? {} : { display: 'none' }}\n >\n
\n

{props.chosenDeck.name}

\n

{props.flashcards.length} cards

\n
\n
\n
{titles[language].quizzes}
\n
\n \n \n \n {/* */}\n \n {/* */}\n {/* */}\n \n {/* */}\n
\n {props.flashcards.length === 0 &&\n
\n {titles[language].empty_deck_message}\n
\n }\n
\n \n );\n}\n\nexport default ChooseQuiz;","import React, { useState, useEffect } from 'react';\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\"\nimport { faCheckCircle, faTimesCircle, faArrowLeft } from \"@fortawesome/free-solid-svg-icons\"\nimport './styles/Classroom.scss';\nimport titles from '../data/titles.json';\nimport { useSession, useSessionUpdate } from './SessionContext';\n\nconst ClassroomGrid = (props) => {\n const [classes, setClasses] = useState([]);\n const [chosenClassrooms, setChosenClassrooms] = useState([]); // For adding a collection to classrooms\n const [openInput, setOpenInput] = useState(false);\n const [classNameInput, setClassNameInput] = useState(\"\");\n\n const { accountType, language } = useSession();\n const { insertStringInPhrase } = useSessionUpdate();\n\n useEffect(() => {\n getClasses();\n }, []);\n\n useEffect(() => {\n\n }, [classes]);\n\n function handleChange(event) {\n setClassNameInput(event.target.value);\n }\n\n //copy rename (1)\n // tags\n // teacher refreence\n // filters\n\n async function getClasses() {\n const requestOptions = {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ collection: props.collectionForClass !== undefined ? props.collectionForClass : { id: -1 } })\n };\n const response = await fetch('/api/getClasses', requestOptions);\n if (!response.ok) return;\n const data = await response.json();\n\n setChosenClassrooms(Array(data.classes.length).fill({ id: -1 }));\n setClasses(data.classes);\n\n console.log(data.classes)\n }\n\n // Join or create a new class\n async function newClassroom() {\n const newClassFunc = accountType === 'student' ? '/api/joinClass' : '/api/createClass';\n\n const requestOptions = {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ class_code: classNameInput, name: classNameInput })\n };\n const response = await fetch(newClassFunc, requestOptions);\n if (!response.ok) return;\n\n if (accountType === 'student') {\n const data = await response.json();\n if (data.alertMessage.length > 0) {\n alert(data.alertMessage);\n return;\n }\n }\n\n setOpenInput(false);\n getClasses();\n }\n\n async function addCollectionToClasses() {\n const requestOptions = {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n collection_id: props.collectionForClass.id,\n class_ids: chosenClassrooms.map(({ id }) => id).filter(i => i !== -1) // Array of chosen classroom ids\n })\n };\n const response = await fetch('/api/addCollectionToClasses', requestOptions);\n if (!response.ok) return;\n\n props.setCollectionForClass({ id: -1 })\n alert(\"Sucessfully added\")\n }\n\n function stringOfChosenClassrooms() {\n return chosenClassrooms.map(({ name }) => name).filter(name => name !== undefined).join(', ');\n }\n\n function classStyle(alreadyAdded, isChosen) {\n if (alreadyAdded) return \"already-added\";\n if (isChosen) return \"chosen-classroom\";\n return \"classroom\";\n }\n\n return (\n
\n
\n {(classes.length === 0 || chosenClassrooms.length === 0) ?\n
\n No classes\n
\n :\n <>\n {props.parent === \"DeckSelection\" &&\n

\n {insertStringInPhrase(titles[language].select_instruction, [props.collectionForClass.name])}\n

\n }\n \n }\n
\n {classes.map((classroom, c) =>\n -1)}\n onClick={() => {\n if (props.parent === 'DeckSelection') {\n if (classroom.alreadyAdded) return;\n let chosen = [...chosenClassrooms];\n chosen[c] = chosen[c].id === -1 ? classroom : { id: -1 };\n setChosenClassrooms(chosen);\n return;\n }\n props.setChosenClassroom(classroom);\n sessionStorage.setItem('classroom', JSON.stringify(classroom));\n }}\n >\n
\n {classroom.name}\n
\n
\n {titles[language].class_code}: {classroom.class_code}\n
\n {classroom.teacher}\n {classroom.studentAmount}\n {props.parent === \"DeckSelection\" && classroom.alreadyAdded &&\n
Already added
\n }\n
\n )}\n
\n {props.parent === \"DeckSelection\" &&\n
\n

\n {insertStringInPhrase(titles[language].add_collections_to_class, [props.collectionForClass.name, stringOfChosenClassrooms()])}\n {stringOfChosenClassrooms().length === 0 && <>..}\n

\n addCollectionToClasses()}\n >\n Confirm\n \n
\n }\n
\n {!openInput ?\n \n :\n <>\n setOpenInput(false)}\n />\n ((event.keyCode || event.which === 13) && classNameInput.length > 0) && newClassroom()}\n >\n \n {\n console.log(accountType)\n if (classNameInput.length > 0) {\n newClassroom();\n return;\n }\n alert(\"Fill in the blank input.\");\n }}\n >\n {accountType === \"teacher\" ? <>{titles[language].create_class} : <>{titles[language].join_class}}\n \n \n }\n {props.parent === \"DeckSelection\" &&\n \n }\n
\n
\n \n );\n}\n\nexport default ClassroomGrid;","import linguisticInfo from '../../data/linguisticInfo.json';\n\n// Returns the form of a verb\nconst Label = (props) => {\n let verbForm = \"\";\n const attributes = [\"tense\", \"mood\", \"person\", \"number\"]; // Specifies the order to loop through the attributes\n\n // console.log(props.tags, attributes);\n\n // Loop through linguistic attributes - tense, mood, person, number\n for (const attribute of attributes) {\n // Loop through the forms they offer\n for (const form of linguisticInfo[attribute]) {\n // console.log(props.tags[attribute], attribute, form.tag_name, form)\n if (props.tags[attribute] === form.tag_name) {\n verbForm += form[\"tag_it\"] + \" \";\n break;\n }\n }\n }\n return verbForm;\n}\n\nexport default Label;","import React from 'react';\n\nconst GeneratePronoun = (props) => { \n let possiblePronouns;\n let pronoun;\n\n switch (props.person) { // Narrow down the possible singular or plural pronouns from the person\n case \"1P\":\n possiblePronouns = [<>io, <>noi];\n break;\n case \"2P\":\n possiblePronouns = [<>tu, <>voi/Voiformal];\n break;\n default:\n possiblePronouns = [<>lui/lei/Leiformal, <>loro/Loroformal];\n break;\n }\n\n switch (props.number) { // Choose the right pronoun based whether its singular or plural\n case \"Sg\":\n pronoun = possiblePronouns[0];\n break;\n default:\n pronoun = possiblePronouns[1];\n break;\n }\n\n return <>({pronoun});\n}\n\nexport default GeneratePronoun; ","import React, { useState, useEffect } from 'react';\nimport Label from './Label';\nimport GeneratePronoun from './GeneratePronoun';\nimport '../styles/FlashcardForms.scss';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faLongArrowAltDown } from '@fortawesome/free-solid-svg-icons';\n\nconst FlashcardForms = (props) => {\n const [verbInput, setVerbInput] = useState(\"\");\n const [inputMode, setInputMode] = useState(\"verbInput\");\n\n // Makes input the choice\n useEffect(() => {\n setVerbInput(props.choice);\n setInputMode(\"hintInput\");\n }, [props.choice]);\n\n // When Check button is pressed on Quiz component\n useEffect(() => {\n props.answered === true && isCorrect();\n }, [props.answered]);\n\n // Reset input for next flashcard\n useEffect(() => {\n setVerbInput(\"\");\n setInputMode(\"verbInput\")\n }, [props.questionNumber]);\n\n // Changes the value of the verb input if the user didn't submit their answer\n function handleChange(event) {\n if (props.parent === \"Results\") {\n setVerbInput(event);\n }\n else if (props.parent === \"Quiz\") {\n props.answered === false && setVerbInput(event.target.value);\n } else {\n setVerbInput(event.target.value);\n }\n }\n\n async function isCorrect() {\n // Check if answer is correct for type mode /**FIX how colors change */\n if ((props.flashcardMode === \"conjugate\") &&\n ((props.parent === \"FlashcardGrid\") || (inputMode === \"verbInput\") || (inputMode === \"hintInput\"))) {\n\n // If answer is correct\n if (verbInput === props.verb) {\n setInputMode(\"rightInput\");\n if (props.parent === \"Quiz\") {\n let res = await props.processResult(true, verbInput);\n console.log(res)\n }\n }\n else {\n setInputMode(\"wrongInput\");\n if (props.parent === \"Quiz\") {\n let res = await props.processResult(false, verbInput);\n // console.log(res)\n }\n }\n }\n\n // Check if answer is correct for tense mode /**change where these are maybe keep the input stuff here only */\n if ((props.flashcardMode === \"identify_tense\") && (props.parent === \"Quiz\")) {\n if (props.choice === props.tags.tense) {\n let res = await props.processResult(true, props.choice);\n console.log(res)\n }\n else {\n let res = await props.processResult(false, props.choice);\n console.log(res)\n }\n }\n }\n\n let attributesSide =
\n
\n \n
\n
of
\n
\n {props.infinitive}\n
\n
;\n\n let conjugatedSide =
\n {props.verb}\n
;\n\n if (props.flashcardMode === \"raw\") {\n return <>\n
\n \n
\n

\n
\n {props.verb}\n
\n \n }\n else if (props.flashcardMode === \"side1\") {\n return
\n {attributesSide}{conjugatedSide}\n
\n }\n else if (props.flashcardMode === \"side2\") {\n return
\n {conjugatedSide}{attributesSide}\n
\n }\n else if (props.flashcardMode === \"both_sides\") {\n return <>\n
{attributesSide}
\n
{conjugatedSide}
\n \n }\n // Question Type 1 - Fill in the verb\n else if (props.flashcardMode === \"conjugate\") { // Move wrapper here\n return <>\n
\n \n \n \n
\n
\n {props.infinitive}\n
\n
\n {(inputMode === \"wrongInput\" || (props.parent === \"Results\" && props.history.correct === 0)) &&\n
{props.verb}
\n }\n \n \n \n {props.parent === \"Results\" ?\n \n {props.history.correct === 1 ?\n <>{props.verb} :\n \n {props.history?.attempt}\n \n }\n \n :\n {\n if (event.keyCode || event.which === 13) {\n if (props.parent === \"Quiz\") {\n if (props.answered && props.questionNumber < props.questionAmount - 1) {\n props.nextQuestion();\n return;\n }\n props.setAnswered(true);\n return;\n }\n isCorrect(); // For Home\n }\n }}\n onPaste={(event) => {\n event.preventDefault();\n return false;\n }}\n onCopy={(event) => {\n event.preventDefault();\n return false;\n }}\n />\n }\n
\n \n } // Question Type 2 - What's the tense\n else if (props.flashcardMode === \"identify_tense\") {\n return <>\n
\n {props.infinitive}\n
\n
\n \n {props.parent === \"Results\" &&\n \n
\n \n
\n {props.history.correct === 0 &&\n
\n \n
\n }\n
\n }\n
\n
\n \n \n \n  {props.verb/**check about formatting this nice */}\n
\n \n }\n return null;\n}\n\nexport default FlashcardForms; ","import { useCallback, useEffect, useLayoutEffect, useRef } from 'react';\n\nconst useKeyPress = (keys, callback, node = null) => {\n // implement the callback ref pattern\n const callbackRef = useRef(callback);\n useLayoutEffect(() => {\n callbackRef.current = callback;\n });\n\n // handle what happens on key press\n const handleKeyPress = useCallback(\n (event) => {\n // check if one of the key is part of the ones we want\n if (keys.some((key) => event.key === key)) {\n callbackRef.current(event);\n }\n },\n [keys]\n );\n\n useEffect(() => {\n // target is either the provided node or the document\n const targetNode = node ?? document;\n // attach the event listener\n targetNode &&\n targetNode.addEventListener(\"keydown\", handleKeyPress);\n\n // remove the event listener\n return () =>\n targetNode &&\n targetNode.removeEventListener(\"keydown\", handleKeyPress);\n }, [handleKeyPress, node]);\n};\n\nexport default useKeyPress;","import React, { useState, useEffect } from 'react';\nimport { Link } from 'react-router-dom';\nimport FlashcardForms from './util/FlashcardForms';\nimport './styles/FlashcardGrid.scss';\n// import './styles/FlashcardForms.scss';\nimport useKeyPress from './util/useKeyPress';\nimport titles from '../data/titles.json';\nimport { useSession } from './SessionContext';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport linguisticInfo from '../data/linguisticInfo.json';\nimport { faArrowCircleLeft, faArrowCircleRight, faChevronDown, faChevronUp } from '@fortawesome/free-solid-svg-icons';\n\nconst FlashcardGrid = (props) => {\n // console.log(props.flashcards)\n const [selectStatus, setSelectStatus] = useState([]);\n const [tabStatus, setTabStatus] = useState([\"selectedTab\", \"tab\"]);\n\n const [flashcardForm, setFlashcardForm] = useState(\"\");\n const [viewMode, setViewMode] = useState(\"Grid View\");\n\n const [flashcardNumber, setFlashcardNumber] = useState(0);\n const [showFormFilters, setShowFormFilters] = useState(false);\n const [formFilter, setFormFilter] = useState({ tense: \"All\", mood: \"All\", person: \"All\", number: \"All\" });\n const [filteredFlashcards, setFilteredFlashcards] = useState(props.flashcards); // Not always filtered may just hold all flashcards\n\n const { language } = useSession();\n\n useEffect(() => {\n if (props.parent === \"Home\" || props.parent === \"Classroom\") {\n if (tabStatus[1] === \"selectedTab\") props.setManageFlashcards(true);\n else props.setManageFlashcards(false);\n }\n }, [tabStatus]);\n\n // Mount\n useEffect(() => {\n if (props.parent === \"Home\" || props.parent === \"Classroom\") {\n setFlashcardForm(\"side1\");\n setViewMode(\"Presentation View\");\n } else if (props.parent === \"Search\" || props.parent === \"VerbAnalyzer\") {\n setFlashcardForm(\"raw\");\n setViewMode(\"Grid View\");\n }\n }, [props.parent]);\n\n useEffect(() => {\n setFilteredFlashcards(props.flashcards);\n setSelectStatus(Array(props.flashcards.length).fill(\"unselected\"));\n // if (props.parent !== \"Members\")\n props.setChosenCards([]);\n // props.flashcards.length > 0 ? setTabStatus([\"selectedTab\", \"tab\"]) : setTabStatus([\"tab\", \"selectedTab\"]);\n }, [props.flashcards, props.decks]);\n\n useEffect(() => {\n filterFlashcards();\n }, [formFilter, viewMode, flashcardForm]);\n\n function filterFlashcards() {\n // console.log(props.flashcards)\n\n let filteredFlashcardsClone = [];\n\n for (let i = 0; i < props.flashcards.length; i++) {\n let flashcard = props.flashcards[i];\n let filtered = true;\n [\"tense\", \"mood\", \"person\", \"number\"].forEach(filter => {\n if (formFilter[filter] !== \"All\" && formFilter[filter] !== flashcard[filter]) filtered = false;\n });\n if (flashcard.tense === \"\" && flashcardForm === \"conjugate\") filtered = false;\n if (filtered) filteredFlashcardsClone.push(flashcard);\n }\n\n // console.log(flashcard.mood)\n // if ((flashcardForm === \"conjugate\") && (flashcard.tense === null) &&\n // ((flashcard.mood !== \"Indicative\") &&\n // (flashcard.mood !== \"Subjunctive\") &&\n // (flashcard.mood !== \"Conditional\") &&\n // (flashcard.mood !== \"Imperative\"))) { // RETHINK THIS and double check\n // return;\n // }\n // if (flashcardForm === \"conjugate\" && flashcard.mood === \"Gerund\") return;\n\n // console.log(filteredFlashcards)\n selectDeselectAll(\"unselected\");\n setFilteredFlashcards(filteredFlashcardsClone);\n }\n\n // Adds or removes a card to the deck\n function updateChosenCards(card) {\n let chosenCardsClone = props.chosenCards;\n let selectStatusClone = selectStatus;\n\n // If card is selected add the card to the deck and sort it\n if (selectStatusClone[card] === \"unselected\") {\n selectStatusClone[card] = \"selected\";\n chosenCardsClone.push(filteredFlashcards[card].id);\n chosenCardsClone.sort();\n } else { // When deselected remove the card from the deck\n selectStatusClone[card] = \"unselected\";\n chosenCardsClone.splice(chosenCardsClone.indexOf(filteredFlashcards[card].id), 1);\n }\n\n setSelectStatus([...selectStatusClone]);\n props.setChosenCards([...chosenCardsClone]);\n\n console.log(selectStatusClone, chosenCardsClone);\n }\n\n // Select or deselect all flashcards\n function selectDeselectAll(command) {\n let chosenCardsClone = [];\n let selectStatusClone = selectStatus;\n\n for (let i = 0; i < filteredFlashcards.length; i++) {\n selectStatusClone[i] = command;\n if (command === \"selected\") {\n chosenCardsClone.push(filteredFlashcards[i].id);\n }\n }\n\n setSelectStatus(selectStatusClone);\n props.setChosenCards(chosenCardsClone);\n\n // console.log(selectStatusClone, chosenCardsClone);\n }\n\n function navigateFlashcards(movement) {\n if ((flashcardNumber + movement) < filteredFlashcards.length && (flashcardNumber + movement) > -1)\n setFlashcardNumber(flashcardNumber + movement);\n }\n\n const onKeyPress = (event) => {\n // Don't allow in conjugate mode since it prevents moving within the input box (maybe there is a workaround when the input box isn't active?)\n if (flashcardForm === \"conjugate\") return;\n switch (event.key) {\n case \"ArrowLeft\":\n navigateFlashcards(-1);\n break;\n case \"ArrowRight\":\n navigateFlashcards(1);\n break;\n }\n };\n\n useKeyPress([\"ArrowLeft\", \"ArrowRight\"], onKeyPress);\n\n return (\n
\n {(props.parent === \"Home\" || props.parent === \"Classroom\") &&\n
\n { setFlashcardForm(\"side1\"); selectDeselectAll(\"unselected\"); setTabStatus([\"selectedTab\", \"tab\"]); setViewMode(\"Presentation View\"); }}\n >\n {titles[language].study}\n
\n { setFlashcardForm(\"raw\"); selectDeselectAll(\"unselected\"); setTabStatus([\"tab\", \"selectedTab\"]); setViewMode(\"Grid View\"); }}\n >\n {props.chosenUserID === -1 && titles[language].edit}\n {props.chosenUserID > -1 && titles[language].copy}\n
\n \n }\n
\n
\n {flashcardForm === \"raw\" ? // Edit mode\n <>\n
\n selectDeselectAll(\"selected\")}\n >\n {titles[language].select_all}\n \n selectDeselectAll(\"unselected\")}\n >\n {titles[language].deselect_all}\n \n
\n
\n {(props.parent === \"Home\" && props.chosenUserID === -1) &&\n \n \n \n }\n
\n \n : // Study Mode\n <>\n
\n
Flashcard Form
\n
\n setFlashcardForm(e.target.value)}\n >\n \n \n \n
\n
\n
\n
View
\n
\n {(flashcardForm === \"side1\" || flashcardForm === \"side2\" || flashcardForm === \"both_sides\") &&\n setFlashcardForm(e.target.value)}\n >\n \n \n {viewMode === \"Presentation View\" && }\n \n }\n {\n if (e.target.value === \"Grid View\" && flashcardForm === \"both_sides\") setFlashcardForm(\"side1\");\n setViewMode(e.target.value)\n }}\n >\n \n \n \n
\n
\n \n }\n
\n {props.parent !== \"Search\" && // Form filters\n <>\n
\n setShowFormFilters(!showFormFilters)}>\n Filter Forms \n \n
\n {showFormFilters &&\n
\n {[\"tense\", \"mood\", \"person\", \"number\"].map((attribute, a) => // Loop through every linguistic attribute in this order\n
\n

{titles[language][attribute]}

\n \n
\n )}\n
\n }\n \n }\n
\n {filteredFlashcards.length > 0 &&\n <>\n
\n {viewMode === \"Grid View\" &&\n filteredFlashcards.map((flashcard, f) =>\n
\n flashcardForm === \"raw\" && updateChosenCards(f)}\n >\n \n
\n
\n )}\n {viewMode === \"Presentation View\" &&\n
\n
\n \n
\n
\n }\n \n {viewMode === \"Presentation View\" && tabStatus[0] === \"selectedTab\" && // previous next buttons\n
\n
navigateFlashcards(-1)}>\n \n
Prev
\n
\n
\n {flashcardNumber + 1}/{filteredFlashcards.length}\n
\n
navigateFlashcards(1)}>\n \n
Next
\n
\n
\n }\n \n }\n \n );\n}\n\nexport default FlashcardGrid;","import React, { useEffect, useState } from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faCaretUp, faCaretDown, faPlusCircle } from '@fortawesome/free-solid-svg-icons';\nimport titles from '../data/titles.json';\nimport './styles/MiniDeckSelection.scss';\nimport { useSession, useSessionUpdate } from './SessionContext';\n\nconst MiniDeckSelection = (props) => {\n const [saveMessage, setSaveMessage] = useState(\"\");\n const [openCloseArrow, setOpenCloseArrow] = useState(faCaretUp);\n const [chosenCollectionOption, setChosenCollectionOption] = useState(0);\n\n const [copyToDeck, setCopyToDeck] = useState({ id: -1 }); // Only this is used when parent is Home\n\n const { language } = useSession();\n const { insertStringInPhrase } = useSessionUpdate();\n\n // Sets default collection\n useEffect(() => {\n if ((props.collections.user[0] !== undefined) && // Data has loaded\n (props.chosenDeck.id !== -1) && // A deck has been chosen (from Add cards button)\n (props.chosenUserID === -1)) { // We are not exploring\n setChosenCollectionOption(props.collections.user.findIndex(collection => collection.id === props.chosenDeck.collection_id));\n }\n }, [props.chosenDeck, props.collections])\n\n // Adds or deletes cards from a deck\n async function cardOperations(addOrDeleteFunc) {\n // If we are copying cards choose the id of the deck we are copying to\n let deck_id = props.parent === \"Home\" && addOrDeleteFunc === \"/api/addCards\" ? copyToDeck.id : props.chosenDeck.id;\n\n if (props.chosenCards.length > 0 && deck_id > -1) {\n const requestOptions = {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n cards: props.chosenCards,\n deck_id: deck_id\n })\n };\n const response = await fetch(addOrDeleteFunc, requestOptions);\n if (!response.ok) return;\n const data = await response.json();\n if (data['error'] !== undefined) {\n alert(data['error']);\n return;\n }\n if (data['someAdded'] !== undefined) alert(data['someAdded']);\n\n // Refresh\n props.parent === \"Home\" && props.getFlashcards(props.chosenDeck); // Just for passing the same id\n // props.setChosenCards([]);\n props.getCollections();\n\n addOrDeleteFunc === \"/api/addCards\"\n ? setSaveMessage(\"Saved!\")\n : setSaveMessage(`Deleted ${props.chosenCards.length} cards from ${props.chosenDeck.name}!`);\n\n setInterval(() => { setSaveMessage(\"\") }, 5000);\n }\n // else Choose a deck and some cards\n }\n\n let decksInCollection = [];\n\n // Wait for attributes to be defined, maybe await this later?\n if (props.collections.user[0] !== undefined) {\n decksInCollection = props.decks.user.filter(deck => deck.collection_id === props.collections.user[chosenCollectionOption].id);\n }\n\n return (\n
\n
\n {saveMessage.length > 0 &&\n
{saveMessage}
\n }\n \n setChosenCollectionOption(e.target.value)}\n >\n {props.collections.user.map((collection, c) =>\n \n )}\n \n
    \n {decksInCollection.map((deck, d) =>\n
  • \n {\n if (props.parent === \"Home\" || props.parent === \"Classroom\") setCopyToDeck(deck);\n else props.setChosenDeck(deck);\n }}\n >\n {deck.name} ({deck.size})\n
\n \n )}\n \n
\n props.setDeckName(e.target.value)}\n onKeyPress={e => (e.keyCode || e.which === 13) && props.add(props.collections.user[chosenCollectionOption].id, props.deckName, 'deck')}\n />\n props.add(props.collections.user[chosenCollectionOption].id, props.deckName, 'deck')}\n />\n
\n
\n
\n 0 ? \"addTo\" : \"unactiveAddTo\"}\n disabled={props.chosenCards.length === 0}\n onClick={() => cardOperations(\"/api/addCards\")}\n >\n {(props.parent === \"Home\" || props.parent === \"Classroom\") && // From deckname copy (card amount) to otherdeck\n <>\n From {props.chosenDeck.name} \n {titles[language].copy_to.substr(0, titles[language].copy_to.indexOf(' '))} ({props.chosenCards.length}) \n {titles[language].copy_to.substr(titles[language].copy_to.indexOf(' ') + 1)} \n {copyToDeck.name}\n \n }\n {(props.parent === \"Search\" || props.parent === \"VerbAnalyzer\") && // Add (card amount) to deck\n <>\n {titles[language].add_to.substr(0, titles[language].add_to.indexOf(' '))} ({props.chosenCards.length}) \n {titles[language].add_to.substr(titles[language].add_to.indexOf(' ') + 1)} \n {props.chosenDeck.name}\n \n }\n \n openCloseArrow === faCaretUp ? setOpenCloseArrow(faCaretDown) : setOpenCloseArrow(faCaretUp)}\n >\n \n \n
\n \n {(props.parent === \"Home\" && props.chosenUserID === -1) &&\n
\n cardOperations(\"/api/deleteCards\")}\n >\n {language === \"tag_en\" && insertStringInPhrase(titles[language].delete_from, [props.chosenCards.length, props.chosenDeck.name])}\n {language === \"tag_de\" && insertStringInPhrase(titles[language].delete_from, [props.chosenDeck.name, props.chosenCards.length])}\n \n
\n }\n \n )\n}\n\nexport default MiniDeckSelection;","import React, { useState, useEffect } from 'react';\n// import { Link } from 'react-router-dom';\nimport ConfirmDelete from './util/ConfirmDelete';\nimport ChooseQuiz from './ChooseQuiz';\nimport ClassroomGrid from './ClassroomGrid';\nimport FlashcardGrid from './FlashcardGrid';\nimport MiniDeckSelection from './MiniDeckSelection';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faTrashAlt, faPlusCircle, faPen, faArrowLeft, faEye, faEyeSlash, faCheck, faArrowsAltV, faUserGraduate, faCopy/*, faTimesCircle */ } from '@fortawesome/free-solid-svg-icons';\nimport SmallDeck from '../images/small.png';\nimport MediumDeck from '../images/medium.png';\nimport LargeDeck from '../images/large.png';\nimport titles from '../data/titles.json';\nimport { useSession } from './SessionContext';\nimport './styles/Home.scss';\nimport './styles/DeckSelection.scss';\n\nconst DeckSelection = (props) => {\n const [collections, setCollections] = useState({ user: [], other: [] });\n const [decks, setDecks] = useState({ user: [], other: [] });\n const [chosenDeck, setChosenDeck] = useState({ id: -1 });\n\n const [flashcards, setFlashcards] = useState([]);\n const [chosenCards, setChosenCards] = useState([]);\n\n const [collectionEditMode, setCollectionEditMode] = useState({ nameEdit: [], pluses: [] });\n const [deckEditMode, setDeckEditMode] = useState([]);\n const [isPublic, setIsPublic] = useState(true);\n\n const [deckName, setDeckName] = useState(\"\");\n const [renamedDeck, setRenamedDeck] = useState(\"\");\n const [collectionName, setCollectionName] = useState(\"\");\n const [renamedCollection, setRenamedCollection] = useState(\"\");\n\n const [editEnabled, setEditEnabled] = useState(false);\n const [objectToDelete, setObjectToDelete] = useState({ name: \"\", id: -1, type: \"\" });\n const [collectionForClass, setCollectionForClass] = useState({ id: -1 });\n\n const [manageFlashcards, setManageFlashcards] = useState(false);\n\n const { language, accountType } = useSession();\n\n // instead of check for -1 in chosenDeck.id create a more readable solution <- at this point not gonna happen\n\n useEffect(() => { props.chosenDeckLink !== undefined && setChosenDeck(props.chosenDeckLink); }, [props.chosenDeckLink]);\n\n useEffect(() => { getCollections(); }, [props.chosenUserID]);\n\n useEffect(() => { initializeUnclick(); }, [collections, decks]);\n\n async function getCollections() {\n const userID = props.chosenUserID === undefined ? -1 : props.chosenUserID;\n\n const requestOptions = {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n user_id: userID,\n class_id: props.chosenClassroomID === undefined ? -1 : props.chosenClassroomID\n })\n };\n\n const response = await fetch('/api/getCollections', requestOptions);\n if (!response.ok) return;\n const data = await response.json();\n\n userID === -1 ? setEditEnabled(true) : setEditEnabled(false);\n\n props.parent === \"Versus\" && setEditEnabled(false);\n\n setCollections(data.collections);\n setDecks(data.decks);\n\n if (props.parent === \"Classroom\" && data.collections.other.length > 0) props.recieveCollections(data.collections.other, data.decks.other); // Pass data to parent\n }\n\n async function initializeUnclick() { // Used usually after something has been edited so user length is used\n setCollectionEditMode({\n nameEdit: Array(collections.user.length).fill(false),\n pluses: Array(collections.user.length).fill(false)\n });\n setDeckEditMode(Array(decks.user.length).fill(false));\n setDeckName(\"\");\n setRenamedCollection(\"\");\n setCollectionName(\"\")\n setRenamedDeck(\"\");\n }\n\n // Rename a deck or collection while closing any previous inputs for renaming\n async function enableNameEdit(i, oldName, type) {\n await initializeUnclick();\n\n console.log(deckEditMode);\n\n let editMode;\n\n // Choose whether a collection or deck is going to be edited\n if (type === \"collection\") {\n editMode = { ...collectionEditMode };\n editMode.nameEdit[i] = true;\n setCollectionEditMode(editMode);\n setRenamedCollection(oldName);\n } else {\n editMode = [...deckEditMode];\n editMode[i] = true;\n setDeckEditMode(editMode);\n setRenamedDeck(oldName);\n }\n }\n\n function changePublicity(collectionID) {\n const requestOptions = {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ collectionID: collectionID })\n };\n fetch('/api/changePublicity', requestOptions).then(response => response.json()).then(() => getCollections());\n }\n\n // Generalizes adding collections and decks\n async function add(collectionID = null, name, type) {\n const addFunc = type === 'collection' ? '/api/addCollection' : '/api/addDeck';\n\n if (name.length > 0) {\n const requestOptions = {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n collectionID: collectionID,\n name: name,\n isPublic: isPublic ? 1 : 0,\n })\n };\n const response = await fetch(addFunc, requestOptions);\n if (!response.ok) return;\n const data = await response.json();\n\n if (data['error'] !== undefined) {\n alert(data['error']);\n return;\n }\n\n getCollections();\n if (collectionID !== null && type === 'collection') alert(`You have a copy of ${name}.`); // temp\n return;\n }\n alert(`Please name your ${type}.`);\n }\n\n // Generalizes renaming collections and decks\n async function rename(id, type) {\n const renamedType = type === 'collection' ? renamedCollection : renamedDeck;\n\n if (renamedType.length > 0) {\n const requestOptions = {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ id: id, name: renamedType, type: type })\n };\n const response = await fetch('/api/rename', requestOptions);\n if (!response.ok) return;\n getCollections();\n type === 'deck' && setChosenDeck({ ...chosenDeck, name: renamedType }); // helps refresh the deck name in ChooseQuiz a bit hacky, ideally would call getFlashcards() instead?\n return;\n }\n alert(`Please name your ${type}.`);\n }\n\n async function getFlashcards(deck) { // Helps enable deck details to be shown\n console.log(deck);\n const requestOptions = {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ deck_id: deck.id })\n };\n const response = await fetch('/api/getUserFlashcards', requestOptions);\n if (!response.ok) return;\n const data = await response.json();\n\n let newFlashcards = []; // Clone flashcards for easy manipulation\n\n // Store attributes of every verb\n for (let i = 0; i < data.flashcards.length; i++) {\n newFlashcards.push({\n tense: data.flashcards[i].tense_tag,\n mood: data.flashcards[i].mood_tag,\n person: data.flashcards[i].person_tag,\n number: data.flashcards[i].number_tag,\n infinitive: data.flashcards[i].root_tag,\n verb: data.flashcards[i].verb,\n id: data.flashcards[i].id\n });\n }\n\n if (props.parent === \"Versus\") {\n deck.flashcards = newFlashcards;\n props.updateMultiplayerFlashcards(deck); // Remove cards and deck if already chosen\n } else {\n setFlashcards([...newFlashcards]);\n setChosenDeck(deck);\n }\n }\n\n function highlightDeck(deckID) { // Highlights chosen deck(s)\n let highlight = { backgroundColor: \"#e3dafd\", border: \"3px solid hsl(275, 100%, 25%)\" }\n\n if (props.parent === \"Versus\") {\n if (props.chosenDecks.some(cd => cd.id === deckID)) return highlight;\n }\n if (chosenDeck.id === deckID) return highlight;\n }\n\n let userOrOther = props.chosenUserID === -1 ? \"user\" : \"other\";\n let decksInCollection = [];\n let trueStartIndex = 0;\n\n let DSclassName = editEnabled ? \"yourCollections \" : \"otherCollections \";\n if (props.parent === \"Versus\") DSclassName += \"versus\";\n\n return (\n <>\n {(props.parent === \"Home\" || props.parent === \"Classroom\" || props.parent === \"Versus\") &&\n
\n {props.parent === \"Versus\" &&\n
\n

Deck Selection

\n \n
\n }\n {collections[userOrOther].map((collection, c) => {\n trueStartIndex += decksInCollection.length;\n decksInCollection = decks[userOrOther].filter(deck => deck.collection_id === collection.id);\n\n return
-1 && chosenDeck.collection_id !== collection.id && props.parent !== \"Versus\" ? { display: 'none' } : {}}\n >\n \n

{collection.name}

\n {editEnabled ?\n <>\n
\n enableNameEdit(c, collection.name, \"collection\")}\n />\n changePublicity(collection.id)}\n />\n {accountType === 'teacher' &&\n setCollectionForClass(collection)}\n />\n }\n setObjectToDelete({ name: collection.name, id: collection.id, type: 'collection' })}\n />\n
\n
\n initializeUnclick()}\n />\n setRenamedCollection(e.target.value)}\n onKeyPress={e => (e.keyCode || e.which === 13) && rename(collection.id, 'collection')}\n />\n 0 ? {} : { display: 'none' }}\n onClick={() => rename(collection.id, 'collection')}\n />\n
\n \n :\n
\n add(collection.id, collection.name, 'collection')} // Copy collection\n />\n
\n }\n
\n
\n {decksInCollection.map((deck, d) => {\n let trueIndex = d + trueStartIndex; // Deck index count won't restart to 0 for every collection this way\n\n return getFlashcards(deck)}\n >\n
\n {deck.size === 0 && // Show certain image based on the deck size\n \n
\n }\n {(deck.size > 0 && deck.size <= 15) && \"Small}\n {(deck.size > 15 && deck.size <= 30) && \"Medium}\n {deck.size > 30 && \"Large}\n
\n {editEnabled &&\n
\n setObjectToDelete({ name: deck.name, id: deck.id, type: 'deck' })}\n />\n
\n enableNameEdit(trueIndex, deck.name, \"deck\")}\n />\n
\n }\n
\n {deckEditMode[trueIndex] ?\n
\n initializeUnclick()}\n />\n setRenamedDeck(e.target.value)}\n onKeyPress={e => (e.keyCode || e.which === 13) && rename(deck.id, 'deck') /*check button*/}\n />\n
\n :\n
{deck.name} ({deck.size})
\n }\n
\n
\n })}\n {editEnabled && // Add a new deck \n
\n initializeUnclick()}\n />\n {\n if (collectionEditMode.pluses[c]) { // Deck adder is on\n add(collection.id, deckName, 'deck');\n } else { // Activate deck adder\n initializeUnclick();\n let pluses = [...collectionEditMode.pluses];\n pluses[c] = true;\n setCollectionEditMode({\n nameEdit: [...collectionEditMode.nameEdit],\n pluses: pluses\n });\n }\n }}\n />\n setDeckName(e.target.value)}\n onKeyPress={e => (e.keyCode || e.which === 13) && add(collection.id, deckName, 'deck')}\n />\n
\n }\n \n \n })}\n {editEnabled && chosenDeck.id === -1 && // Add a new collection\n
\n setCollectionName(e.target.value)}\n onKeyPress={e => (e.keyCode || e.which === 13) && add(null, collectionName, 'collection')}\n />\n setIsPublic(!isPublic)}\n />\n 0 ? {} : { display: 'none' }}\n onClick={() => add(null, collectionName, 'collection')}\n />\n
\n }\n -1 && props.parent !== \"Versus\") ? {} : { display: 'none' }}\n >\n {\n setChosenDeck({ id: -1 });\n setChosenCards([]);\n }}\n />\n \n {collections.other.length === 0 && props.parent === \"Classroom\" &&\n <>{accountType === \"teacher\" ? <>{titles[language].classroom_instructions} : <>{titles[language].classroom_instructions_student}} \n }\n \n }\n {(props.parent === \"Home\" || props.parent === \"Classroom\") && // Children components below\n \n }\n {(((props.parent === \"Home\" || props.parent === \"Classroom\" || props.parent === \"Versus\") && chosenDeck.id > -1) || (props.parent !== \"Home\" && props.parent !== \"Classroom\" && props.parent !== \"Versus\")) &&\n \n }\n {((chosenDeck.id > -1 && flashcards.length > 0 && manageFlashcards) || props.parent === \"Search\" || props.parent === \"VerbAnalyzer\") &&\n \n }\n {objectToDelete.id !== -1 && // If a deck or collection is chosen to be deleted\n \n }\n {collectionForClass.id > -1 && // If a collection is going to be added to a classroom\n \n }\n \n );\n}\n\nexport default DeckSelection;","import React, { useState, useEffect } from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faArrowCircleLeft } from '@fortawesome/free-solid-svg-icons';\nimport DeckSelection from './DeckSelection';\nimport titles from '../data/titles.json';\nimport { useSession } from './SessionContext';\n\nimport './styles/Explore.scss';\n\nconst Explore = (props) => {\n const [users, setUsers] = useState([]);\n const { language } = useSession();\n\n useEffect(() => {\n (async () => {\n const response = await fetch('/api/getUsers');\n const usersData = await response.json();\n setUsers(usersData.users);\n })();\n }, []);\n\n return (\n <>\n
\n
\n {props.chosenUserID > -1 &&\n props.setChosenUserID(-1)}\n />\n }\n

{titles[language].explore}

\n
\n {props.chosenUserID === -1 &&\n
    \n {\n users.map((user, u) =>\n
  • props.setChosenUserID(user.id)}\n >\n {user.username}\n Collections: {user.numberOfCollections}\n Decks: {user.numberOfDecks}\n
  • \n )\n }\n
\n }\n
\n {props.chosenUserID > -1 &&\n \n }\n\n \n );\n}\n\nexport default Explore;","import React, { useState } from 'react';\n// import { Link } from 'react-router-dom';\n//import QuickQuiz from './QuickQuiz';\nimport Explore from './Explore';\nimport DeckSelection from './DeckSelection';\nimport './styles/Home.scss';\nimport titles from '../data/titles.json';\nimport { useSession } from './SessionContext';\n\nconst Home = () => {\n\tconst [chosenUserID, setChosenUserID] = useState(-1); // -1 defaults to you\n\tconst [isExploring, setIsExploring] = useState(false);\n\n\tconst { language, username } = useSession();\n\n\treturn (\n\t\t<>\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t {\n\t\t\t\t\t\t\tsetIsExploring(false);\n\t\t\t\t\t\t\tsetChosenUserID(-1);\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{username}\n\t\t\t\t\t\n\t\t\t\t\t setIsExploring(true)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{titles[language].explore}\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\t{isExploring ?\n\t\t\t\t\t\n\t\t\t\t\t:\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t
\n\t\t\n\t);\n}\n\nexport default Home;","import React, { useEffect, useState } from 'react';\nimport './styles/Results.scss';\nimport FlashcardForms from './util/FlashcardForms';\n// import './styles/FlashcardForms.scss';\nimport { Link } from 'react-router-dom';\nimport titles from '../data/titles.json';\nimport { useSession } from './SessionContext';\n//import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\n\nconst Results = (props) => {\n\tlet parentProps;\n\n\tif (props.location) parentProps = props.location;\n\telse parentProps = props;\n\n\tconst { quizType, points, correct, chosenDeck, class_id, parent } = parentProps;\n\tconst [history, setHistory] = useState(props.previousAttempt ? [] : parentProps.history);\n\n\tconst { language } = useSession();\n\n\tlet deckSize = props.previousAttempt ? props.deck_size : history?.length;\n\n\tuseEffect(() => {\n\t\tif (parent === \"Classroom\") addRecord();\n\t\tif (props.previousAttempt) getRecord();\n\t}, []);\n\n\tasync function addRecord() {\n\t\tconst requestOptions = {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t\tbody: JSON.stringify({\n\t\t\t\tpoints: points,\n\t\t\t\tscore: correct,\n\t\t\t\tdeck_size: history.length,\n\t\t\t\ttime: 1,\n\t\t\t\tdeck_id: chosenDeck.id,\n\t\t\t\tclass_id: class_id,\n\t\t\t\tquiz_type: quizType,\n\t\t\t\tattempts: parentProps.history\n\t\t\t}),\n\t\t}\n\n\t\tconst response = await fetch(\"/api/addRecord\", requestOptions)\n\t\tif (!response.ok) return\n\t}\n\n\tasync function getRecord() {\n\t\tconst requestOptions = {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t\tbody: JSON.stringify({ class_history_id: props.class_history_id })\n\t\t}\n\n\t\tconst response = await fetch(\"/api/getRecord\", requestOptions)\n\t\tif (!response.ok) return\n\t\tconst data = await response.json();\n\n\t\tsetHistory(data.history)\n\t\tconsole.log(data.history)\n\t}\n\n\treturn (\n\t\t
\n\t\t\t

{titles[language].results}

\n\t\t\t

\n\t\t\t\t{correct}/{deckSize} ~ {points}pts\n\t\t\t

\n\t\t\t{props.previousAttempt &&\n\t\t\t\t
\n\t\t\t\t\t
{props.username}
-\n\t\t\t\t\t
{props.deckName}
-\n\t\t\t\t\t
{titles[language].attempt} {props.attemptNumber}
\n\t\t\t\t
\n\t\t\t}\n\n\t\t\t
    \n\t\t\t\t{history?.map((flashcard, f) =>\n\t\t\t\t\t
  • \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t
  • \n\t\t\t\t)}\n\t\t\t
\n\t\t\t{props.previousAttempt ?\n\t\t\t\t\n\t\t\t\t:\n\t\t\t\t<>\n\t\t\t\t\t{parent === \"Classroom\" ?\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t:\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\n\n\t\t
\n\t);\n}\n\nexport default Results;","import React, { useState, useEffect } from \"react\"\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\"\nimport { faArrowCircleLeft, faUsers, faCog, faBook, faCheck, faSignOutAlt, faLongArrowAltRight } from \"@fortawesome/free-solid-svg-icons\"\nimport DeckSelection from \"./DeckSelection\"\nimport ClassroomGird from \"./ClassroomGrid\"\n// import FlashcardGrid from './FlashcardGrid';\nimport FlashcardForms from './util/FlashcardForms'\nimport Results from './Results'\nimport ConfirmDelete from \"./util/ConfirmDelete\"\nimport \"./styles/Classroom.scss\"\nimport titles from '../data/titles.json';\nimport { useSession } from './SessionContext';\n\nconst Classroom = (props) => {\n\n const { language, accountType } = useSession();\n\n const [chosenClassroom, setChosenClassroom] = useState(props.location.chosenClassroom ? props.location.chosenClassroom : {})\n const [chosenUserID, setChosenUserID] = useState(-1) // -1 defaults to you\n const [memberData, setMemberData] = useState([])\n const [tab, setTab] = useState(\"collections\");\n const [renameClassroom, setRenameClassroom] = useState(\"\");\n\n // Used in members chart\n const [classCollections, setClassCollections] = useState([]);\n const [classDecks, setClassDecks] = useState([]);\n\n const [chosenCollectionOption, setChosenCollectionOption] = useState(0);\n const [chosenDeckID, setChosenDeckID] = useState(-1);\n const [chosenQuizType, setChosenQuizType] = useState(\"conjugate\");\n\n const [showConfirmDelete, setShowConfirmDelete] = useState(false);\n\n const [maxAttempts, setMaxAttempts] = useState(0);\n\n const [attemptToView, setAttemptToView] = useState({});\n const [overallStats, setOverallStats] = useState({ averageScore: 0, lowestScore: 0, highestScore: 0 });\n\n const [statFilter, setStatFilter] = useState(-1);\n\n const [flashcards, setFlashcards] = useState([]);\n\n\n useEffect(() => { // Update the view for member stats\n if (tab !== \"collections\") getClassroomMembers()\n }, [chosenDeckID, chosenQuizType])\n\n useEffect(() => {\n if (tab !== \"collections\") findFirstDeckID(classCollections, classDecks)\n }, [chosenCollectionOption])\n\n useEffect(() => { // Once data is recieved, generate stats\n if (memberData.length > 0) generateOverallStats()\n }, [statFilter])\n\n function recieveCollections(collections, decks) { // Recieve class collections/decks from child\n setClassCollections(collections);\n setClassDecks(decks);\n findFirstDeckID(collections, decks);\n }\n\n function findFirstDeckID(collections, decks) { // Set the deck id to the first deck in the collection\n for (let i = 0; i < decks.length; i++) {\n if (decks[i].collection_id === collections[chosenCollectionOption].id) {\n setChosenDeckID(decks[i].id);\n return;\n }\n }\n }\n\n async function getClassroomMembers() { // rename??\n const requestOptions = {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ class_id: chosenClassroom.id, deck_id: chosenDeckID, quiz_type: chosenQuizType }),\n }\n\n const response = await fetch(\"/api/getClassroomMembers\", requestOptions)\n if (!response.ok) return\n const data = await response.json()\n\n console.log(data)\n\n let attemptsLengths = []\n\n if (data.members[0].attempts !== undefined) { // Get every players number of attempts\n for (let m = 0; m < data.members.length; m++) attemptsLengths.push(data.members[m].attempts.length);\n }\n\n let newFlashcards = []; // Clone flashcards for easy manipulation\n\n // Store attributes of every verb\n for (let i = 0; i < data.flashcards.length; i++) {\n newFlashcards.push({\n tense: data.flashcards[i].tense_tag,\n mood: data.flashcards[i].mood_tag,\n person: data.flashcards[i].person_tag,\n number: data.flashcards[i].number_tag,\n infinitive: data.flashcards[i].root_tag,\n verb: data.flashcards[i].verb,\n id: data.flashcards[i].id,\n correct: data.flashcards[i].correct\n });\n }\n // console.log(data.members.length)\n\n setMaxAttempts(Math.max(...attemptsLengths))\n setMemberData(data.members)\n setFlashcards(newFlashcards);\n if (data.members.length > 0) generateOverallStats([...data.members])\n }\n\n function generateOverallStats(initialMemberData = []) {\n let attemptsToFilter = []\n let memberDataClone = initialMemberData.length > 0 ? [...initialMemberData] : [...memberData];\n\n for (let m = 0; m < memberDataClone.length; m++) {\n if (memberDataClone[m].attempts !== undefined) {\n if (statFilter < 0) {\n for (let a = 0; a < memberDataClone[m].attempts.length; a++) {\n attemptsToFilter.push(memberDataClone[m].attempts[a])\n }\n } else if (memberDataClone[m].attempts[statFilter] !== undefined) {\n attemptsToFilter.push(memberDataClone[m].attempts[statFilter])\n }\n }\n }\n\n if (attemptsToFilter.length === 0) {\n setOverallStats({ classAverage: 0, lowestScore: 0, highestScore: 0 });\n // setOverallStats({ classAverage: 0, lowestScore: { score: 0, deck_size: 1 }, highestScore: { score: 0, deck_size: 1 } });\n return;\n }\n\n let classAverage = attemptsToFilter.reduce(function (sum, value) {\n return sum + (value.score / value.deck_size);\n }, 0) / attemptsToFilter.length * 100;\n\n let lowestScore = attemptsToFilter.reduce(function (prev, curr) { return prev.score / prev.deck_size < curr.score / curr.deck_size ? prev : curr; });\n let highestScore = attemptsToFilter.reduce(function (prev, curr) { return prev.score / prev.deck_size > curr.score / curr.deck_size ? prev : curr; });\n\n setOverallStats({\n classAverage: classAverage.toFixed(2),\n lowestScore: (lowestScore.score / lowestScore.deck_size * 100).toFixed(2),\n highestScore: (highestScore.score / highestScore.deck_size * 100).toFixed(2)\n });\n }\n\n async function manipulateClassroom(func) {\n const requestOptions = {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ class_id: chosenClassroom.id, name: renameClassroom }),\n }\n\n const response = await fetch(func, requestOptions)\n if (!response.ok) return\n const data = await response.json()\n\n if (func === '/api/deleteClassroom' || func === '/api/leaveClassroom') {\n setChosenClassroom({});\n func === '/api/deleteClassroom' ?\n alert(`${chosenClassroom.name} deleted!`) :\n alert(`Left ${chosenClassroom.name}`);\n return;\n }\n else if (func === '/api/renameClassroom') {\n let chosenClassroomClone = chosenClassroom;\n chosenClassroomClone.name = renameClassroom;\n setChosenClassroom({ ...chosenClassroomClone });\n }\n }\n\n return (\n <>\n
\n
\n
\n {chosenClassroom.name !== undefined && (\n {\n setChosenClassroom({});\n setTab(\"collections\");\n sessionStorage.setItem('classroom', \"{}\");\n }}\n />\n )}\n <>\n {chosenClassroom.name !== undefined ? (\n <>\n

{chosenClassroom.name}

\n {titles[language].class_code}: {chosenClassroom.class_code}\n \n ) : (\n

{titles[language].classrooms}

\n )}\n \n
\n {chosenClassroom.name !== undefined && (\n
\n setTab(\"collections\")}\n />\n {accountType === \"teacher\" &&\n { getClassroomMembers(); setTab(\"members\"); }}\n />\n }\n { setRenameClassroom(\"\"); setTab(\"settings\"); }}\n />\n
\n )}\n
\n {chosenClassroom.id === undefined || JSON.parse(sessionStorage.classroom).id === undefined || props.parent === \"DeckSelection\" ? (\n \n ) : <>\n {tab !== \"collections\" &&\n
\n {tab === \"members\" &&\n <>\n {classCollections.length > 0 &&\n
\n { setStatFilter(-1); setChosenCollectionOption(e.target.value); }}\n >\n {classCollections.map((collection, c) =>\n \n )}\n \n { setStatFilter(-1); setChosenDeckID(e.target.value); }}\n >\n {classDecks.map((deck, d) => {\n if (deck.collection_id === classCollections[chosenCollectionOption].id) {\n return \n }\n })}\n \n { setStatFilter(-1); setChosenQuizType(e.target.value); }}\n >\n \n \n \n \n
\n }\n
\n \n \n \n \n {maxAttempts > 0 ?\n <>{[...Array(maxAttempts)].map((attempt, a) => )}\n :\n \n }\n \n \n \n {memberData.map((member, m) =>\n \n \n {maxAttempts > 0 ?\n <>\n {[...Array(maxAttempts)].map((ma, a) => {\n if (a < member.attempts.length) {\n let attempt = member.attempts[a]\n return \n }\n return \n })}\n \n :\n \n }\n \n )}\n \n
{titles[language].members}{titles[language].attempt} {a + 1}{titles[language].attempt} 1
\n
{member.username}
\n
setAttemptToView({ ...attempt, attemptNumber: a + 1, username: member.username })}\n >\n
{attempt.score}/{attempt.deck_size} ~ {attempt.points}pts
\n
{attempt.created}
\n
--
\n
\n {classCollections.length > 0 && maxAttempts > 0 &&\n
\n setStatFilter(e.target.value)}\n >\n \n {[...Array(maxAttempts)].map((ma, a) => )}\n \n \n \n \n \n
{titles[language].average}: {overallStats.classAverage}%{titles[language].lowest}: {overallStats.lowestScore}%{titles[language].highest}: {overallStats.highestScore}%
\n
\n }\n \n }\n {tab === \"settings\" &&\n
\n

Settings

\n {accountType === \"teacher\" ?\n
\n
\n setRenameClassroom(e.target.value)}\n onKeyPress={e => (e.keyCode || e.which === 13) && manipulateClassroom('/api/renameClassroom')}\n />\n manipulateClassroom('/api/renameClassroom')}\n >\n Confirm\n \n
\n
\n \n
\n
\n :\n
\n manipulateClassroom('/api/leaveClassroom')}\n title=\"Leave Classroom\"\n disabled={true}\n >\n {titles[language].unenroll} \n \n
\n }\n
\n }\n
\n }\n \n }\n
\n {chosenClassroom.id !== undefined && props.parent !== \"DeckSelection\" && tab === \"collections\" &&\n \n }\n\n {(flashcards.length > 0 && tab === \"members\") &&\n <>\n

{titles[language].least_correct} {titles[language].most_correct}

\n {/* */}\n
\n {flashcards.map((flashcard, f) => {\n return
\n {flashcard.correct} {titles[language].correct_attempts}\n
\n \n
\n
\n })}\n
\n \n }\n {showConfirmDelete &&\n \n }\n {attemptToView.deck_id &&\n
\n d.id === chosenDeckID).name}\n username={attemptToView.username}\n />\n
\n }\n \n )\n}\n\nexport default Classroom\n","import React, { useState } from 'react';\nimport DeckSelection from './DeckSelection';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faSearch } from '@fortawesome/free-solid-svg-icons'\nimport './styles/Search.scss';\nimport titles from '../data/titles.json';\nimport { useSession } from './SessionContext';\n\nfunction Analyze(props) {\n const [verb, setVerb] = useState('');\n const [flashcards, setFlashcards] = useState([]);\n\n const { language } = useSession();\n\n // Analyzes the verb, tense, person\n function analyzeVerb() {\n if (verb !== \"\") {\n const requestOptions = {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ verb: verb })\n };\n fetch('/api/getVerbAnalysis', requestOptions)\n .then(response => {\n if (!response.ok) {\n throw new Error('Network response was not ok');\n }\n return response.json();\n })\n .then(data => {\n let flashcardsClone = [];\n\n for (var i = 0; i < data.analysis.length; i++) {\n flashcardsClone.push({\n tense: data.analysis[i].tense_tag,\n mood: data.analysis[i].mood_tag,\n person: data.analysis[i].person_tag,\n number: data.analysis[i].number_tag,\n infinitive: data.analysis[i].root_tag,\n verb: data.analysis[i].verb,\n id: data.analysis[i].id\n });\n }\n // Update the current analysis\n setFlashcards(flashcardsClone);\n //console.log(data)\n })\n .catch(error => console.error(\"Fetch operation failed.\", error));\n } else {\n alert(\"Fill in the verb\");\n }\n }\n\n return (\n
\n
\n
\n {titles[language].verb_analyzer_instructions}\n
\n
\n setVerb(e.target.value)}\n onKeyPress={event => (event.keyCode || event.which === 13) && analyzeVerb()}\n />\n analyzeVerb()}\n />\n
\n
\n
\n {flashcards.length > 0 &&\n \n }\n
\n
\n );\n}\n\nexport default Analyze;","import React, { useState } from 'react';\nimport DeckSelection from './DeckSelection';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faSearch } from '@fortawesome/free-solid-svg-icons'\nimport './styles/Search.scss';\nimport titles from '../data/titles.json';\nimport linguisticInfo from '../data/linguisticInfo.json';\nimport { useSession } from './SessionContext';\n\nfunction VerbSearch(props) {\n const { language } = useSession();\n\n const [verb, setVerb] = useState('');\n const [flashcards, setFlashcards] = useState([]);\n const [selectedForms, setSelectedForms] = useState({\n tense: Array(linguisticInfo.tense.length).fill(\"unchecked\"),\n mood: Array(linguisticInfo.mood.length).fill(\"unchecked\"),\n person: Array(linguisticInfo.person.length).fill(\"unchecked\"),\n number: Array(linguisticInfo.number.length).fill(\"unchecked\")\n });\n\n // React.useEffect(() => { // use this to view irregular verbs, list can be found in data directory\n // (async () => {\n // const response = await fetch(\"/api/getIrregularVerbs\")\n // const data = await response.json();\n // // print all the root_verbs\n // for (let i = 0; i < data.analysis.length; i++) {\n // console.log(data.analysis[i].root_tag);\n // }\n // })();\n // }, []);\n\n function searchVerbWithFilters() {\n let tags = { tense: [], mood: [], person: [], number: [] }; // Store what the user checked and inputted\n\n // Loop through tense, mood, person, number\n [\"tense\", \"mood\", \"person\", \"number\"].forEach((attribute) => {\n // Loop through attributes of the lingiustic attributes\n linguisticInfo[attribute].forEach((form, f) => {\n // If the checkbox is checked append tag info\n if (selectedForms[attribute][f] === \"checked\") tags[attribute].push(form[\"tag_name\"]);\n });\n });\n\n console.log(tags)\n\n const requestOptions = { // Fetch flashcard data\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ verb: verb, tags: tags })\n };\n fetch('/api/verbSearch', requestOptions)\n .then(response => response.json())\n .then(data => {\n let flashcardsClone = []; // Empty flashcards\n\n for (let i = 0; i < data.analysis.length; i++) { // Loop through all the generated verbs\n flashcardsClone.push({ // Store attributes of current verb form\n tense: data.analysis[i].tense_tag,\n mood: data.analysis[i].mood_tag,\n person: data.analysis[i].person_tag,\n number: data.analysis[i].number_tag,\n infinitive: data.analysis[i].root_tag,\n verb: data.analysis[i].verb,\n id: data.analysis[i].id\n });\n }\n\n setFlashcards(flashcardsClone); // Update what flashcards to display\n\n console.log(flashcards);\n });\n }\n\n // Changes the state of checked and unchecked boxes\n function handleCheckChange(attributes, a) {\n let selectedFormsClone = { ...selectedForms } // Clone selectedForms for manipulation\n\n if (selectedFormsClone[attributes][a] === \"unchecked\") selectedFormsClone[attributes][a] = \"checked\";\n else selectedFormsClone[attributes][a] = \"unchecked\";\n\n setSelectedForms(selectedFormsClone)\n // console.log(selectedForms)\n }\n\n return (\n
\n
\n
\n {[\"tense\", \"mood\", \"person\", \"number\"].map((attribute, a) => // Loop through every linguistic attribute in this order\n
    \n
  • {titles[language][attribute]}

  • \n {linguisticInfo[attribute].map((form, f) => // Loop through the labels for every linguistic attribute\n
  • \n handleCheckChange(attribute, f)}\n >\n {form[\"tag_it\"]}\n
\n \n )}\n \n )}\n
\n
\n setVerb(e.target.value)}\n onKeyPress={event => {\n if (event.keyCode || event.which === 13) {\n event.preventDefault();\n searchVerbWithFilters()\n }\n }}\n />\n searchVerbWithFilters()}\n />\n
\n
\n Enter an infinitive verb. You can search multiple verbs at once by separating them with a comma , or semicolon ;\n
\n
\n \n \n )\n}\n\nexport default VerbSearch;","import React, { useEffect, useState } from 'react'\nimport FlashcardForms from './FlashcardForms';\nimport Label from './Label';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faArrowCircleLeft, faArrowCircleRight } from '@fortawesome/free-solid-svg-icons';\n\nfunction Explanation(props) {\n const [explanation, setExplanation] = useState({});\n const [explainPage, setExplainPage] = useState(0);\n\n useEffect(() => {\n getExplanation();\n }, [])\n\n function getExplanation() {\n const requestOptions = {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n wrongAnswer: props.wrongAnswer,\n quizType: props.quizType === \"mixture\" ? props.randomType : props.quizType, // CHOOSE ONE VERSION OF THIS CONDITIONAL (flashcard forms conditional)\n infinitive: props.flashcards[props.questionNumber].infinitive\n })\n };\n fetch('/api/getExplanation', requestOptions)\n .then(response => response.json())\n .then(data => {\n console.log(data);\n\n let explanationClone = { tense: [], mood: [], person: [], number: [], infinitive: [], verb: [], id: [] };\n\n // Loop through all the generated verbs\n for (let i = 0; i < data.explanation.length; i++) {\n // Store attributes of current verb form\n explanationClone.tense[i] = data.explanation[i].tense_tag;\n explanationClone.mood[i] = data.explanation[i].mood_tag;\n explanationClone.person[i] = data.explanation[i].person_tag;\n explanationClone.number[i] = data.explanation[i].number_tag;\n explanationClone.infinitive[i] = data.explanation[i].root_tag;\n explanationClone.verb[i] = data.explanation[i].verb;\n explanationClone.id[i] = data.explanation[i].id;\n }\n\n setExplanation(explanationClone);\n }\n );\n }\n\n // Navigates the explanation gallery\n function navExplainGallery(movement) {\n if ((explainPage + movement) < explanation.id.length &&\n (explainPage + movement) > -1) {\n setExplainPage(explainPage + movement);\n }\n }\n\n var explanationGallery = [];\n\n // Generates the explanation gallery\n if (explanation.id) {\n for (let i = 0; i < explanation.id.length; i++) {\n explanationGallery.push(\n
\n
\n
\n \n
\n
\n
\n );\n }\n }\n\n return (\n
\n {((props.quizType === \"conjugate\") || (props.randomType === \"conjugate\")) &&\n
\n {explanation?.verb?.length === 0 ?\n
{props.wrongAnswer} is not a verb form or is spelled wrong.
\n :\n
\n {props.wrongAnswer} can be:\n
{explanationGallery[explainPage]}\n
\n }\n
\n }\n {((props.quizType === \"identify_tense\") || (props.randomType === \"identify_tense\")) &&\n
\n {props.flashcards[props.questionNumber].infinitive} in can be:\n
{explanationGallery[explainPage]}\n
\n }\n {explanationGallery.length > 0 &&\n
\n navExplainGallery(-1)}\n />\n {explainPage + 1} / {explanationGallery.length}\n navExplainGallery(1)}\n />\n
\n }\n\n
\n )\n}\n\nexport default Explanation","import React from 'react';\nimport { Link } from \"react-router-dom\";\nimport Label from './util/Label';\nimport Explanation from './util/Explanation';\nimport FlashcardForms from './util/FlashcardForms';\nimport './styles/Quiz.scss';\nimport './styles/FlashcardForms.scss';\nimport titles from '../data/titles.json';\nimport linguisticInfo from '../data/linguisticInfo.json';\n// import { useSession } from './SessionContext';\n\n// Alert message if leaving, say that progress won't be saved\nclass Quiz extends React.Component {\n\tconstructor(props) {\n\t\tsuper(props);\n\n\t\tthis.state = {\n\t\t\tcorrect: 0,\n\t\t\tincorrect: 0,\n\t\t\tpoints: 0,\n\n\t\t\trandomType: \"\",\n\t\t\tanswered: null,\n\t\t\tshowChoices: false,\n\t\t\tquestionNumber: -1,\n\t\t\twrongAnswer: \"\",\n\n\t\t\thistory: [],\n\n\t\t\tresult: null,\n\t\t\tchoices: [],\n\t\t\tchosenStatus: [],\n\t\t\tchoice: \"\",\n\t\t};\n\t\tthis.processResult = this.processResult.bind(this);\n\t\tthis.nextQuestion = this.nextQuestion.bind(this);\n\t\tthis.getFlashcardFromDeck = this.getFlashcardFromDeck.bind(this);\n\t\tthis.getRandomFlashcard = this.getRandomFlashcard.bind(this);\n\t\tthis.mixMultipleChoice = this.mixMultipleChoice.bind(this);\n\t\tthis.saveChoice = this.saveChoice.bind(this);\n\t\tthis.setChoice = this.setChoice.bind(this);\n\t\tthis.setAnswered = this.setAnswered.bind(this);\n\t\tthis.getQuestionType = this.getQuestionType.bind(this);\n\t}\n\n\tasync componentDidMount() {\n\t\tif (this.props.location.chosenDeck) { // If there is data to make a quiz with\n\t\t\tconst { flashcards, quizType } = this.props.location;\n\n\t\t\t// console.log(flashcards);\n\t\t\tthis.setState({\n\t\t\t\thistory: Array(flashcards.length).fill({\n\t\t\t\t\tcorrect: 0, attempt: \"unattempted\", id: -1, quiz_type: quizType\n\t\t\t\t})\n\t\t\t});\n\t\t\tthis.nextQuestion();\n\t\t} else {\n\t\t\twindow.location.replace(\"/home\"); // Redirects to homepage on reload\n\t\t\talert(\"Your quiz progress has not been saved.\");\n\t\t}\n\t}\n\n\t// Mix up multiple choice order\n\tmixMultipleChoice(choices) {\n\t\tfor (let j = choices.length - 1; j > 0; j--) {\n\t\t\tconst k = Math.floor(Math.random() * (j + 1));\n\t\t\t[choices[j], choices[k]] = [choices[k], choices[j]];\n\t\t}\n\t\treturn choices;\n\t}\n\n\tgetRandomFlashcard() {\n\t\tconst requestOptions = {\n\t\t\tmethod: 'POST',\n\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t\tbody: JSON.stringify({\n\t\t\t\tform: this.props.location.tagForm\n\t\t\t})\n\t\t};\n\t\tfetch('/getQuestion', requestOptions)\n\t\t\t.then(response => response.json())\n\t\t\t.then(data => {\n\t\t\t\tconsole.log(data);\n\n\t\t\t\tlet choicesClone = this.mixMultipleChoice([data.choices[0].verb, data.choices[1].verb, data.choices[2].verb]);\n\n\t\t\t\tthis.setState({\n\t\t\t\t\ttense: data.answer.tense_tag,\n\t\t\t\t\tinfinitive: data.answer.root_tag,\n\t\t\t\t\tconjuagtedVerb: data.answer.verb,\n\t\t\t\t\tchoices: choicesClone,\n\t\t\t\t});\n\t\t\t});\n\t}\n\n\tgetFlashcardFromDeck() {\n\t\tconst { chosenDeck, flashcards, quizType } = this.props.location;\n\t\tconst { questionNumber, randomType } = this.state;\n\n\t\t// console.log(questionNumber);\n\n\t\t/* If this quiz needs a tense value and the verb in question doesn't have one, skip the question\n\t\tif (flashcards.tense[i] === null) {\n\t\t\tthis.setState({i: i + 1}); AWAIT\n\t\t}*/\n\n\t\t// If the deck hasn't been gone through yet\n\t\tif (questionNumber < flashcards.length) {\n\t\t\t// If the question is asking to conjugate the verb\n\t\t\tif ((quizType === \"conjugate\") || (randomType === \"conjugate\")) {\n\t\t\t\tlet choicesClone = []\n\n\t\t\t\tconst requestOptions = {\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t\t\t\tbody: JSON.stringify({\n\t\t\t\t\t\tinfinitive: flashcards[questionNumber].infinitive\n\t\t\t\t\t})\n\t\t\t\t};\n\t\t\t\tfetch('/api/getWrongChoices', requestOptions)\n\t\t\t\t\t.then(response => response.json())\n\t\t\t\t\t.then(data => {\n\t\t\t\t\t\t// console.log(data);\n\n\t\t\t\t\t\tchoicesClone = this.mixMultipleChoice([data.choices[0].verb, data.choices[1].verb, flashcards[questionNumber].verb]);\n\n\t\t\t\t\t\tthis.setState({ choices: choicesClone });\n\n\t\t\t\t\t\t//console.log(\"ANSWER: \", flashcards[questionNumber].verb);\n\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t} // If question is asking for the tense of a conjugated verb\n\t\t\telse if ((quizType === \"identify_tense\") || (randomType === \"identify_tense\")) {\n\t\t\t\tlet choicesClone = [];\n\t\t\t\tlet randomTenseIndex;\n\n\t\t\t\tchoicesClone.push(flashcards[questionNumber].tense);\n\n\t\t\t\t// Get wrong answers\n\t\t\t\twhile (choicesClone.length !== 3) {\n\t\t\t\t\trandomTenseIndex = Math.floor(Math.random() * Math.floor(linguisticInfo.tense.length));\n\t\t\t\t\tchoicesClone.push(linguisticInfo.tense[randomTenseIndex].tag_name);\n\t\t\t\t\tchoicesClone = [...new Set(choicesClone)]; // Remove duplicate values\n\t\t\t\t}\n\n\t\t\t\tchoicesClone = this.mixMultipleChoice(choicesClone); // Mix up the values\n\t\t\t\t// console.log(choicesClone);\n\n\t\t\t\tthis.setState({\n\t\t\t\t\tchoices: choicesClone,\n\t\t\t\t\tshowChoices: true\n\t\t\t\t});\n\n\t\t\t\t//console.log(\"ANSWER: \", flashcards[questionNumber].tense);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Process data from the child that describes if the user got the answer right\n\tprocessResult(result, wrongAnswer) { // change wrongAnswer variable name to potentialAnswer (seperate from state version)\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst { flashcards, quizType } = this.props.location;\n\t\t\tconst { questionNumber, randomType } = this.state;\n\n\t\t\tlet chosenStatusClone = this.state.chosenStatus;\n\t\t\tlet currentHistory = [...this.state.history];\n\n\t\t\t// add quiztype to history\n\t\t\tif (result === true) {\n\t\t\t\tlet rewardedPoints = 100;\n\n\t\t\t\tchosenStatusClone[chosenStatusClone.findIndex((status) => status === \"checked\")] = \"correct\";\n\n\t\t\t\tcurrentHistory[questionNumber] = {\n\t\t\t\t\tcorrect: 1,\n\t\t\t\t\tattempt: wrongAnswer,\n\t\t\t\t\tquiz_type: quizType === \"mixture\" ? randomType : quizType,\n\t\t\t\t\t...flashcards[questionNumber]\n\t\t\t\t};\n\n\t\t\t\tif (quizType === \"mixture\") currentHistory[questionNumber]['quizType'] = this.state.randomType;\n\n\t\t\t\tif ((quizType === \"conjugate\" || this.state.randomType === \"conjugate\") && this.state.showChoices) rewardedPoints = 50;\n\n\t\t\t\tthis.setState({\n\t\t\t\t\twrongAnswer: \"\",\n\t\t\t\t\tcorrect: this.state.correct + 1,\n\t\t\t\t\tpoints: this.state.points + rewardedPoints,\n\t\t\t\t\tchosenStatus: chosenStatusClone,\n\t\t\t\t\thistory: [...currentHistory]\n\t\t\t\t});\n\n\t\t\t\tresolve(currentHistory);\n\t\t\t} else if (result === false) {\n\t\t\t\tlet answer;\n\n\t\t\t\tcurrentHistory[questionNumber] = {\n\t\t\t\t\tcorrect: 0,\n\t\t\t\t\tattempt: wrongAnswer.length > 0 ? wrongAnswer : \"skipped\",\n\t\t\t\t\tquiz_type: quizType === \"mixture\" ? randomType : quizType,\n\t\t\t\t\t...flashcards[questionNumber]\n\t\t\t\t};\n\n\t\t\t\tif (quizType === \"mixture\") currentHistory[questionNumber]['quizType'] = this.state.randomType;\n\n\t\t\t\tif ((quizType === \"conjugate\") || (this.state.randomType === \"conjugate\")) {\n\t\t\t\t\tanswer = flashcards[questionNumber].verb;\n\t\t\t\t}\n\n\t\t\t\telse if ((quizType === \"identify_tense\") || (this.state.randomType === \"identify_tense\")) {\n\t\t\t\t\tanswer = flashcards[questionNumber].tense;\n\t\t\t\t}\n\n\t\t\t\tfor (var i = 0; i < chosenStatusClone.length; i++) {\n\t\t\t\t\tif ((chosenStatusClone[i] === \"unchecked\") && (this.state.choices[i] === answer)) {\n\t\t\t\t\t\tchosenStatusClone[i] = \"correct\";\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tchosenStatusClone[chosenStatusClone.findIndex((status) => status === \"checked\")] = \"incorrect\";\n\t\t\t\tthis.setState({\n\t\t\t\t\twrongAnswer: wrongAnswer,\n\t\t\t\t\tincorrect: this.state.incorrect + 1,\n\t\t\t\t\tchosenStatus: chosenStatusClone,\n\t\t\t\t\thistory: [...currentHistory]\n\t\t\t\t});\n\t\t\t\tresolve(currentHistory);\n\t\t\t}\n\t\t})\n\t}\n\n\t// Saves what the user chose from the multiple-choices\n\tsaveChoice(c) {\n\t\tlet chosenStatusClone = [\"unchecked\", \"unchecked\", \"unchecked\"];\n\t\tchosenStatusClone[c] = \"checked\";\n\n\t\tthis.setState({\n\t\t\tchosenStatus: chosenStatusClone,\n\t\t\tchoice: this.state.choices[c]\n\t\t});\n\n\t\tconsole.log(this.state.choices[c])\n\t}\n\n\tsetChoice(newChoice) { this.setState({ choice: newChoice }) }\n\tsetAnswered(isAnswered) { this.setState({ answered: isAnswered }) }\n\n\tgetQuestionType() { // For mixture\n\t\tconst flashcard = this.props.location.flashcards[this.state.questionNumber + 1];\n\t\tlet questionType = \"\";\n\n\t\tquestionType = Math.floor(Math.random() * 2) === 0 ? \"conjugate\" : \"identify_tense\";\n\n\t\t// if (flashcard.mood !== \"Indicative\" &&\n\t\t// \tflashcard.mood !== \"Subjunctive\" &&\n\t\t// \tflashcard.mood !== \"Conditional\" &&\n\t\t// \tflashcard.mood !== \"Imperative\") {\n\t\t// \tquestionType = \"identify_tense\";\n\t\t// } else {\n\t\t// \tquestionType = \"conjugate\";\n\t\t// }\n\n\t\treturn questionType;\n\t}\n\n\t// Goes to the next question in the quiz\n\tnextQuestion() {\n\t\tconst { quizType } = this.props.location;\n\n\t\t// console.log(this.state.history)\n\n\t\tthis.setState({\n\t\t\tchoice: \"\",\n\t\t\texplainPage: 0,\n\t\t\twrongAnswer: \"\",\n\t\t\tshowChoices: quizType === \"conjugate\" ? false : true,\n\t\t\tanswered: false,\n\t\t\tquestionNumber: this.state.questionNumber + 1,\n\t\t\tchosenStatus: [\"unchecked\", \"unchecked\", \"unchecked\"],\n\t\t\trandomType: quizType === \"mixture\" ? this.getQuestionType() : \"none\"\n\t\t}, () => {\n\t\t\tthis.getFlashcardFromDeck();\n\t\t\tif (quizType === \"mixture\") {\n\t\t\t\tthis.setState({\n\t\t\t\t\tshowChoices: this.state.randomType === \"conjugate\" ? false : true\n\t\t\t\t})\n\t\t\t}\n\t\t});\n\t}\n\n\trender() {\n\t\tconst { quizType, tagForm, chosenDeck, flashcards, language, chosenClassroom } = this.props.location;\n\t\tconst { questionNumber, answered, history, points, randomType, choices, choice, showChoices } = this.state;\n\n\t\tlet resultData = {\n\t\t\tpathname: \"/results\",\n\t\t\tchosenClassroom: chosenClassroom,\n\t\t\thistory: history,\n\t\t\tflashcards: flashcards,\n\t\t\tquizType: quizType,\n\t\t\tchosenDeck: chosenDeck,\n\t\t\tclass_id: this.props.location.class_id,\n\t\t\tparent: this.props.location.parent,\n\t\t\tcorrect: this.state.correct,\n\t\t\tpoints: points\n\t\t}\n\n\t\treturn (\n\t\t\t
\n\t\t\t\t{chosenDeck !== undefined && questionNumber > -1 &&\n\t\t\t\t\t<>\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t

{tagForm}{chosenDeck.name}

\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t
{questionNumber + 1} / {flashcards.length}
\n\t\t\t\t\t\t\t\t\t
{titles[language].score}: {points}
\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t{((quizType === \"conjugate\" || randomType === \"conjugate\") && !showChoices) ?\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t:\n\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t{this.state.wrongAnswer.length > 0 &&\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t{showChoices &&\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\t{choices.map((choice_, c) =>\n\t\t\t\t\t\t\t\t\t\t\t
  • !answered && this.saveChoice(c)}>\n\t\t\t\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\t\t\t\t{(quizType === \"conjugate\" || randomType === \"conjugate\") && `${choice_}`}\n\t\t\t\t\t\t\t\t\t\t\t\t\t{(quizType === \"identify_tense\" || randomType === \"identify_tense\") &&
    \n\t\t\t\t\t\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t{(quizType === \"identify_tense\" || randomType === \"identify_tense\") && choice.length > 0 && !answered &&\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t{(quizType === \"conjugate\" || randomType === \"conjugate\") && !answered &&\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t{answered && questionNumber < flashcards.length - 1 &&\n\t\t\t\t\t\t\t\t\t this.nextQuestion()}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{titles[language].next}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t{history[history.length - 1].id !== -1 && answered && questionNumber === flashcards.length - 1 &&\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t
\n\t\t);\n\t}\n}\n\nexport default Quiz;","import React from 'react';\nimport './styles/Linguistics.scss';\n\nfunction Linguistics() {\n return (\n // Please reconsider the styling of this page, I was just playing around with it\n
\n
\n

Tense

\n

Tense is a grammatical means to indicate the time when an action or event occurs. As such, tense expresses whether an action or event happened in the past (past tense), will happen in the future (future tense) or is happening right now (present tense).

\n

The Italian language comprises the following tenses:

\n
    \n
  • Presente (Present Tense)

  • \n
  • Passato Prossimo (Present Perfect)

  • \n
  • Imperfetto (Imperfect)

  • \n
  • Futuro Semplice (Simple Future)

  • \n
  • Futuro Anteriore (Future Perfect Tense)

  • \n
  • Trapassato Prossimo (Past Perfect)

  • \n
  • Passato Remoto (Historic Past)

  • \n
  • Trapassato Remoto (Historic Past Perfect)

  • \n
\n

Mood

\n

Mood is a grammatical means that allows speakers to express their attitude towards their utterance (e.g., a statement of fact, of desire, of command, etc.). Italian has 7 verbal moods (modi in italiano):

\n
    \n
  • Modo indicative (Indicative)

  • \n
\n

The Indicative mood is used to make factual and declarative statements or ask questions. Using the indicative mood expresses ones believe of the statement as being unequivocally true, e.g.,
\n la palla è rotonda (the ball is round). The Indicative is composed with all Italian tenses, allowing one to talk about the present, past and future.

\n
    \n
  • Modo Condizionale (Conditional)

  • \n
\n

The Conditional is used to express the possibility of something happening or a hypothetical. It may be used to express desires, doubts or requests. In Italian, the Conditional can be in present and past tense:

\n
\n
    \n
  • Condizionale Presente

  • \n
\n
\n

The Condizionale Presente expresses potential or possible actions, desires, doubts, requests and suggestions.

\n
\n
    \n
  • Condizionale Passato

  • \n
\n
\n

The Condizionale Passato corresponds in its functionality to the Condizionale Presente, with the difference of referring to desires, doubts, etc. in the past. Additionally, it may be used to express impossible actions, unofficial news , and hypothetical phrases.

\n
\n
\n

For more information and examples, see here: https://italianonline.org/learn/italian-grammar/italian-conditional-mode/

\n
    \n
  • Modo Congiuntivo (Subjunctive)

  • \n
\n

The Congiuntivo is used when a main clause expressing hopes, opinions, wishes or doubts is combined with a subordinate clause, e.g.,
\n Penso che tu abbia ragione - I think that you are right.

\n

The conjunction che (that) signals the following subordinate clause. Since the main clause expresses an opinion (I think), the verb in the subordinate clause is marked in the congiuntivo.

\n

In general, subjective or personal statements are expressed with the congiuntivo. The Italian language has four subjunctive tenses:

\n
    \n
  • Congiuntivo Presente (Present Subjunctive)

  • \n
  • Congiuntivo Passato (Past Subjunctive)

  • \n
  • Congiuntivo Imperfetto (Imperfect Subjunctive)

  • \n
  • Congiuntivo Trapassato (Past Perfect Subjunctive)

  • \n
\n

For more details and examples, see here: https://italianonline.org/learn/italian-grammar/italian-subjunctive-mode/

\n
    \n
  • Modo Imperativo (Imperative)

  • \n
\n

The imperative is used when expressing an order or command to someone, and thus, it does not have the first an third singular persons (io, lui, lei):

\n

Guarda! - Look!

\n

Leggete qua! - Read here (you all)!

\n

More: https://italianonline.org/learn/italian-grammar/italian-imperative-mode/

\n
    \n
  • Modo Gerundio (Gerund)

  • \n
\n

The gerund expresses the time, cause or condition of an action that is happening either at the same time as the action expressed by the main verb or before that, e.g.:

\n

Parlando con il professore ho capito di aver sbagliato - While speaking with the professor I realized that I had made a mistake.

\n

Ieri, avendo parlato di cibo, mi sono messo a cucinare - Yesterday, having spoken of food, I started cooking.

\n

The gerund has a present (gerundio presente, example sentence 1) and a past form (gerundio passato, example sentence 2).

\n

More information: https://italianonline.org/learn/italian-grammar/italian-gerund-mode/

\n
    \n
  • Modo Participio (Participle)

  • \n
\n

The participle, in contrast to the other Moods, is used to connect the noun or adjective with the action. It has a present and a past tense:

\n

Non ho mai visto un cane parlante - (I've never seen a talking dog)

\n

L'Italiano parlato è diverso da dello scritto - Spoken Italian is different from the written one.

\n

The Participio Passato (Past Participle) together with the auxiliary verbs essere and avere creates past tenses like the passato prossimo:

\n

Ho mangiato una pizza - I ate a pizza

\n

Sono andato al cinema - I went to the cinema

\n

Additionally, it can be used in a similar way as adjectives:

\n

La finestra aperta - the open window

\n

More information: https://italianonline.org/learn/italian-grammar/italian-participle-mode/

\n
    \n
  • Modo Infinito (Infinitive)

  • \n
\n

The infinitive expresses an action or state without any reference to a subject. It is not marked for person, number, or tense. Instead, it consists of the base of the verb and is usually the form listed in dictionaries. Italian infinitives either end on -are, -ere or -ire, forming three conjugation classes. E.g.:

\n

amare

\n

prendere

\n

finire

\n

Person

\n

The grammatical category person distinguishes between references to participants in an event. It distinguishes between the speaker of an utterance (first person), the addressee (second person), and others (third person). In other words, first person includes the speaker (Engl. I, we, me, and us), second person is the person or people spoken to (you), and third person includes all others (Engl. he, she it, they, them, etc.).

\n

Number

\n

Number expresses count distinctions (singular and plural) and with respect to verbs, number interacts with person. E.g., number is responsible for the distinction between first person I (singular) and we (plural).

\n

The interaction of these four categories (tense, mood, person and number) determine the form of verbs:

\n

Examples:

\n

Verb: amare, conjugated in:

\n
    \n
  • Tense = present

  • \n
  • Mood = indicative

  • \n
  • Person = 3

  • \n
  • Number = Pl

  • \n
\n

corresponds to amiamo.

\n

In most cases, changing the value of one category leads to a different verb form:

\n
    \n
  • Tense = present

  • \n
  • Mood = indicative

  • \n
  • Person = 3

  • \n
  • Number = Sg

  • \n
\n

corresponds to ama

\n\n
\n
\n )\n}\n\nexport default Linguistics;\n","import React from 'react';\n\nconst Feedback = () => {\n return (\n
\n \n Loading…\n \n
\n );\n}\n\nexport default Feedback;","import React from 'react';\nimport './styles/App.scss';\n\n\nclass Account extends React.Component {\n constructor() {\n super()\n this.state = {\n \n }\n }\n\n render() {\n return (\n
\n \n
\n )\n }\n}\n\nexport default Account;\n","import React from 'react';\nimport { Route, Redirect } from 'react-router-dom';\nimport { useSession } from '../SessionContext';\n\n// Checks if the user is logged in, if not the user is redirected to the login page\nconst PrivateRoute = (props) => {\n const { isLoggedIn } = useSession();\n\n return (\n (\n isLoggedIn ?\n :\n \n )}\n />\n );\n}\n\nexport default PrivateRoute;","import React from 'react';\nimport { Route, Switch, Redirect, BrowserRouter } from 'react-router-dom';\nimport Login from './auth/Login';\nimport Register from './auth/Register';\nimport Nav from './Nav';\nimport Home from './Home';\nimport Classroom from './Classroom';\nimport Analyze from './Analyze';\nimport Search from './Search';\nimport Quiz from './Quiz';\nimport Results from './Results';\nimport Linguistics from './Linguistics';\nimport Feedback from './Feedback';\nimport Account from './Account';\nimport PrivateRoute from './util/PrivateRoute';\nimport { SessionContextProvider } from './SessionContext';\nimport './styles/App.scss';\n\nexport default function App() {\n return (\n \n \n