Files
LifeTrinket/src/Components/Views/Play.tsx
2024-04-01 18:48:06 +02:00

117 lines
3.2 KiB
TypeScript

import { useEffect } from 'react';
import { twc } from 'react-twc';
import { twGridTemplateAreas } from '../../../tailwind.config';
import { useGlobalSettings } from '../../Hooks/useGlobalSettings';
import { usePlayers } from '../../Hooks/usePlayers';
import { Orientation, PreStartMode } from '../../Types/Settings';
import { Players } from '../Players/Players';
import { PreStart } from '../PreStartGame/PreStart';
const MainWrapper = twc.div`w-[100dvmax] h-[100dvmin] overflow-hidden, setPlayers`;
type GridTemplateAreasKeys = keyof typeof twGridTemplateAreas;
export type GridLayout = `grid-areas-${GridTemplateAreasKeys}`;
export const Play = () => {
const { players, setPlayers } = usePlayers();
const { initialGameSettings, playing, settings, preStartCompleted } =
useGlobalSettings();
let gridLayout: GridLayout;
switch (players.length) {
case 1:
if (initialGameSettings?.orientation === Orientation.Portrait) {
gridLayout = 'grid-areas-onePlayerPortrait';
}
gridLayout = 'grid-areas-onePlayerLandscape';
break;
case 2:
switch (initialGameSettings?.orientation) {
case Orientation.Portrait:
gridLayout = 'grid-areas-twoPlayersOppositePortrait';
break;
default:
case Orientation.Landscape:
gridLayout = 'grid-areas-twoPlayersSameSideLandscape';
break;
case Orientation.OppositeLandscape:
gridLayout = 'grid-areas-twoPlayersOppositeLandscape';
break;
}
break;
case 3:
if (initialGameSettings?.orientation === Orientation.Portrait) {
gridLayout = 'grid-areas-threePlayersSide';
break;
}
gridLayout = 'grid-areas-threePlayers';
break;
default:
case 4:
if (initialGameSettings?.orientation === Orientation.Portrait) {
gridLayout = 'grid-areas-fourPlayerPortrait';
break;
}
gridLayout = 'grid-areas-fourPlayer';
break;
case 5:
if (initialGameSettings?.orientation === Orientation.Portrait) {
gridLayout = 'grid-areas-fivePlayersSide';
break;
}
gridLayout = 'grid-areas-fivePlayers';
break;
case 6:
if (initialGameSettings?.orientation === Orientation.Portrait) {
gridLayout = 'grid-areas-sixPlayersSide';
break;
}
gridLayout = 'grid-areas-sixPlayers';
break;
}
useEffect(() => {
if (settings.preStartMode !== PreStartMode.None) {
return;
}
const randomIndex = Math.floor(Math.random() * players.length);
setPlayers(
players.map((p) =>
p.index === randomIndex
? {
...p,
isStartingPlayer: true,
}
: {
...p,
isStartingPlayer: false,
}
)
);
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
if (
players.length > 1 &&
!preStartCompleted &&
settings.preStartMode !== PreStartMode.None &&
!playing &&
settings.showStartingPlayer
) {
return (
<MainWrapper>
<PreStart gridLayout={gridLayout} />
</MainWrapper>
);
}
return (
<MainWrapper>
<Players gridLayout={gridLayout} />
</MainWrapper>
);
};