Compare commits

..

2 Commits

Author SHA1 Message Date
Viktor Rådberg
eb99cff736 parse settings before setting 2024-03-29 23:18:10 +01:00
Viktor Rådberg
318520ea53 do 2024-03-29 22:46:55 +01:00
4 changed files with 39 additions and 68 deletions

View File

@@ -1,7 +1,7 @@
{ {
"name": "life-trinket", "name": "life-trinket",
"private": true, "private": true,
"version": "0.9.1", "version": "0.8.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,7 +97,13 @@ const Start = () => {
const [openSettingsModal, setOpenSettingsModal] = useState(false); const [openSettingsModal, setOpenSettingsModal] = useState(false);
const [playerOptions, setPlayerOptions] = useState<InitialGameSettings>( const [playerOptions, setPlayerOptions] = useState<InitialGameSettings>(
initialGameSettings || defaultInitialGameSettings initialGameSettings || {
numberOfPlayers: 4,
startingLifeTotal: 40,
useCommanderDamage: true,
orientation: Orientation.Portrait,
gameFormat: GameFormat.Commander,
}
); );
const doStartGame = () => { const doStartGame = () => {

View File

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

View File

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