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 Map from './map/Map';
import Toolbar from './toolbar/Toolbar'; import Toolbar from './toolbar/Toolbar';
import SideMenu from './sidemenu/SideMenu'; import SideMenu from './sidemenu/SideMenu';
import SettingsManager from './SettingsManager';
import LocList from './loclist/LocList'; import LocList from './loclist/LocList';
import DialogManager from './dialog/DialogManager'; 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 './Themes.css';
import './App.css'; import './App.css';
function App() { function App() {
const [sideMenuOpen, setSideMenuOpen] = useState(false);
const [distancePoints, setDistancePoints] = useState(null);
return ( return (
<EmbeddedContextProvider> <EmbeddedContextProvider>
<ThemeManager> <ThemeContextProvider>
<SettingsManager> <SettingsContextProvider>
<SceneryManager> <SceneryContextProvider>
<GradientsManager> <GradientsContextProvider>
<DistanceMeterContext.Provider value={{distancePoints, setDistancePoints}}> <DistanceMeterContextProvider>
<SideMenuContext.Provider value={{sideMenuOpen, setSideMenuOpen}}> <SideMenuContextProvider>
<AppContent /> <AppContent />
</SideMenuContext.Provider> </SideMenuContextProvider>
</DistanceMeterContext.Provider> </DistanceMeterContextProvider>
</GradientsManager> </GradientsContextProvider>
</SceneryManager> </SceneryContextProvider>
</SettingsManager> </SettingsContextProvider>
</ThemeManager> </ThemeContextProvider>
</EmbeddedContextProvider> </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 Constants from "../helpers/constants";
import {useContext, useMemo} from "react"; import SceneryContext from "./SceneryContext";
import GradientsContext from "../contexts/GradientsContext";
import SceneryContext from "../contexts/SceneryContext"; const GradientsContext = createContext();
export default GradientsContext;
function getMinMax(trackColorMode, scenery) { function getMinMax(trackColorMode, scenery) {
if (trackColorMode === 'elevation') { if (trackColorMode === 'elevation') {
@ -54,10 +56,8 @@ function createGradientDefs(scenery) {
); );
} }
export function GradientsManager(props) { export function GradientsContextProvider({children}) {
const { children } = props;
const { scenery } = useContext(SceneryContext); const { scenery } = useContext(SceneryContext);
const gradientDefs = useMemo(() => createGradientDefs(scenery), [scenery]); const gradientDefs = useMemo(() => createGradientDefs(scenery), [scenery]);
return ( 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 { createContext, useState, useCallback, useEffect, useRef } from 'react';
import SceneryContext from '../contexts/SceneryContext';
import { useZoomPanEmitter } from '../hooks/useZoomPubSub'; import { useZoomPanEmitter } from '../hooks/useZoomPubSub';
import SceneryParser from '../model/parsing/scenery-parser'; import SceneryParser from '../model/parsing/scenery-parser';
import SceneryParserLog from '../model/parsing/scenery-parser-log'; import SceneryParserLog from '../model/parsing/scenery-parser-log';
import { showCustomDialog, showDialog } from '../services/dialogService'; import { showCustomDialog, showDialog } from '../services/dialogService';
import { resetHoveredTracksStack } from '../services/trackHoverInfoService'; 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 Constants from '../helpers/constants';
import MiscHelper from '../helpers/miscHelper'; import MiscHelper from '../helpers/miscHelper';
import ElectrificationResolver from '../model/parsing/electrification-resolver'; 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 [isLoading, setIsLoading] = useState(false);
const [scenery, setScenery] = useState(null); const [scenery, setScenery] = useState(null);
const [sceneryListData, setSceneryListData] = useState(null); const [sceneryListData, setSceneryListData] = useState(null);
@ -180,7 +182,7 @@ export default function SceneryManager(props) {
return ( return (
<SceneryContext.Provider value={{ isLoading, scenery, sceneryListData, loadScenery, loadCustomScenery, electrificationStepModeStep }}> <SceneryContext.Provider value={{ isLoading, scenery, sceneryListData, loadScenery, loadCustomScenery, electrificationStepModeStep }}>
{props.children} {children}
</SceneryContext.Provider> </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 { createContext, useState, useCallback, useEffect } from 'react';
import SettingsContext from "../contexts/SettingsContext";
import Constants from "../helpers/constants"; 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 [ layers, setLayers ] = useState([]);
const [ trackColorMode, setTrackColorMode ] = useState(Constants.trackColorModeDefault); const [ trackColorMode, setTrackColorMode ] = useState(Constants.trackColorModeDefault);
const [ showTrackHoverInfo, setShowTrackHoverInfo ] = useState(true); const [ showTrackHoverInfo, setShowTrackHoverInfo ] = useState(true);
@ -32,7 +34,7 @@ export default function SettingsManager(props) {
extendedSignals, setExtendedSignals, extendedSignals, setExtendedSignals,
originalSignalNames, setOriginalSignalNames originalSignalNames, setOriginalSignalNames
}}> }}>
{ props.children } { children }
</SettingsContext.Provider> </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 { createContext, useState } from 'react';
import ThemeContext from "../contexts/ThemeContext";
export default function ThemeManager(props) { const ThemeContext = createContext();
export default ThemeContext;
export const ThemeContextProvider = ({children}) => {
const [ lightMode, setLightMode ] = useState(false); const [ lightMode, setLightMode ] = useState(false);
if(lightMode === true) { if(lightMode === true) {
@ -14,7 +16,7 @@ export default function ThemeManager(props) {
<ThemeContext.Provider value={{ <ThemeContext.Provider value={{
lightMode, setLightMode lightMode, setLightMode
}}> }}>
{ props.children } { children }
</ThemeContext.Provider> </ThemeContext.Provider>
); );
} }