1 import PropTypes from 'prop-types';
2 import React from 'react';
10 } from '../helpers/tracker';
12 const context = React.createContext({});
14 export const useTracker = () => React.useContext(context);
16 export const TrackerProvider = ({ children }) => {
17 const [config, setConfig] = React.useState(CONFIG);
18 const [state, setState] = React.useState(makeEmptyState());
19 const [autoState, setAutoState] = React.useState(makeEmptyState());
20 const [manualState, setManualState] = React.useState(makeEmptyState());
21 const [dungeons, setDungeons] = React.useState(DUNGEONS);
22 const [logic, setLogic] = React.useState({});
24 const saveConfig = React.useCallback((values) => {
26 const newConfig = { ...s, ...values };
27 localStorage.setItem('tracker.config', JSON.stringify(newConfig));
32 React.useEffect(() => {
33 const savedConfig = localStorage.getItem('tracker.config');
35 setConfig(c => ({ ...c, ...JSON.parse(savedConfig) }));
39 React.useEffect(() => {
40 const newDungeons = DUNGEONS.map(dungeon => {
41 const newDungeon = JSON.parse(JSON.stringify(dungeon));
42 if (config.wildMap && dungeon.map) {
45 if (config.wildCompass && dungeon.compass) {
48 if (config.wildSmall) {
49 newDungeon.items += dungeon.sk;
51 if (config.wildBig && dungeon.bk && !dungeon.dropBk) {
54 if (!config.bossShuffle && dungeon.boss) {
55 newDungeon.bosses = [dungeon.boss];
59 setDungeons(newDungeons);
62 React.useEffect(() => {
63 setState(mergeStates(autoState, manualState));
64 }, [autoState, manualState]);
66 React.useEffect(() => {
67 setLogic(applyLogic(config, dungeons, state));
68 }, [config, dungeons, state]);
70 const value = React.useMemo(() => {
72 return { config, dungeons, logic, saveConfig, setAutoState, setManualState, state };
73 }, [config, dungeons, logic, state]);
75 return <context.Provider value={value}>
80 TrackerProvider.propTypes = {
81 children: PropTypes.node,