diff --git a/src/Components/Views/StartMenu/StartMenu.tsx b/src/Components/Views/StartMenu/StartMenu.tsx index a034b6d..08817a4 100644 --- a/src/Components/Views/StartMenu/StartMenu.tsx +++ b/src/Components/Views/StartMenu/StartMenu.tsx @@ -9,10 +9,10 @@ import { useGlobalSettings } from '../../../Hooks/useGlobalSettings'; import { usePlayers } from '../../../Hooks/usePlayers'; import { Cog, Info } from '../../../Icons/generated'; import { - GameFormat, InitialGameSettings, Orientation, PreStartMode, + defaultInitialGameSettings, } from '../../../Types/Settings'; import { InfoModal } from '../../Misc/InfoModal'; import { SettingsModal } from '../../Misc/SettingsModal'; @@ -97,13 +97,7 @@ const Start = () => { const [openSettingsModal, setOpenSettingsModal] = useState(false); const [playerOptions, setPlayerOptions] = useState( - initialGameSettings || { - numberOfPlayers: 4, - startingLifeTotal: 40, - useCommanderDamage: true, - orientation: Orientation.Portrait, - gameFormat: GameFormat.Commander, - } + initialGameSettings || defaultInitialGameSettings ); const doStartGame = () => { diff --git a/src/Providers/GlobalSettingsProvider.tsx b/src/Providers/GlobalSettingsProvider.tsx index b5ca954..01f31fc 100644 --- a/src/Providers/GlobalSettingsProvider.tsx +++ b/src/Providers/GlobalSettingsProvider.tsx @@ -7,9 +7,10 @@ import { import { useAnalytics } from '../Hooks/useAnalytics'; import { InitialGameSettings, - initialGameSettingsSchema, - PreStartMode, Settings, + defaultInitialGameSettings, + defaultSettings, + initialGameSettingsSchema, settingsSchema, } from '../Types/Settings'; @@ -53,19 +54,18 @@ export const GlobalSettingsProvider = ({ savedGameSettings ? JSON.parse(savedGameSettings) : null ); - const parsedSettings = settingsSchema.safeParse( - JSON.parse(savedSettings ?? '') - ); + const setInitialGameSettingsAndLocalStorage = ( + initialGameSettings: InitialGameSettings + ) => { + setInitialGameSettings(initialGameSettings); + localStorage.setItem( + 'initialGameSettings', + JSON.stringify(initialGameSettings) + ); + }; + const [settings, setSettings] = useState( - parsedSettings.success - ? parsedSettings.data - : { - goFullscreenOnStart: true, - keepAwake: true, - showStartingPlayer: true, - showPlayerMenuCog: true, - preStartMode: PreStartMode.None, - } + savedSettings ? JSON.parse(savedSettings) : defaultSettings ); const setSettingsAndLocalStorage = (settings: Settings) => { @@ -85,10 +85,29 @@ export const GlobalSettingsProvider = ({ setPreStartCompleted(false); }; + // Set settings if they are not valid useEffect(() => { - if (savedGameSettings && JSON.parse(savedGameSettings).gridAreas) { - removeLocalStorage(); - window.location.reload(); + // If there are no saved settings, set default settings + if (!savedSettings) { + 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; } @@ -97,14 +116,14 @@ export const GlobalSettingsProvider = ({ initialGameSettingsSchema.safeParse(initialGameSettings); if (!parsedInitialGameSettings.success) { - removeLocalStorage(); - window.location.reload(); + console.error('invalid game settings, resetting to default settings'); + setInitialGameSettingsAndLocalStorage(defaultInitialGameSettings); return; } localStorage.setItem( 'initialGameSettings', - JSON.stringify(initialGameSettings) + JSON.stringify(parsedInitialGameSettings.data) ); }, [initialGameSettings, savedGameSettings]); diff --git a/src/Types/Settings.ts b/src/Types/Settings.ts index 8399300..de626b3 100644 --- a/src/Types/Settings.ts +++ b/src/Types/Settings.ts @@ -35,17 +35,33 @@ export type InitialGameSettings = { }; export const initialGameSettingsSchema = z.object({ - startingLifeTotal: z.number().min(1).max(200).default(20), - useCommanderDamage: z.boolean().default(false), - gameFormat: z.nativeEnum(GameFormat).optional(), - numberOfPlayers: z.number().min(1).max(6).default(2), - orientation: z.nativeEnum(Orientation).default(Orientation.Landscape), + startingLifeTotal: z.number().min(1).max(200), + useCommanderDamage: z.boolean(), + gameFormat: z.nativeEnum(GameFormat), + numberOfPlayers: z.number().min(1).max(6), + orientation: z.nativeEnum(Orientation), }); +export const defaultInitialGameSettings = { + numberOfPlayers: 4, + startingLifeTotal: 40, + useCommanderDamage: true, + orientation: Orientation.Landscape, + gameFormat: GameFormat.Commander, +}; + export const settingsSchema = z.object({ - keepAwake: z.boolean().default(true), - showStartingPlayer: z.boolean().default(true), - showPlayerMenuCog: z.boolean().default(true), - goFullscreenOnStart: z.boolean().default(true), - preStartMode: z.nativeEnum(PreStartMode).default(PreStartMode.None), + keepAwake: z.boolean(), + showStartingPlayer: z.boolean(), + showPlayerMenuCog: z.boolean(), + goFullscreenOnStart: z.boolean(), + preStartMode: z.nativeEnum(PreStartMode), }); + +export const defaultSettings: Settings = { + goFullscreenOnStart: true, + keepAwake: true, + showStartingPlayer: true, + showPlayerMenuCog: true, + preStartMode: PreStartMode.None, +};