match-game/src/context/MatchGameContext.tsx

76 lines
2.2 KiB
TypeScript

import React, { useContext, useState } from 'react';
import { DiffLevel, FieldSize, OptionsType } from 'src/pages/Options/Options';
export type MenuItem = 'menu' | 'new-game' | 'continue-game' | 'options' | 'exit';
interface MatchGameContextType {
mistakesCount?: number;
addMistakesCount?: () => void;
gameTime?: number;
changeGameTime?: (time: number) => void;
resetGameProgress?: () => void;
currentMenuItem?: MenuItem;
setCurrentMenuItem?: (item: MenuItem) => void;
isGameStarted?: boolean;
setIsGameStarted?: (status: boolean) => void;
isGameFinished?: boolean;
setIsGameFinished?: (status: boolean) => void;
filedSize?: number;
diffLevel?: number;
saveOptions?: (options: OptionsType) => void;
}
const MatchGameContext = React.createContext<MatchGameContextType>({});
export const useMatchGame = () => useContext(MatchGameContext);
export const MatchGameProvider: React.FC = ({children}) => {
const [mistakesCount, setMistakesCount] = useState(0)
const [gameTime, setGameTime] = useState(0);
const [currentMenuItem, setCurrentMenuItem] = useState<MenuItem>('menu');
const [isGameStarted, setIsGameStarted] = useState(false);
const [isGameFinished, setIsGameFinished] = useState(false);
const [filedSize, setFieldSize] = useState(FieldSize.Small);
const [diffLevel, setDiffLevel] = useState(DiffLevel.Easy);
const addMistakesCount = () => {
return setMistakesCount(prev => prev + 1)
};
const changeGameTime = (time: number) => {
setGameTime(time);
}
const resetGameProgress = () => {
setMistakesCount(0);
setGameTime(0);
setIsGameStarted(false);
setIsGameFinished(false);
localStorage.removeItem('match-game:cards');
}
const saveOptions = (options: OptionsType) => {
setFieldSize(options.size);
setDiffLevel(options.diffLevel);
}
return (
<MatchGameContext.Provider value={{
mistakesCount,
addMistakesCount,
gameTime,
changeGameTime,
resetGameProgress,
currentMenuItem,
setCurrentMenuItem,
isGameStarted,
setIsGameStarted,
isGameFinished,
setIsGameFinished,
filedSize,
diffLevel,
saveOptions
}}>
{children}
</MatchGameContext.Provider>
)
}