Replace managers with context providers

- Replaced all manager components with context providers
    - GradientsManager -> GradientsContextProvider
    - SettingsManager -> SettingsContextProvider
    - SceneryManager -> SceneryContextProvider
    - ThemeManager -> ThemeContextProvider
- Moved state logic from App to new context providers:
    - DistanceMeterContextProvider
    - SideMenuContextProvider
This commit is contained in:
izawartka 2026-08-13 19:01:45 +02:00
parent 142056b8f1
commit 1d86f0f42f
13 changed files with 79 additions and 69 deletions

View File

@ -1,38 +1,34 @@
import { useState } from 'react';
import { EmbeddedContextProvider, useEmbeddedContext } from '../contexts/EmbeddedContext';
import { ThemeContextProvider} from '../contexts/ThemeContext';
import { SettingsContextProvider } from '../contexts/SettingsContext';
import { SceneryContextProvider } from '../contexts/SceneryContext';
import { GradientsContextProvider } from '../contexts/GradientsContext';
import { DistanceMeterContextProvider } from '../contexts/DistanceMeterContext';
import { SideMenuContextProvider } from '../contexts/SideMenuContext';
import Map from './map/Map';
import Toolbar from './toolbar/Toolbar';
import SideMenu from './sidemenu/SideMenu';
import SettingsManager from './SettingsManager';
import LocList from './loclist/LocList';
import DialogManager from './dialog/DialogManager';
import DistanceMeterContext from '../contexts/DistanceMeterContext';
import {GradientsManager} from "./GradientsManager";
import SideMenuContext from '../contexts/SideMenuContext';
import SceneryManager from './SceneryManager';
import ThemeManager from './ThemeManager';
import {EmbeddedContextProvider, useEmbeddedContext} from '../contexts/EmbeddedContext';
import './Themes.css';
import './App.css';
function App() {
const [sideMenuOpen, setSideMenuOpen] = useState(false);
const [distancePoints, setDistancePoints] = useState(null);
return (
<EmbeddedContextProvider>
<ThemeManager>
<SettingsManager>
<SceneryManager>
<GradientsManager>
<DistanceMeterContext.Provider value={{distancePoints, setDistancePoints}}>
<SideMenuContext.Provider value={{sideMenuOpen, setSideMenuOpen}}>
<ThemeContextProvider>
<SettingsContextProvider>
<SceneryContextProvider>
<GradientsContextProvider>
<DistanceMeterContextProvider>
<SideMenuContextProvider>
<AppContent />
</SideMenuContext.Provider>
</DistanceMeterContext.Provider>
</GradientsManager>
</SceneryManager>
</SettingsManager>
</ThemeManager>
</SideMenuContextProvider>
</DistanceMeterContextProvider>
</GradientsContextProvider>
</SceneryContextProvider>
</SettingsContextProvider>
</ThemeContextProvider>
</EmbeddedContextProvider>
);
}

View File

@ -1,4 +0,0 @@
import { createContext } from 'react';
const DistanceMeterContext = createContext();
export default DistanceMeterContext;

View File

@ -0,0 +1,16 @@
import { createContext, useState } from 'react';
const DistanceMeterContext = createContext();
export default DistanceMeterContext;
export const DistanceMeterContextProvider = ({children}) => {
const [distancePoints, setDistancePoints] = useState([]);
return (
<DistanceMeterContext.Provider value={{
distancePoints, setDistancePoints
}}>
{ children }
</DistanceMeterContext.Provider>
);
}

View File

@ -1,4 +0,0 @@
import { createContext } from 'react';
const GradientsContext = createContext();
export default GradientsContext;

View File

