import React, { Component } from 'react'; import { ArrowDropDownRounded as ArrowDropDownRoundedIcon, HistoryRounded as HistoryRoundedIcon, HomeRounded as HomeRoundedIcon } from "@material-ui/icons"; import NavBar from "./NavBar"; import Footer from "./Footer"; import "./css/History.css"; import "./css/MistakesHistory.css"; import Collapsible from "react-collapsible"; import Checkbox from '@material-ui/core/Checkbox'; import Select from "react-select"; export default class IncorrectHistory extends Component { constructor(props) { super(props); this.state = { user: props.user, db: props.db, navbarItems: [ { type: "link", name: "History", link: "/history", icon: , hideTextMobile: true, }, { type: "link", link: "/", icon: , hideTextMobile: true, } ], totalIncorrect: 0, totalTests: 0, sets: {}, selectedSet: { value: "all_sets", label: "All sets", }, includeCompoundTests: true, incorrectAnswers: [], filteredIncorrectAnswers: [], setsWithHistory: {}, }; let isMounted = true; Object.defineProperty(this, "isMounted", { get: () => isMounted, set: (value) => isMounted = value, }); } setState = (state, callback = null) => { if (this.isMounted) super.setState(state, callback); } async componentDidMount() { document.title = "Incorrect | History | Parandum"; let promises = []; let newState = { sets: {}, setsWithHistory: {}, }; promises.push( this.state.db.collection("incorrect_answers") .where("uid", "==", this.state.user.uid) .orderBy("term", "asc") .orderBy("definition", "asc") .get() .then(async (querySnapshot) => { let incorrectAnswers = []; let subPromises = []; querySnapshot.docs.map((doc, index, array) => { // if (index === 0 || doc.data().term !== array[array.length - 1].data().term || doc.data().definition !== array[array.length - 1].data().definition) { // incorrectAnswers.push({ // term: doc.data().term, // definition: doc.data().definition, // switchedAnswers: {}, // notSwitchedAnswers: {}, // switchedCount: 0, // notSwitchedCount: 0, // }); // } // if (doc.data().switch_language) { // if (Object.keys(incorrectAnswers[incorrectAnswers.length - 1].switchedAnswers).includes(doc.data().answer)) { // incorrectAnswers[incorrectAnswers.length - 1].switchedAnswers[doc.data().answer]++; // } else { // incorrectAnswers[incorrectAnswers.length - 1].switchedAnswers[doc.data().answer] = 1; // } // incorrectAnswers[incorrectAnswers.length - 1].switchedCount++; // } else { // if (Object.keys(incorrectAnswers[incorrectAnswers.length - 1].notSwitchedAnswers).includes(doc.data().answer)) { // incorrectAnswers[incorrectAnswers.length - 1].notSwitchedAnswers[doc.data().answer]++; // } else { // incorrectAnswers[incorrectAnswers.length - 1].notSwitchedAnswers[doc.data().answer] = 1; // } // incorrectAnswers[incorrectAnswers.length - 1].notSwitchedCount++; // } if (index === 0 || doc.data().term !== array[index - 1].data().term || doc.data().definition !== array[index - 1].data().definition) { incorrectAnswers.push({ term: doc.data().term, definition: doc.data().definition, answers: [{ answer: doc.data().answer, switchLanguage: doc.data().switch_language, setIds: doc.data().setIds, }], count: doc.data().switch_language ? 0 : 1, switchedCount: doc.data().switch_language ? 1 : 0, setIds: doc.data().setIds, }); } else { incorrectAnswers[incorrectAnswers.length - 1].answers.push({ answer: doc.data().answer, switchLanguage: doc.data().switch_language, setIds: doc.data().setIds, }); doc.data().setIds.map((setId) => { if (!incorrectAnswers[incorrectAnswers.length - 1].setIds.includes(setId)) return incorrectAnswers[incorrectAnswers.length - 1].setIds.push(setId); return true; }); if (doc.data().switch_language) { incorrectAnswers[incorrectAnswers.length - 1].switchedCount++; } else { incorrectAnswers[incorrectAnswers.length - 1].count++; } } // doc.data().setIds.map((setId) => subPromises.push( // this.state.db.collection("sets") // .doc(setId) // .get() // .then((doc) => // newState.setsWithHistory[setId] = doc.data().title // ) // )); doc.data().setIds.map((setId, setIndex) => newState.setsWithHistory[setId] = doc.data().set_titles[setIndex] ); return true; }); newState.incorrectAnswers = incorrectAnswers.sort((a,b) => b.count + b.switchedCount - a.count - a.switchedCount); newState.filteredIncorrectAnswers = newState.incorrectAnswers; newState.totalIncorrect = querySnapshot.docs.length; await Promise.all(subPromises); }) .catch((error) => { newState.incorrectAnswers = []; newState.totalIncorrect = 0; console.log(`Couldn't get mistakes history: ${error}`); }) ); promises.push( this.state.db.collection("progress") .where("uid", "==", this.state.user.uid) .get() // .then((querySnapshot) => newState.totalTests = querySnapshot.docs.length) .then((querySnapshot) => { newState.progressHistory = querySnapshot.docs.map((doc) => ({ setIds: doc.data().setIds, }) ); newState.totalTests = newState.progressHistory.length; }) ); await Promise.all(promises); this.setState(newState); this.props.page.load(); this.props.logEvent("page_view"); } componentWillUnmount() { this.isMounted = false; this.props.page.unload(); } arraysHaveSameMembers = (arr1, arr2) => { const set1 = new Set(arr1); const set2 = new Set(arr2); return arr1.every(item => set2.has(item)) && arr2.every(item => set1.has(item)); } handleSetSelectionChange = (selectedSet = this.state.selectedSet) => { let totalIncorrect = 0; const filteredIncorrectAnswers = (selectedSet.value === "all_sets" ? JSON.parse(JSON.stringify(this.state.incorrectAnswers)) : JSON.parse(JSON.stringify(this.state.incorrectAnswers)) .filter((vocabItem) => vocabItem.setIds.includes(selectedSet.value) ) ) .map((vocabItem) => { let newVocabItem = vocabItem; if (selectedSet.value === "all_sets") { if (this.state.includeCompoundTests) { newVocabItem.answers = vocabItem.answers; } else { newVocabItem.answers = vocabItem.answers .filter((answer) => answer.setIds.length === 1 ) } } else { newVocabItem.answers = vocabItem.answers .filter((answer) => this.arraysHaveSameMembers(answer.setIds, [selectedSet.value]) || ( this.state.includeCompoundTests && answer.setIds.includes(selectedSet.value) ) ) } newVocabItem.switchedCount = newVocabItem.answers.filter((answer) => answer.switchLanguage === true).length; newVocabItem.count = newVocabItem.answers.length - newVocabItem.switchedCount; totalIncorrect += newVocabItem.answers.length; return newVocabItem; }); this.setState({ filteredIncorrectAnswers: filteredIncorrectAnswers, selectedSet: selectedSet, totalIncorrect: totalIncorrect, totalTests: selectedSet.value === "all_sets" ? this.state.progressHistory.length : this.state.progressHistory .filter((progressItem) => this.arraysHaveSameMembers(progressItem.setIds, [selectedSet.value]) || ( this.state.includeCompoundTests && progressItem.setIds.includes(selectedSet.value) ) ) .length, }); } handleIncludeCompoundTestsChange = (event) => { this.setState({ includeCompoundTests: event.target.checked, }, () => this.handleSetSelectionChange()); } render() { return (

Mistakes