import { ReactNode, useEffect } from 'react'; import { Player } from '../Types/Player'; import { useMemo, useState } from 'react'; import { PlayersContextType, PlayersContext } from '../Contexts/PlayersContext'; import { InitialGameSettings } from '../Types/Settings'; export const PlayersProvider = ({ children }: { children: ReactNode }) => { const savedPlayers = localStorage.getItem('players'); const [players, setPlayers] = useState( savedPlayers ? JSON.parse(savedPlayers) : [] ); useEffect(() => { localStorage.setItem('players', JSON.stringify(players)); }, [players]); const ctxValue = useMemo((): PlayersContextType => { const updatePlayer = (updatedPlayer: Player) => { const updatedPlayers = players.map((player) => player.index === updatedPlayer.index ? updatedPlayer : player ); setPlayers(updatedPlayers); }; const updateLifeTotal = ( player: Player, updatedLifeTotal: number ): number => { const difference = updatedLifeTotal - player.lifeTotal; const updatedPlayer = { ...player, lifeTotal: updatedLifeTotal, hasLost: false, }; updatePlayer(updatedPlayer); return difference; }; const resetCurrentGame = () => { const savedGameSettings = localStorage.getItem('initialGameSettings'); const initialGameSettings: InitialGameSettings = savedGameSettings ? JSON.parse(savedGameSettings) : null; if (!initialGameSettings) { return; } const startingPlayerIndex = Math.floor( Math.random() * initialGameSettings.numberOfPlayers ); players.forEach((player: Player) => { player.commanderDamage.map((damage) => { damage.damageTotal = 0; damage.partnerDamageTotal = 0; }); player.extraCounters.map((counter) => { counter.value = 0; }); player.lifeTotal = initialGameSettings.startingLifeTotal; player.hasLost = false; const isStartingPlayer = player.index === startingPlayerIndex; player.isStartingPlayer = isStartingPlayer; if (player.isStartingPlayer) { player.showStartingPlayer = true; } updatePlayer(player); }); localStorage.setItem('playing', 'false'); }; return { players, setPlayers, updatePlayer, updateLifeTotal, resetCurrentGame, }; }, [players]); return ( {children} ); };