Compare commits

...

2 Commits
0.9.0 ... 0.9.1

Author SHA1 Message Date
Viktor Rådberg
28c2ff536f bump 2024-03-30 10:28:49 +01:00
Viktor Rådberg
6beddf06e2 better invalid settings handling 2024-03-30 10:27:16 +01:00
4 changed files with 68 additions and 39 deletions

View File

@@ -1,7 +1,7 @@
{ {
"name": "life-trinket", "name": "life-trinket",
"private": true, "private": true,
"version": "0.9.0", "version": "0.9.1",
"type": "commonjs", "type": "commonjs",
"engines": { "engines": {
"node": ">=18", "node": ">=18",

View File

@@ -9,10 +9,10 @@ import { useGlobalSettings } from '../../../Hooks/useGlobalSettings';
import { usePlayers } from '../../../Hooks/usePlayers'; import { usePlayers } from '../../../Hooks/usePlayers';
import { Cog, Info } from '../../../Icons/generated'; import { Cog, Info } from '../../../Icons/generated';
import { import {
GameFormat,
InitialGameSettings, InitialGameSettings,
Orientation, Orientation,
PreStartMode, PreStartMode,
defaultInitialGameSettings,
} from '../../../Types/Settings'; } from '../../../Types/Settings';
import { InfoModal } from '../../Misc/InfoModal'; import { InfoModal } from '../../Misc/InfoModal';
import { SettingsModal } from '../../Misc/SettingsModal'; import { SettingsModal } from '../../Misc/SettingsModal';
@@ -97,13 +97,7 @@ const Start = () => {
const [openSettingsModal, setOpenSettingsModal] = useState(false); const [openSettingsModal, setOpenSettingsModal] = useState(false);
const [playerOptions, setPlayerOptions] = useState<InitialGameSettings>( const [playerOptions, setPlayerOptions] = useState<InitialGameSettings>(
initialGameSettings || { initialGameSettings || defaultInitialGameSettings
numberOfPlayers: 4,
startingLifeTotal: 40,
useCommanderDamage: true,
orientation: Orientation.Portrait,
gameFormat: GameFormat.Commander,
}
); );
const doStartGame = () => { const doStartGame = () => {

View File

@@ -7,9 +7,10 @@ import {
import { useAnalytics } from '../Hooks/useAnalytics'; import { useAnalytics } from '../Hooks/useAnalytics';
import { import {
InitialGameSettings, InitialGameSettings,
initialGameSettingsSchema,
PreStartMode,
Settings, Settings,
defaultInitialGameSettings,
defaultSettings,
initialGameSettingsSchema,
settingsSchema, settingsSchema,
} from '../Types/Settings'; } from '../Types/Settings';
@@ -53,19 +54,18 @@ export const GlobalSettingsProvider = ({
savedGameSettings ? JSON.parse(savedGameSettings) : null savedGameSettings ? JSON.parse(savedGameSettings) : null
); );
const parsedSettings = settingsSchema.safeParse( const setInitialGameSettingsAndLocalStorage = (
JSON.parse(savedSettings ?? '') initialGameSettings: InitialGameSettings
) => {
setInitialGameSettings(initialGameSettings);
localStorage.setItem(
'initialGameSettings',
JSON.stringify(initialGameSettings)
); );
};
const [settings, setSettings] = useState<Settings>( const [settings, setSettings] = useState<Settings>(
parsedSettings.success savedSettings ? JSON.parse(savedSettings) : defaultSettings
? parsedSettings.data
: {
goFullscreenOnStart: true,
keepAwake: true,
showStartingPlayer: true,
showPlayerMenuCog: true,
preStartMode: PreStartMode.None,
}
); );
const setSettingsAndLocalStorage = (settings: Settings) => { const setSettingsAndLocalStorage = (settings: Settings) => {
@@ -85,10 +85,29 @@ export const GlobalSettingsProvider = ({
setPreStartCompleted(false); setPreStartCompleted(false);
}; };
// Set settings if they are not valid
useEffect(() => { useEffect(() => {
if (savedGameSettings && JSON.parse(savedGameSettings).gridAreas) { // If there are no saved settings, set default settings
removeLocalStorage(); if (!savedSettings) {
window.location.reload(); setSettingsAndLocalStorage(defaultSettings);
return;
}
const parsedSettings = settingsSchema.safeParse(JSON.parse(savedSettings));
// If saved settings are not valid, remove them
if (!parsedSettings.success) {
console.error('invalid settings, resetting to default settings');
setSettingsAndLocalStorage(defaultSettings);
return;
}
localStorage.setItem('settings', JSON.stringify(parsedSettings.data));
}, [settings, savedSettings]);
// Set initial game settings if they are not valid
useEffect(() => {
if (!savedGameSettings) {
setInitialGameSettingsAndLocalStorage(defaultInitialGameSettings);
return; return;
} }
@@ -97,14 +116,14 @@ export const GlobalSettingsProvider = ({
initialGameSettingsSchema.safeParse(initialGameSettings); initialGameSettingsSchema.safeParse(initialGameSettings);
if (!parsedInitialGameSettings.success) { if (!parsedInitialGameSettings.success) {
removeLocalStorage(); console.error('invalid game settings, resetting to default settings');
window.location.reload(); setInitialGameSettingsAndLocalStorage(defaultInitialGameSettings);
return; return;
} }
localStorage.setItem( localStorage.setItem(
'initialGameSettings', 'initialGameSettings',
JSON.stringify(initialGameSettings) JSON.stringify(parsedInitialGameSettings.data)
); );
}, [initialGameSettings, savedGameSettings]); }, [initialGameSettings, savedGameSettings]);

View File

@@ -35,17 +35,33 @@ export type InitialGameSettings = {
}; };
export const initialGameSettingsSchema = z.object({ export const initialGameSettingsSchema = z.object({
startingLifeTotal: z.number().min(1).max(200).default(20), startingLifeTotal: z.number().min(1).max(200),
useCommanderDamage: z.boolean().default(false), useCommanderDamage: z.boolean(),
gameFormat: z.nativeEnum(GameFormat).optional(), gameFormat: z.nativeEnum(GameFormat),
numberOfPlayers: z.number().min(1).max(6).default(2), numberOfPlayers: z.number().min(1).max(6),
orientation: z.nativeEnum(Orientation).default(Orientation.Landscape), orientation: z.nativeEnum(Orientation),
}); });
export const defaultInitialGameSettings = {
numberOfPlayers: 4,
startingLifeTotal: 40,
useCommanderDamage: true,
orientation: Orientation.Landscape,
gameFormat: GameFormat.Commander,
};
export const settingsSchema = z.object({ export const settingsSchema = z.object({
keepAwake: z.boolean().default(true), keepAwake: z.boolean(),
showStartingPlayer: z.boolean().default(true), showStartingPlayer: z.boolean(),
showPlayerMenuCog: z.boolean().default(true), showPlayerMenuCog: z.boolean(),
goFullscreenOnStart: z.boolean().default(true), goFullscreenOnStart: z.boolean(),
preStartMode: z.nativeEnum(PreStartMode).default(PreStartMode.None), preStartMode: z.nativeEnum(PreStartMode),
}); });
export const defaultSettings: Settings = {
goFullscreenOnStart: true,
keepAwake: true,
showStartingPlayer: true,
showPlayerMenuCog: true,
preStartMode: PreStartMode.None,
};