-import PropTypes from 'prop-types';
-import React from 'react';
-
-import {
- BOSSES,
- CONFIG,
- DUNGEONS,
- applyLogic,
- makeEmptyState,
- mergeStates,
-} from '../helpers/tracker';
-
-const context = React.createContext({});
-
-export const useTracker = () => React.useContext(context);
-
-export const TrackerProvider = ({ children }) => {
- const [config, setConfig] = React.useState(CONFIG);
- const [state, setState] = React.useState(makeEmptyState());
- const [autoState, setAutoState] = React.useState(makeEmptyState());
- const [manualState, setManualState] = React.useState(makeEmptyState());
- const [dungeons, setDungeons] = React.useState(DUNGEONS);
- const [logic, setLogic] = React.useState({});
-
- 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 = 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 (dungeon.boss) {
- newDungeon.bosses = config.bossShuffle ? BOSSES : [dungeon.boss];
- }
- return newDungeon;
- });
- setDungeons(newDungeons);
- }, [config]);
-
- React.useEffect(() => {
- setState(mergeStates(autoState, manualState));
- }, [autoState, manualState]);
-
- 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>;
-};
-
-TrackerProvider.propTypes = {
- children: PropTypes.node,
-};