]> git.localhorst.tv Git - alttp.git/blob - resources/js/hooks/tracker.js
b77ee58dbf48233524feee501facad34a7242ab9
[alttp.git] / resources / js / hooks / tracker.js
1 import PropTypes from 'prop-types';
2 import React from 'react';
3
4 import { CONFIG, DUNGEONS, makeEmptyState, mergeStates } from '../helpers/tracker';
5
6 const context = React.createContext({});
7
8 export const useTracker = () => React.useContext(context);
9
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);
16
17         const saveConfig = React.useCallback((values) => {
18                 setConfig(s => {
19                         const newConfig = { ...s, ...values };
20                         localStorage.setItem('tracker.config', JSON.stringify(newConfig));
21                         return newConfig;
22                 });
23         }, []);
24
25         React.useEffect(() => {
26                 const savedConfig = localStorage.getItem('tracker.config');
27                 if (savedConfig) {
28                         setConfig(JSON.parse(savedConfig));
29                 }
30         }, []);
31
32         React.useEffect(() => {
33                 const newDungeons = DUNGEONS.map(dungeon => {
34                         const newDungeon = JSON.parse(JSON.stringify(dungeon));
35                         if (config.wildMap && dungeon.map) {
36                                 ++newDungeon.items;
37                         }
38                         if (config.wildCompass && dungeon.compass) {
39                                 ++newDungeon.items;
40                         }
41                         if (config.wildSmall) {
42                                 newDungeon.items += dungeon.sk;
43                         }
44                         if (config.wildBig && dungeon.bk && !dungeon.dropBk) {
45                                 ++newDungeon.items;
46                         }
47                         if (!config.bossShuffle && dungeon.boss) {
48                                 newDungeon.bosses = [dungeon.boss];
49                         }
50                         return newDungeon;
51                 });
52                 setDungeons(newDungeons);
53         }, [config]);
54
55         React.useEffect(() => {
56                 setState(mergeStates(autoState, manualState));
57         }, [autoState, manualState]);
58
59         const value = React.useMemo(() => {
60                 return { config, saveConfig, dungeons, setAutoState, setManualState, state };
61         }, [config, dungeons, state]);
62
63         return <context.Provider value={value}>
64                 {children}
65         </context.Provider>;
66 };
67
68 TrackerProvider.propTypes = {
69         children: PropTypes.node,
70 };