forked from external-repos/LifeTrinket
better invalid settings handling
This commit is contained in:
@@ -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>(
|
||||
initialGameSettings || {
|
||||
numberOfPlayers: 4,
|
||||
startingLifeTotal: 40,
|
||||
useCommanderDamage: true,
|
||||
orientation: Orientation.Portrait,
|
||||
gameFormat: GameFormat.Commander,
|
||||
}
|
||||
initialGameSettings || defaultInitialGameSettings
|
||||
);
|
||||
|
||||
const doStartGame = () => {
|
||||
|
||||
@@ -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<Settings>(
|
||||
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]);
|
||||
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user