1 import PropTypes from 'prop-types';
2 import React from 'react';
4 import { CONFIG, DUNGEONS, makeEmptyState, mergeStates } from '../helpers/tracker';
6 const context = React.createContext({});
8 export const useTracker = () => React.useContext(context);
10 export const TrackerProvider = ({ children }) => {
11 const [config, setConfig] = React.useState(CONFIG);
12 const [state, setState] = React.useState(makeEmptyState());
13 const [autoState, setAutoState] = React.useState(makeEmptyState());
14 const [manualState, setManualState] = React.useState(makeEmptyState());
15 const [dungeons, setDungeons] = React.useState(DUNGEONS);
17 const saveConfig = React.useCallback((values) => {
19 const newConfig = { ...s, ...values };
20 localStorage.setItem('tracker.config', JSON.stringify(newConfig));
25 React.useEffect(() => {
26 const savedConfig = localStorage.getItem('tracker.config');
28 setConfig(JSON.parse(savedConfig));
32 React.useEffect(() => {
33 const newDungeons = DUNGEONS.map(dungeon => {
34 const newDungeon = JSON.parse(JSON.stringify(dungeon));
35 if (config.wildMap && dungeon.map) {
38 if (config.wildCompass && dungeon.compass) {
41 if (config.wildSmall) {
42 newDungeon.items += dungeon.sk;
44 if (config.wildBig && dungeon.bk && !dungeon.dropBk) {
47 if (!config.bossShuffle && dungeon.boss) {
48 newDungeon.bosses = [dungeon.boss];
52 setDungeons(newDungeons);
55 React.useEffect(() => {
56 setState(mergeStates(autoState, manualState));
57 }, [autoState, manualState]);
59 const value = React.useMemo(() => {
60 return { config, saveConfig, dungeons, setAutoState, setManualState, state };
61 }, [config, dungeons, state]);
63 return <context.Provider value={value}>
68 TrackerProvider.propTypes = {
69 children: PropTypes.node,