Skip to content

Commit

Permalink
feat: add statistics to sprint
Browse files Browse the repository at this point in the history
  • Loading branch information
lbratkovskaya committed Apr 13, 2021
1 parent 915faf7 commit 40e9217
Show file tree
Hide file tree
Showing 15 changed files with 206 additions and 118 deletions.
7 changes: 5 additions & 2 deletions src/components/AudioCallingPage/FinishWindow/FinishWindow.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ const FinishGame: React.FC = () => {
dispatch(
addGameStatistics(
userData,
IGameName.SAVANNAH,
IGameName.AUDIO,
newLearned.length,
wordsArray.length,
correctTotal,
Expand All @@ -50,7 +50,10 @@ const FinishGame: React.FC = () => {
};

useEffect(() => {
const copy = audioCallingData.words.map((el) => ({ word: el.word, correct: el.isCorrect }));
const copy = audioCallingData.words.map((el: IAudioCallingWords) => ({
word: el.word,
correct: el.isCorrect,
}));
sendWords(copy);
saveGameStatistics(
copy,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import {
import { addWordsToUserDictionary } from '../../../../store/actions/dictionaryActions';
import { fetchGameWords } from '../../../../store/actions/gamesActions';
import { SELECT_LEVELS, SELECT_ROUNDS } from '../../constants';
import { IAppState, IWord } from '../../../../store/types';
import { IAppState, IWord, IWordWithResult } from '../../../../store/types';
import useStyles from '../../styles';

const SavannahEndGame: React.FC = () => {
Expand All @@ -27,7 +27,7 @@ const SavannahEndGame: React.FC = () => {
const getGameWords = (groups: number, pages: number) => dispatch(fetchGameWords(groups, pages));
const startGame = (isStart: boolean) => dispatch(clickStartGame(isStart));
const onReduceArrayWords = (wordsArray: Array<IWord>) => dispatch(reduceArrayWords(wordsArray));
const sendWordsToUserDictionary = (words: Array<{ word: IWord; correct: boolean }>) =>
const sendWordsToUserDictionary = (words: Array<IWordWithResult>) =>
dispatch(addWordsToUserDictionary(words, userDictionary, userData));

const [isRestart, setIsRestart] = useState(false);
Expand All @@ -46,9 +46,7 @@ const SavannahEndGame: React.FC = () => {
correct: el.isCorrect,
};
});
return () => {
if (userData.userId) sendWordsToUserDictionary(arrayForUserDictionary);
};
if (userData.userId) sendWordsToUserDictionary(arrayForUserDictionary);
}, []);

const handleNewGame = () => {
Expand Down
23 changes: 9 additions & 14 deletions src/components/GameSavannah/SavannahGamePlay/SavannahGamePlay.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import { Favorite } from '@material-ui/icons';
import SavannahEndGame from './SavannahEndGame';
import { GameExitBtn } from '../../commonComponents';
import { clickStartGame, onAnswer } from '../../../store/actions/savannahActions';
// import { addWordsToUserDictionary } from '../../../store/actions/dictionaryActions';
import { addGameStatistics } from '../../../store/actions/statisticsActions';
import { SAVANNAH, VOLUME_DIVIDER } from '../../../constants';
import { KEYBOARD_CODE } from '../constants';
Expand All @@ -16,7 +15,6 @@ const SavannahGamePlay: React.FC = () => {
const soundsVolume = useSelector((state: IAppState) => state.settings.soundsVolume);
const userData = useSelector((state: IAppState) => state.user?.data);
const userDictionary = useSelector((state: IAppState) => state.userDictionary);

const userWords = [...userDictionary.learningWords, ...userDictionary.deletedWords];
const userWordsWords = userWords.map((uw) => uw.word);

Expand All @@ -25,13 +23,6 @@ const SavannahGamePlay: React.FC = () => {
dispatch(onAnswer(wordsArray, word, isAnswer));
const startGame = (isStart: boolean) => dispatch(clickStartGame(isStart));

// const saveUserWords = () => {
// const wordsToSaveToDict = savannahData.wordsData.map((savWord) => ({
// word: savWord.wordObj,
// correct: savWord.isCorrect,
// }));
// dispatch(addWordsToUserDictionary(wordsToSaveToDict, userDictionary, userData));
// };
const saveGameStatistics = (wordsArray: Array<ISavannahWord>, maxSuccessSeries: number) => {
const correctTotal = wordsArray.filter((word) => word.isCorrect).length;
const newLearned = wordsArray.filter((word) => userWordsWords.indexOf(word.word) === -1);
Expand Down Expand Up @@ -85,17 +76,21 @@ const SavannahGamePlay: React.FC = () => {
};
}, []);

useEffect(() => {
if (isEndGame) {
saveGameStatistics(
savannahData?.wordsData,
Math.max(currentSuccessSeries, successSeriesMaxLength)
);
}
}, [isEndGame]);

useEffect(() => {
const checkEndGame =
(startWord >= savannahData?.wordsData.length && !isEndGame) || health === 0;
if (checkEndGame) {
setIsEndGame(true);
setAnimate(true);
// saveUserWords();
saveGameStatistics(
savannahData?.wordsData,
Math.max(currentSuccessSeries, successSeriesMaxLength)
);
}
const timeout = setTimeout(() => timeOutFunc(), SAVANNAH.timeOutDelay);
return () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,29 +14,53 @@ import ClearIcon from '@material-ui/icons/Clear';
import SprintGamePlay from '../SprintGamePlay';
import { reduceArrayWords, selectLevel, selectRound } from '../../../../store/actions/sprintAction';
import { addWordsToUserDictionary } from '../../../../store/actions/dictionaryActions';
import { addGameStatistics } from '../../../../store/actions/statisticsActions';
import { fetchWords } from '../../../../store/actions/wordBookActions';
import { SPRINT, timeout } from '../../../../constants';
import { SELECT_LEVELS, SELECT_ROUNDS } from '../../constants';
import { IAppState, ISprintWords, IWord } from '../../../../store/types';
import {
IAppState,
IGameName,
ISprintWords,
IWord,
IWordWithResult,
} from '../../../../store/types';
import useStyles, { StyledTableCell, StyledTableRow } from '../../style';

const SprintGameEnd: React.FC = () => {
const wordBook = useSelector((state: IAppState) => state.wordBook);
const springInfo = useSelector((state: IAppState) => state.sprint);
const userData = useSelector((state: IAppState) => state.user.data);
const userDictionary = useSelector((state: IAppState) => state.userDictionary);
const userWords = [...userDictionary.learningWords, ...userDictionary.deletedWords];
const userWordsWords = userWords.map((uw) => uw.word);

const dispatch = useDispatch();
const randomLevel = (level: number) => dispatch(selectLevel(level));
const randomRound = (round: number) => dispatch(selectRound(round));
const getWords = (group: number, page: number) => dispatch(fetchWords(group, page));
const onReduceArrayWords = (wordsArray: Array<IWord>) => dispatch(reduceArrayWords(wordsArray));

const setWordForDictionary = (wordsArray: Array<{ word: IWord; correct: boolean }>) =>
const setWordForDictionary = (wordsArray: Array<IWordWithResult>) =>
dispatch(addWordsToUserDictionary(wordsArray, userDictionary, userData));
const [isRestGame, setIsRestGame] = useState(false);
const saveGameStatistics = (wordsArray: Array<IWordWithResult>, maxSuccessSeries: number) => {
const correctTotal = wordsArray.filter((word) => word.correct).length;
const newLearned = wordsArray.filter((word) => userWordsWords.indexOf(word.word.word) === -1);
dispatch(
addGameStatistics(
userData,
IGameName.SPRINT,
newLearned.length,
wordsArray.length,
correctTotal,
maxSuccessSeries
)
);
};

const group: number = Math.floor(Math.random() * SELECT_LEVELS.amount);
const page: number = Math.floor(Math.random() * SELECT_ROUNDS.amount);
const [isRestGame, setIsRestGame] = useState(false);
const [group, setGroup] = useState(0);
const [page, setPage] = useState(0);

const handleRestGame = (): void => {
randomLevel(group);
Expand All @@ -53,9 +77,7 @@ const SprintGameEnd: React.FC = () => {
const classes = useStyles();

useEffect(() => {
const checkCorrectArray = springInfo.wordsData
.map((el: ISprintWords) => el.isCorrect)
.filter((el) => el === false);
const checkCorrectArray = springInfo.wordsData.filter((el: ISprintWords) => !el.isCorrect);
setTimeout(() => {
if (checkCorrectArray.length) {
onAudioPlay(SPRINT.audioFalse);
Expand All @@ -65,6 +87,13 @@ const SprintGameEnd: React.FC = () => {
}, timeout);
}, []);

useEffect(() => {
if (!isRestGame) {
setGroup(Math.floor(Math.random() * SELECT_LEVELS.amount));
setPage(Math.floor(Math.random() * SELECT_ROUNDS.amount));
}
}, [isRestGame]);

useEffect(() => {
getWords(group, page);
}, [group, page]);
Expand All @@ -74,7 +103,13 @@ const SprintGameEnd: React.FC = () => {
word: el.word,
correct: el.isCorrect,
}));
if (userData.userId) setWordForDictionary(arrayForDictionary);
if (userData.userId) {
setWordForDictionary(arrayForDictionary);
saveGameStatistics(
arrayForDictionary,
[...springInfo.series, springInfo.seriesCounter].sort((a, b) => b - a)[0]
);
}
}, []);

const renderTable = (isAnswer: boolean) => {
Expand Down
62 changes: 33 additions & 29 deletions src/components/GameSprint/SprintGamePlay/SprintGamePlay.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -53,13 +53,13 @@ const SprintGamePlay: React.FC = () => {
if (timer === 0) {
setIsEndGame(true);
}
const timeout = setTimeout(() => setTimer(timer - 1), modalTimeout);
return () => clearTimeout(timeout);
}, [timer]);

useEffect(() => {
const timeout = setTimeout(() => setTimer(timer - 1), modalTimeout);
return () => {
startGame(false);
clearTimeout(timeout);
};
}, []);

Expand All @@ -79,6 +79,7 @@ const SprintGamePlay: React.FC = () => {
} else {
onAudioPlay(SPRINT.audioFalse);
setClassAnswer(classes.answerWrong);
answer(sprintInfo.wordsData, translateWord, false);
}
setIsDisabled(true);
setSelectWord(selectWord + 1);
Expand All @@ -94,7 +95,7 @@ const SprintGamePlay: React.FC = () => {
};

const handleEndGame = (): void => {
if (timer === 0) setIsEndGame(true);
setIsEndGame(true);
};

const handleKeyboardAnswer = (e: KeyboardEvent) => {
Expand Down Expand Up @@ -126,33 +127,36 @@ const SprintGamePlay: React.FC = () => {
);
};

if (!isEndGame) {
return (
<>
<div>
<div className={classes.sprintHeader}>
<Timer gameTime={timer} handleOnComplite={handleEndGame} size={60} />
<GameExitBtn clickBtn={handleExitGame} />
</div>
<Card className={classAnswer}>
<CardContent>
<Typography color="textSecondary" gutterBottom className={classes.sprintSpan}>
{currentWord}
</Typography>
<Typography color="textSecondary" className={classes.sprintSpan}>
{randomWord}
</Typography>
</CardContent>
</Card>
<div className={classes.sprintChooseWrapper}>
{btnComponent('true')}
{btnComponent('false')}
</div>
return (
<>
<div>
<div className={classes.sprintHeader}>
<Timer gameTime={timer} handleOnComplite={handleEndGame} size={60} />
<GameExitBtn clickBtn={handleExitGame} />
</div>
</>
);
}
return <SprintGameEnd />;
{!isEndGame ? (
<>
<Card className={classAnswer}>
<CardContent>
<Typography color="textSecondary" gutterBottom className={classes.sprintSpan}>
{currentWord}
</Typography>
<Typography color="textSecondary" className={classes.sprintSpan}>
{randomWord}
</Typography>
</CardContent>
</Card>
<div className={classes.sprintChooseWrapper}>
{btnComponent('true')}
{btnComponent('false')}
</div>
</>
) : (
<SprintGameEnd />
)}
</div>
</>
);
};

export default SprintGamePlay;
Loading

0 comments on commit 40e9217

Please sign in to comment.