little fixes

This commit is contained in:
Sergey Krylov 2022-07-25 19:36:27 +05:00
parent e2c70835e2
commit c1f35b8207
4 changed files with 58 additions and 17 deletions

View File

@ -99,9 +99,8 @@ const CardsField: React.FC<CardsFieldProps> = ({cards, isGameStarted = false, fi
}
useEffect(() => {
if (isAllCardsMatched(cardsState)) {
setTimeout(finishGameCallback, 800);
}
if (isAllCardsMatched(cardsState)) setTimeout(finishGameCallback, 800);
if (isGameStarted) localStorage.setItem('match-game:cards', JSON.stringify(cardsState));
}, [cardsState])
useEffect(() => {
@ -115,7 +114,7 @@ const CardsField: React.FC<CardsFieldProps> = ({cards, isGameStarted = false, fi
useEffect(() => {
setCardsState(prev => (prev.map(el => ({...el, disabled: !isGameStarted, toggled: !isGameStarted && isNewGame}))));
if (isGameStarted) localStorage.setItem('match-game:cards', JSON.stringify(cardsState));
}, [isGameStarted, isNewGame])
}, [isGameStarted])
useEffect(() => {
if (isNewGame) setCardsState(cards.map(el => createCard(el)))

View File

@ -1,12 +1,11 @@
import CardsField from 'components/CardsField/CardsField';
import FinishedField from 'components/FinishedField/FinishedField';
import React, { useEffect, useState } from 'react';
import BottomPanel from 'components/UI/BottomPanel/BottomPanel';
import Button from 'components/UI/Button/Button';
import CardsField from 'components/CardsField/CardsField';
import FinishedField from 'components/FinishedField/FinishedField';
import Timer from 'components/UI/Timer/Timer';
import { useMatchGame } from 'context/MatchGameContext';
import React, { useEffect, useState } from 'react';
import { createCards, randomizeElementInArray } from 'src/utils';
import { useMatchGame } from 'context/MatchGameContext';
interface MatchGameProps {
isNewGame: boolean;
@ -36,7 +35,7 @@ const MatchGame: React.FC<MatchGameProps> = ({isNewGame}) => {
useEffect(() => {
if (isNewGame) resetGameProgress?.();
}, [isNewGame, resetGameProgress])
}, [isNewGame])
useEffect(() => {
if (isGameFinished) {

View File

@ -0,0 +1,21 @@
.MatchMenu {
color: #ffffff;
font-size: 40px;
.button {
width: 240px;
}
ul {
list-style: none;
margin: 0;
li {
text-align: center;
cursor: pointer;
&:focus, &:hover {
color: coral;
}
}
}
}

View File

@ -1,13 +1,28 @@
import Button from 'components/UI/Button/Button';
import { MenuItem, useMatchGame } from 'context/MatchGameContext';
import React from 'react';
import cls from './MatchMenu.module.scss'
type GameMenuProps = {
}
type MenuItemType = {
itemName: MenuItem;
itemPlaceholder: string;
condition?: () => boolean;
}
const MatchMenu: React.FC<GameMenuProps> = () => {
const {setCurrentMenuItem} = useMatchGame();
const menuItems: MenuItemType[] = [
{itemName: 'continue-game', itemPlaceholder: 'Continue', condition: canContinueGame},
{itemName: 'new-game', itemPlaceholder: 'New game'},
{itemName: 'options', itemPlaceholder: 'Options'},
{itemName: 'exit', itemPlaceholder: 'Exit'},
]
function clickItemHandler(item: MenuItem) {
setCurrentMenuItem?.(item);
}
@ -16,16 +31,23 @@ const MatchMenu: React.FC<GameMenuProps> = () => {
return !!localStorage.getItem('match-game:cards');
}
function renderItem(itemName: MenuItem, itemText: string) {
return <Button className={cls.button} onClick={() => clickItemHandler(itemName)}>{itemText}</Button>
}
function renderMenuItems() {
return menuItems.map(item => {
return item?.condition
? item?.condition() && <li key={item.itemName}>{renderItem(item.itemName, item.itemPlaceholder)}</li>
: <li key={item.itemName}>{renderItem(item.itemName, item.itemPlaceholder)}</li>;
});
}
return (
<div>
<div className={cls.MatchMenu}>
<h2>Match game menu</h2>
<ul>
{
canContinueGame() ? <li onClick={() => clickItemHandler('continue-game')}>Continue</li> : null
}
<li onClick={() => clickItemHandler('new-game')}>New game</li>
<li onClick={() => clickItemHandler('options')}>Options</li>
<li onClick={() => clickItemHandler('exit')}>Exit</li>
{renderMenuItems()}
</ul>
</div>
);