wake lock on start game

This commit is contained in:
Viktor Rådberg
2023-09-17 18:17:13 +02:00
parent 444d4086aa
commit 10b40c5ca2
6 changed files with 69 additions and 14 deletions

View File

@@ -8,6 +8,7 @@ import { Player } from './Types/Player';
import { ThemeProvider } from '@mui/material'; import { ThemeProvider } from '@mui/material';
import { theme } from './Data/theme'; import { theme } from './Data/theme';
import { useAnalytics } from './Hooks/useAnalytics'; import { useAnalytics } from './Hooks/useAnalytics';
import { useWakeLock } from 'react-screen-wake-lock';
const GlobalStyles = createGlobalStyle` const GlobalStyles = createGlobalStyle`
html, html,
@@ -42,6 +43,17 @@ const App = () => {
const analytics = useAnalytics(); const analytics = useAnalytics();
const savedPlayers = localStorage.getItem('players'); const savedPlayers = localStorage.getItem('players');
const savedGameSettings = localStorage.getItem('initialGameSettings'); const savedGameSettings = localStorage.getItem('initialGameSettings');
const { isSupported, release, released, request, type } = useWakeLock();
const isActive = released === undefined ? false : !released;
const wakeLock = {
isSupported,
release,
active: isActive,
request,
type,
};
const [initialGameSettings, setInitialGameSettings] = const [initialGameSettings, setInitialGameSettings] =
useState<InitialSettings | null>( useState<InitialSettings | null>(
@@ -90,6 +102,7 @@ const App = () => {
onPlayerChange={handlePlayerChange} onPlayerChange={handlePlayerChange}
gridAreas={initialGameSettings?.gridAreas} gridAreas={initialGameSettings?.gridAreas}
resetCurrentGame={resetCurrentGame} resetCurrentGame={resetCurrentGame}
wakeLock={wakeLock}
/> />
</PlayWrapper> </PlayWrapper>
) : ( ) : (
@@ -98,6 +111,7 @@ const App = () => {
initialGameSettings={initialGameSettings} initialGameSettings={initialGameSettings}
setInitialGameSettings={setInitialGameSettings} setInitialGameSettings={setInitialGameSettings}
setPlayers={setPlayers} setPlayers={setPlayers}
wakeLock={wakeLock}
/> />
</StartWrapper> </StartWrapper>
)} )}

View File

@@ -4,6 +4,7 @@ import styled from 'styled-components';
import { css } from 'styled-components'; import { css } from 'styled-components';
import { Rotation } from '../../Types/Player'; import { Rotation } from '../../Types/Player';
import { Button } from '@mui/material'; import { Button } from '@mui/material';
import { WakeLock } from '../../Types/WakeLock';
const PlayerMenuWrapper = styled.div<{ const PlayerMenuWrapper = styled.div<{
rotation: Rotation; rotation: Rotation;
@@ -68,6 +69,7 @@ type PlayerMenuProps = {
onPlayerChange: (updatedPlayer: Player) => void; onPlayerChange: (updatedPlayer: Player) => void;
setShowPlayerMenu: (showPlayerMenu: boolean) => void; setShowPlayerMenu: (showPlayerMenu: boolean) => void;
resetCurrentGame: () => void; resetCurrentGame: () => void;
wakeLock: WakeLock;
}; };
const PlayerMenu = ({ const PlayerMenu = ({
@@ -76,9 +78,9 @@ const PlayerMenu = ({
onPlayerChange, onPlayerChange,
setShowPlayerMenu, setShowPlayerMenu,
resetCurrentGame, resetCurrentGame,
wakeLock,
}: PlayerMenuProps) => { }: PlayerMenuProps) => {
const handleOnClick = () => { const handleOnClick = () => {
console.log('hej');
setShowPlayerMenu(false); setShowPlayerMenu(false);
}; };
@@ -101,6 +103,7 @@ const PlayerMenu = ({
onChange={onPlayerChange} onChange={onPlayerChange}
opponents={opponents} opponents={opponents}
resetCurrentGame={resetCurrentGame} resetCurrentGame={resetCurrentGame}
wakeLock={wakeLock}
/> />
</PlayerMenuWrapper> </PlayerMenuWrapper>
); );

View File

@@ -2,13 +2,14 @@ import { Button, Checkbox } from '@mui/material';
import styled, { css } from 'styled-components'; import styled, { css } from 'styled-components';
import { Energy, Experience, PartnerTax, Poison } from '../../Icons/generated'; import { Energy, Experience, PartnerTax, Poison } from '../../Icons/generated';
import { Player, Rotation } from '../../Types/Player'; import { Player, Rotation } from '../../Types/Player';
import { useWakeLock } from 'react-screen-wake-lock'; import { WakeLock } from '../../Types/WakeLock';
type SettingsProps = { type SettingsProps = {
player: Player; player: Player;
opponents: Player[]; opponents: Player[];
onChange: (updatedPlayer: Player) => void; onChange: (updatedPlayer: Player) => void;
resetCurrentGame: () => void; resetCurrentGame: () => void;
wakeLock: WakeLock;
}; };
const SettingsContainer = styled.div<{ const SettingsContainer = styled.div<{
@@ -124,9 +125,24 @@ const CheckboxContainer = styled.div<{ rotation: Rotation }>`
}} }}
`; `;
const Settings = ({ player, onChange, resetCurrentGame }: SettingsProps) => { const Settings = ({
const { released, request, release } = useWakeLock(); player,
const handleWakeLock = () => (released === false ? release() : request()); onChange,
resetCurrentGame,
wakeLock,
}: SettingsProps) => {
const isSide =
player.settings.rotation === Rotation.Side ||
player.settings.rotation === Rotation.SideFlipped;
const handleWakeLock = () => {
if (!wakeLock.active) {
wakeLock.request();
return;
}
wakeLock.release();
};
const handleColorChange = (event: React.ChangeEvent<HTMLInputElement>) => { const handleColorChange = (event: React.ChangeEvent<HTMLInputElement>) => {
const updatedPlayer = { ...player, color: event.target.value }; const updatedPlayer = { ...player, color: event.target.value };
@@ -156,11 +172,7 @@ const Settings = ({ player, onChange, resetCurrentGame }: SettingsProps) => {
} }
}; };
const buttonFontSize = const buttonFontSize = isSide ? '2vmax' : '4vmin';
player.settings.rotation === Rotation.SideFlipped ||
player.settings.rotation === Rotation.Side
? '1.3vmax'
: '2.5vmin';
return ( return (
<SettingsContainer rotation={player.settings.rotation}> <SettingsContainer rotation={player.settings.rotation}>
@@ -271,7 +283,7 @@ const Settings = ({ player, onChange, resetCurrentGame }: SettingsProps) => {
</TogglesSection> </TogglesSection>
<ButtonsSections rotation={player.settings.rotation}> <ButtonsSections rotation={player.settings.rotation}>
<Button <Button
variant="outlined" variant="contained"
style={{ style={{
cursor: 'pointer', cursor: 'pointer',
userSelect: 'none', userSelect: 'none',
@@ -283,7 +295,7 @@ const Settings = ({ player, onChange, resetCurrentGame }: SettingsProps) => {
Back to Start Back to Start
</Button> </Button>
<Button <Button
variant="outlined" variant="contained"
style={{ style={{
cursor: 'pointer', cursor: 'pointer',
userSelect: 'none', userSelect: 'none',
@@ -295,7 +307,7 @@ const Settings = ({ player, onChange, resetCurrentGame }: SettingsProps) => {
Fullscreen Fullscreen
</Button> </Button>
<Button <Button
variant="outlined" variant="contained"
style={{ style={{
cursor: 'pointer', cursor: 'pointer',
userSelect: 'none', userSelect: 'none',
@@ -304,7 +316,7 @@ const Settings = ({ player, onChange, resetCurrentGame }: SettingsProps) => {
}} }}
onClick={handleWakeLock} onClick={handleWakeLock}
> >
{released === false ? 'Release' : 'Request'} nosleep Wake Lock is&nbsp;{wakeLock.active ? 'on' : 'off'}
</Button> </Button>
</ButtonsSections> </ButtonsSections>
</SettingsContainer> </SettingsContainer>

View File

@@ -1,6 +1,7 @@
import styled from 'styled-components'; import styled from 'styled-components';
import Counters from '../Counters/Counters'; import Counters from '../Counters/Counters';
import { Player } from '../../Types/Player'; import { Player } from '../../Types/Player';
import { WakeLock } from '../../Types/WakeLock';
const MainWrapper = styled.div` const MainWrapper = styled.div`
width: 100vmax; width: 100vmax;
@@ -13,6 +14,7 @@ type PlayProps = {
onPlayerChange: (updatedPlayer: Player) => void; onPlayerChange: (updatedPlayer: Player) => void;
gridAreas: string; gridAreas: string;
resetCurrentGame: () => void; resetCurrentGame: () => void;
wakeLock: WakeLock;
}; };
const Play = ({ const Play = ({
@@ -20,6 +22,7 @@ const Play = ({
onPlayerChange, onPlayerChange,
gridAreas, gridAreas,
resetCurrentGame, resetCurrentGame,
wakeLock,
}: PlayProps) => { }: PlayProps) => {
return ( return (
<MainWrapper> <MainWrapper>
@@ -28,6 +31,7 @@ const Play = ({
onPlayerChange={onPlayerChange} onPlayerChange={onPlayerChange}
gridAreas={gridAreas} gridAreas={gridAreas}
resetCurrentGame={resetCurrentGame} resetCurrentGame={resetCurrentGame}
wakeLock={wakeLock}
/> />
</MainWrapper> </MainWrapper>
); );

View File

@@ -11,6 +11,7 @@ import { theme } from '../../../Data/theme';
import { useAnalytics } from '../../../Hooks/useAnalytics'; import { useAnalytics } from '../../../Hooks/useAnalytics';
import { Info } from '../../../Icons/generated'; import { Info } from '../../../Icons/generated';
import { Player } from '../../../Types/Player'; import { Player } from '../../../Types/Player';
import { WakeLock } from '../../../Types/WakeLock';
import { InfoModal } from '../../Misc/InfoModal'; import { InfoModal } from '../../Misc/InfoModal';
import { SupportMe } from '../../Misc/SupportMe'; import { SupportMe } from '../../Misc/SupportMe';
import { H2, Paragraph } from '../../Misc/TextComponents'; import { H2, Paragraph } from '../../Misc/TextComponents';
@@ -88,12 +89,14 @@ type StartProps = {
setInitialGameSettings: (options: InitialSettings) => void; setInitialGameSettings: (options: InitialSettings) => void;
setPlayers: (updatedPlayer: Player[]) => void; setPlayers: (updatedPlayer: Player[]) => void;
initialGameSettings: InitialSettings | null; initialGameSettings: InitialSettings | null;
wakeLock: WakeLock;
}; };
const Start = ({ const Start = ({
initialGameSettings, initialGameSettings,
setPlayers, setPlayers,
setInitialGameSettings, setInitialGameSettings,
wakeLock,
}: StartProps) => { }: StartProps) => {
const analytics = useAnalytics(); const analytics = useAnalytics();
const [openModal, setOpenModal] = useState(false); const [openModal, setOpenModal] = useState(false);
@@ -106,6 +109,13 @@ const Start = ({
} }
); );
const handleWakeLock = () => {
if (wakeLock.active) {
return;
}
wakeLock.request();
};
const doStartGame = () => { const doStartGame = () => {
if (!initialGameSettings) { if (!initialGameSettings) {
return; return;
@@ -118,6 +128,8 @@ const Start = ({
} catch (error) { } catch (error) {
console.error(error); console.error(error);
} }
handleWakeLock();
setInitialGameSettings(initialGameSettings); setInitialGameSettings(initialGameSettings);
setPlayers(createInitialPlayers(initialGameSettings)); setPlayers(createInitialPlayers(initialGameSettings));
}; };
@@ -180,6 +192,7 @@ const Start = ({
<SupportMe /> <SupportMe />
<H2>Life Trinket</H2> <H2>Life Trinket</H2>
{wakeLock.active ? 'hej' : 'noo'}
<FormControl focused={false} style={{ width: '80vw' }}> <FormControl focused={false} style={{ width: '80vw' }}>
<FormLabel>Number of Players</FormLabel> <FormLabel>Number of Players</FormLabel>
<Slider <Slider

9
src/Types/WakeLock.ts Normal file
View File

@@ -0,0 +1,9 @@
type WakeLockType = 'screen';
export type WakeLock = {
isSupported: boolean;
request: (type?: WakeLockType) => Promise<void>;
active: boolean;
release: () => Promise<void>;
type: 'screen' | undefined;
};