From 95ec3898ada7d16ff6ca92e1469b2cfa70c0ef78 Mon Sep 17 00:00:00 2001 From: izawartka <59137928+izawartka@users.noreply.github.com> Date: Sun, 27 Jul 2025 13:59:22 +0200 Subject: [PATCH] Refactored scenery list logic *Moved scenery list logic from SceneriesList to SceneryManager *Renamed SceneriesList to SceneryList *Updated InfoFooter texts -Removed sceneriesListService as it is not necessary anymore --- src/components/SceneryManager.js | 18 ++++++---- src/components/sidemenu/InfoFooter.js | 23 +++++------- src/components/toolbar/SceneriesList.js | 47 ------------------------- src/components/toolbar/SceneryList.js | 33 +++++++++++++++++ src/components/toolbar/Toolbar.js | 5 ++- src/services/sceneriesListService.js | 7 ---- 6 files changed, 55 insertions(+), 78 deletions(-) delete mode 100644 src/components/toolbar/SceneriesList.js create mode 100644 src/components/toolbar/SceneryList.js delete mode 100644 src/services/sceneriesListService.js diff --git a/src/components/SceneryManager.js b/src/components/SceneryManager.js index 089ff27..8a2db97 100644 --- a/src/components/SceneryManager.js +++ b/src/components/SceneryManager.js @@ -1,4 +1,4 @@ -import { useState, useCallback } from 'react'; +import { useState, useCallback, useEffect } from 'react'; import SceneryContext from '../contexts/SceneryContext'; import { useZoomPanEmitter } from '../hooks/useZoomPubSub'; import SceneryParser from '../model/scenery-parser'; @@ -11,6 +11,7 @@ import Constants from '../helpers/constants'; export default function SceneryManager(props) { const [isLoading, setIsLoading] = useState(false); const [scenery, setScenery] = useState(null); + const [sceneryListData, setSceneryListData] = useState(null); const { setCamera } = useZoomPanEmitter(); const myFetch = useCallback(async (url, toJson) => { @@ -23,13 +24,14 @@ export default function SceneryManager(props) { return toJson ? await response.json() : await response.blob(); }, []); - const getSceneryList = useCallback(async () => { + const updateSceneryList = useCallback(async () => { try { const url = Constants.sceneryFiles.fetchListUrl; - return await myFetch(url, true); + const listData = await myFetch(url, true); + setSceneryListData(listData || null); } catch(error) { - console.error(`Failed to fetch sceneries list`, error); - return null; + console.error(`Failed to fetch scenery list`, error); + setSceneryListData(null); } }, [myFetch]); @@ -84,8 +86,12 @@ export default function SceneryManager(props) { return await loadCustomScenery(file); }, [myFetch, loadCustomScenery]); + useEffect(() => { + if(!Constants.sceneryFiles.fetchDisable) updateSceneryList(); + }, [updateSceneryList]); + return ( - + {props.children} ); diff --git a/src/components/sidemenu/InfoFooter.js b/src/components/sidemenu/InfoFooter.js index be98bd2..a26a0cd 100644 --- a/src/components/sidemenu/InfoFooter.js +++ b/src/components/sidemenu/InfoFooter.js @@ -1,27 +1,20 @@ -import { useEffect, useState } from 'react'; -import { sceneriesListVersionDate$ } from "../../services/sceneriesListService"; +import { useContext } from 'react'; import Constants from '../../helpers/constants'; +import SceneryContext from '../../contexts/SceneryContext'; export default function InfoFooter() { - const [sceneriesVersionDate, setSceneriesVersionDate] = useState(null); + const { sceneryListData } = useContext(SceneryContext); + const sceneryListVersionDate = sceneryListData?.info?.versionDate || null; - useEffect(() => { - const subscription = sceneriesListVersionDate$.subscribe(date => { - setSceneriesVersionDate(date); - }); - - return () => subscription.unsubscribe(); - }, []); - - const sceneriesListText = sceneriesVersionDate ? - `included sceneries as of ${sceneriesVersionDate}` : - 'included sceneries list not available'; + const sceneryListText = sceneryListVersionDate ? + `included sceneries as of ${sceneryListVersionDate}` : + 'included sceneries not available'; return (
TD2 Visualizer v{Constants.buildVersion} masuo 2025.06 - {sceneriesListText} + {sceneryListText}
); } \ No newline at end of file diff --git a/src/components/toolbar/SceneriesList.js b/src/components/toolbar/SceneriesList.js deleted file mode 100644 index 5c2c35b..0000000 --- a/src/components/toolbar/SceneriesList.js +++ /dev/null @@ -1,47 +0,0 @@ -import { useContext, useCallback, useState, useEffect } from 'react'; -import SceneryContext from '../../contexts/SceneryContext'; -import { setSceneriesListVersionDate } from '../../services/sceneriesListService'; -import Constants from '../../helpers/constants'; - -export default function SceneriesList() { - const {getSceneryList, loadScenery} = useContext(SceneryContext); - const [ sceneriesListData, setSceneriesListData ] = useState(null); - - const handleSelectChange = async (event) => { - const name = event.target.value; - if (!name) return; - await loadScenery(name); - }; - - const updateSceneryList = useCallback(async () => { - const sceneryListData = await getSceneryList(); - setSceneriesListData(sceneryListData); - setSceneriesListVersionDate(sceneryListData?.info?.versionDate || null); - }, [getSceneryList]); - - useEffect(() => { - if(Constants.sceneryFiles.fetchDisable) return; - updateSceneryList(); - }, [updateSceneryList]); - - return ( -
- -
- ); -} - -function SceneriesListOption({ name }) { - // remove .lite.sc or .sc - const regex = /\.(lite\.)?sc$/i; - const displayName = name.replace(regex, ''); - - return ( - - ); -} \ No newline at end of file diff --git a/src/components/toolbar/SceneryList.js b/src/components/toolbar/SceneryList.js new file mode 100644 index 0000000..221b85e --- /dev/null +++ b/src/components/toolbar/SceneryList.js @@ -0,0 +1,33 @@ +import { useContext } from 'react'; +import SceneryContext from '../../contexts/SceneryContext'; + +export default function SceneryList() { + const { sceneryListData, loadScenery} = useContext(SceneryContext); + + const handleSelectChange = async (event) => { + const name = event.target.value; + if (!name) return; + await loadScenery(name); + }; + + return ( +
+ +
+ ); +} + +function SceneryListOption({ name }) { + // remove .lite.sc or .sc + const regex = /\.(lite\.)?sc$/i; + const displayName = name.replace(regex, ''); + + return ( + + ); +} \ No newline at end of file diff --git a/src/components/toolbar/Toolbar.js b/src/components/toolbar/Toolbar.js index d9b908c..0b8edca 100644 --- a/src/components/toolbar/Toolbar.js +++ b/src/components/toolbar/Toolbar.js @@ -1,15 +1,14 @@ -import React from 'react'; import './Toolbar.css'; import LoadingIndicator from './LoadingIndicator'; import CustomFileSelect from './CustomFileSelect'; import SideMenuToggle from './SideMenuToggle'; -import SceneriesList from './SceneriesList'; +import SceneryList from './SceneryList'; export default function Toolbar() { return (
- + or
diff --git a/src/services/sceneriesListService.js b/src/services/sceneriesListService.js deleted file mode 100644 index e256c13..0000000 --- a/src/services/sceneriesListService.js +++ /dev/null @@ -1,7 +0,0 @@ -import { BehaviorSubject } from 'rxjs'; - -export const sceneriesListVersionDate$ = new BehaviorSubject(null); - -export function setSceneriesListVersionDate(versionDate) { - sceneriesListVersionDate$.next(versionDate); -}