Files
LifeTrinket/src/Providers/PlayersProvider.tsx
Viktor Rådberg bb660592b2 add settings menu
2023-09-28 14:20:19 +02:00

99 lines
2.5 KiB
TypeScript

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<Player[]>(
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 (
<PlayersContext.Provider value={ctxValue}>
{children}
</PlayersContext.Provider>
);
};