import PropTypes from 'prop-types';
import React from 'react';
-import { CONFIG, DUNGEONS, makeEmptyState, mergeStates } from '../helpers/tracker';
+import {
+ CONFIG,
+ DUNGEONS,
+ applyLogic,
+ configureDungeons,
+ makeEmptyState,
+ mergeStates,
+} from '../helpers/tracker';
const context = React.createContext({});
const [autoState, setAutoState] = React.useState(makeEmptyState());
const [manualState, setManualState] = React.useState(makeEmptyState());
const [dungeons, setDungeons] = React.useState(DUNGEONS);
+ const [logic, setLogic] = React.useState({});
- React.useEffect(() => {
- const newDungeons = DUNGEONS.map(dungeon => {
- const newDungeon = JSON.parse(JSON.stringify(dungeon));
- if (config.wildMap && dungeon.map) {
- ++newDungeon.items;
- }
- if (config.wildCompass && dungeon.compass) {
- ++newDungeon.items;
- }
- if (config.wildSmall) {
- newDungeon.items += dungeon.sk;
- }
- if (config.wildBig && dungeon.bk && !dungeon.dropBk) {
- ++newDungeon.items;
- }
- if (!config.bossShuffle && dungeon.boss) {
- newDungeon.bosses = [dungeon.boss];
- }
- return newDungeon;
+ const saveConfig = React.useCallback((values) => {
+ setConfig(s => {
+ const newConfig = { ...s, ...values };
+ localStorage.setItem('tracker.config', JSON.stringify(newConfig));
+ return newConfig;
});
+ }, []);
+
+ React.useEffect(() => {
+ const savedConfig = localStorage.getItem('tracker.config');
+ if (savedConfig) {
+ setConfig(c => ({ ...c, ...JSON.parse(savedConfig) }));
+ }
+ }, []);
+
+ React.useEffect(() => {
+ const newDungeons = configureDungeons(config);
setDungeons(newDungeons);
}, [config]);
setState(mergeStates(autoState, manualState));
}, [autoState, manualState]);
- const value = React.useMemo(() => {
- return { config, setConfig, dungeons, setAutoState, setManualState, state };
+ React.useEffect(() => {
+ setLogic(applyLogic(config, dungeons, state));
}, [config, dungeons, state]);
+ const value = React.useMemo(() => {
+ return { config, dungeons, logic, saveConfig, setAutoState, setManualState, state };
+ }, [config, dungeons, logic, state]);
+
return <context.Provider value={value}>
{children}
</context.Provider>;