@ -1,7 +1,9 @@
import {createContext, useContext, useMemo} from "react";
import Constants from "../helpers/constants";
import {useContext, useMemo} from "react";
import GradientsContext from "../contexts/GradientsContext";
import SceneryContext from "../contexts/SceneryContext";
import SceneryContext from "./SceneryContext";
const GradientsContext = createContext();
export default GradientsContext;
function getMinMax(trackColorMode, scenery) {
if (trackColorMode === 'elevation') {
@ -54,10 +56,8 @@ function createGradientDefs(scenery) {
);
}
export function GradientsManager(props) {
const { children } = props;
export function GradientsContextProvider({children}) {
const { scenery } = useContext(SceneryContext);
const gradientDefs = useMemo(() => createGradientDefs(scenery), [scenery]);
return (

View File

@ -1,4 +0,0 @@
import { createContext } from 'react';
const SceneryContext = createContext();
export default SceneryContext;

View File

@ -1,17 +1,19 @@
import { useState, useCallback, useEffect, useRef } from 'react';
import SceneryContext from '../contexts/SceneryContext';
import { createContext, useState, useCallback, useEffect, useRef } from 'react';
import { useZoomPanEmitter } from '../hooks/useZoomPubSub';
import SceneryParser from '../model/parsing/scenery-parser';
import SceneryParserLog from '../model/parsing/scenery-parser-log';
import { showCustomDialog, showDialog } from '../services/dialogService';
import { resetHoveredTracksStack } from '../services/trackHoverInfoService';
import SceneryLoadedDialog from './scenery-loaded-dialog/SceneryLoadedDialog';
import SceneryLoadedDialog from '../components/scenery-loaded-dialog/SceneryLoadedDialog';
import Constants from '../helpers/constants';
import MiscHelper from '../helpers/miscHelper';
import ElectrificationResolver from '../model/parsing/electrification-resolver';
import { useEmbeddedContext } from '../contexts/EmbeddedContext';
import { useEmbeddedContext } from './EmbeddedContext';
export default function SceneryManager(props) {
const SceneryContext = createContext();
export default SceneryContext;
export const SceneryContextProvider = ({children}) => {
const [isLoading, setIsLoading] = useState(false);
const [scenery, setScenery] = useState(null);
const [sceneryListData, setSceneryListData] = useState(null);
@ -180,7 +182,7 @@ export default function SceneryManager(props) {
return (
<SceneryContext.Provider value={{ isLoading, scenery, sceneryListData, loadScenery, loadCustomScenery, electrificationStepModeStep }}>
{props.children}
{children}
</SceneryContext.Provider>
);
}
}

View File

@ -1,4 +0,0 @@
import { createContext } from 'react';
const SettingsContext = createContext();
export default SettingsContext;

View File

@ -1,8 +1,10 @@
import { useCallback, useEffect, useState } from "react";
import SettingsContext from "../contexts/SettingsContext";
import { createContext, useState, useCallback, useEffect } from 'react';
import Constants from "../helpers/constants";
export default function SettingsManager(props) {
const SettingsContext = createContext();
export default SettingsContext;
export const SettingsContextProvider = ({children}) => {
const [ layers, setLayers ] = useState([]);
const [ trackColorMode, setTrackColorMode ] = useState(Constants.trackColorModeDefault);
const [ showTrackHoverInfo, setShowTrackHoverInfo ] = useState(true);
@ -32,7 +34,7 @@ export default function SettingsManager(props) {
extendedSignals, setExtendedSignals,
originalSignalNames, setOriginalSignalNames
}}>
{ props.children }
{ children }
</SettingsContext.Provider>
);
}
}

View File

@ -1,4 +0,0 @@
import { createContext } from 'react';
const SideMenuContext = createContext();
export default SideMenuContext;

View File

@ -0,0 +1,16 @@
import { createContext, useState } from 'react';
const SideMenuContext = createContext();
export default SideMenuContext;
export const SideMenuContextProvider = ({children}) => {
const [sideMenuOpen, setSideMenuOpen] = useState(false);
return (
<SideMenuContext.Provider value={{
sideMenuOpen, setSideMenuOpen
}}>
{ children }
</SideMenuContext.Provider>
);
}

View File

@ -1,4 +0,0 @@
import { createContext } from 'react';
const ThemeContext = createContext();
export default ThemeContext;

View File

@ -1,7 +1,9 @@
import { useState } from "react";
import ThemeContext from "../contexts/ThemeContext";
import { createContext, useState } from 'react';
export default function ThemeManager(props) {
const ThemeContext = createContext();
export default ThemeContext;
export const ThemeContextProvider = ({children}) => {
const [ lightMode, setLightMode ] = useState(false);
if(lightMode === true) {
@ -14,7 +16,7 @@ export default function ThemeManager(props) {
<ThemeContext.Provider value={{
lightMode, setLightMode
}}>
{ props.children }
{ children }
</ThemeContext.Provider>
);
}