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