From 067eba95b5aa415c88458f8002f2de1661d01e97 Mon Sep 17 00:00:00 2001 From: ISA Date: Wed, 21 May 2025 12:27:36 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20priorityConfig=20vollst=C3=A4ndig=20auf?= =?UTF-8?q?=20Redux=20umgestellt=20=E2=80=93=20Slice,=20Thunk=20und=20Serv?= =?UTF-8?q?ice=20integriert=20und=20zentral=20ausgelagert?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 32 +++++++++++++++++++ components/mainComponent/MapComponent.js | 24 ++++---------- config/appVersion.js | 2 +- redux/slices/database/priorityConfigSlice.js | 16 ++++++++++ redux/store.js | 2 ++ .../database/fetchPriorityConfigThunk.js | 7 ++++ .../database/fetchPriorityConfigService.js | 6 ++++ 7 files changed, 71 insertions(+), 18 deletions(-) create mode 100644 redux/slices/database/priorityConfigSlice.js create mode 100644 redux/thunks/database/fetchPriorityConfigThunk.js create mode 100644 services/database/fetchPriorityConfigService.js diff --git a/CHANGELOG.md b/CHANGELOG.md index 9e284ab39..e9b53f134 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,38 @@ Alle bedeutenden Änderungen an diesem Projekt werden in dieser Datei dokumentie --- +## [1.1.128] – 2025-05-21 + +### Changed + +- 🧠 Neue Datenquelle `priorityConfig` vollständig in Redux integriert: + - Neuer Service: `fetchPriorityConfigService.js` unter `/services/database/` + - Neuer Thunk: `fetchPriorityConfigThunk.js` unter `/redux/thunks/database/` + - Neuer Slice: `priorityConfigSlice.js` unter `/redux/slices/database/` + - Registrierung im Store (`priorityConfigReducer`) ergänzt +- `MapComponent.js` nutzt jetzt `dispatch(fetchPriorityConfigThunk())` zur Initialisierung +- Alle alten `useState` + `fetch(...)` für Prioritätsdaten entfernt + +### Fixed + +- ❌ Fehler `fetchPriorityConfigThunk is not defined` behoben durch Import und richtigen Store-Zugriff +- ❌ Bug: Redux Slice zeigte keine Daten – Ursache war fehlendes `dispatch` der Thunk-Funktion → behoben + +### Cleanup + +- 🧼 `fetchPriorityConfig` wird ausschließlich zentral über Redux gehandhabt + +### Architekturhinweis + +- 🔄 Komponente wie `MapComponent` ist der Trigger: + Thunks, Services und Redux-Slices alleine führen nichts aus – sie müssen durch ein `dispatch(...)` aktiviert werden. + +### Version + +- 📦 Version erhöht auf **1.1.128** + +--- + ## [1.1.127] – 2025-05-21 ### Changed diff --git a/components/mainComponent/MapComponent.js b/components/mainComponent/MapComponent.js index 12ef4c769..6453c6635 100644 --- a/components/mainComponent/MapComponent.js +++ b/components/mainComponent/MapComponent.js @@ -59,6 +59,8 @@ import { fetchGisSystemStaticThunk } from "../../redux/thunks/webservice/fetchGi import { fetchGisStationsStaticDistrictThunk } from "../../redux/thunks/webservice/fetchGisStationsStaticDistrictThunk"; import { fetchGisStationsStatusDistrictThunk } from "../../redux/thunks/webservice/fetchGisStationsStatusDistrictThunk"; import { fetchLocationDevicesThunk } from "../../redux/thunks/database/fetchLocationDevicesThunk"; +import { fetchPriorityConfigThunk } from "../../redux/thunks/database/fetchPriorityConfigThunk"; +import { selectPriorityConfig } from "../../redux/slices/database/priorityConfigSlice"; const MapComponent = ({ locations, onLocationUpdate, lineCoordinates }) => { const dispatch = useDispatch(); @@ -70,7 +72,7 @@ const MapComponent = ({ locations, onLocationUpdate, lineCoordinates }) => { const poiTypStatus = useSelector((state) => state.poiTypes.status); const isPoiTypLoaded = useSelector((state) => state.poiTypes.status === "succeeded"); const [locationDeviceData, setLocationDeviceData] = useState([]); - const [priorityConfig, setPriorityConfig] = useState([]); + const [menuItemAdded, setMenuItemAdded] = useState(false); const [isPopupOpen, setIsPopupOpen] = useState(false); @@ -78,6 +80,7 @@ const MapComponent = ({ locations, onLocationUpdate, lineCoordinates }) => { const statusSystem = useSelector((state) => state.gisSystemStatic.status); const statusStaticDistrict = useSelector((state) => state.gisStationsStaticDistrict.status); const statusStatusDistrict = useSelector((state) => state.gisStationsStatusDistrict.status); + const priorityConfig = useSelector(selectPriorityConfig); const openPopupWithCoordinates = (e) => { const coordinates = `${e.latlng.lat.toFixed(5)}, ${e.latlng.lng.toFixed(5)}`; @@ -211,7 +214,9 @@ const MapComponent = ({ locations, onLocationUpdate, lineCoordinates }) => { dispatch(setUserId(params.get("u"))); }, [dispatch]); //--------------------------------------------------------------- - + useEffect(() => { + dispatch(fetchPriorityConfigThunk()); + }, [dispatch]); //-------------------------------------------------------- useEffect(() => { const endpoint = "/api/talas_v5_DB/gisLines/readGisLines"; @@ -533,22 +538,7 @@ const MapComponent = ({ locations, onLocationUpdate, lineCoordinates }) => { }, [map, poiLayerRef, isPoiTypLoaded, menuItemAdded, hasRights, isRightsLoaded]); //-------------------------------------------- // rote Marker ganz oben wenn überlappen sind - useEffect(() => { - const fetchPriorityConfig = async () => { - try { - const res = await fetch("/api/talas_v5_DB/priorityConfig"); - if (!res.ok) { - throw new Error(`HTTP error! status: ${res.status}`); - } - const data = await res.json(); - setPriorityConfig(data); - } catch (error) { - console.error("Failed to load priority configuration:", error); - } - }; - fetchPriorityConfig(); - }, []); //-------------------------------------------- useEffect(() => { diff --git a/config/appVersion.js b/config/appVersion.js index 95404f387..3c64022da 100644 --- a/config/appVersion.js +++ b/config/appVersion.js @@ -1,2 +1,2 @@ // /config/appVersion -export const APP_VERSION = "1.1.128"; +export const APP_VERSION = "1.1.129"; diff --git a/redux/slices/database/priorityConfigSlice.js b/redux/slices/database/priorityConfigSlice.js new file mode 100644 index 000000000..e40c1245a --- /dev/null +++ b/redux/slices/database/priorityConfigSlice.js @@ -0,0 +1,16 @@ +// redux/slices/database/priorityConfigSlice.js +import { fetchPriorityConfigThunk } from "../../thunks/database/fetchPriorityConfigThunk"; + +import { createSlice } from "@reduxjs/toolkit"; +const slice = createSlice({ + name: "priorityConfig", + initialState: { data: [], status: "idle" }, + extraReducers: (builder) => { + builder.addCase(fetchPriorityConfigThunk.fulfilled, (state, action) => { + state.status = "succeeded"; + state.data = action.payload; + }); + }, +}); +export default slice.reducer; +export const selectPriorityConfig = (state) => state.priorityConfig.data; diff --git a/redux/store.js b/redux/store.js index 74616ac6f..2b1e0cc58 100644 --- a/redux/store.js +++ b/redux/store.js @@ -22,6 +22,7 @@ import readPoiMarkersStoreReducer from "./slices/readPoiMarkersStoreSlice"; import selectedAreaReducer from "./slices/selectedAreaSlice"; import zoomTriggerReducer from "./slices/zoomTriggerSlice"; import urlParameterReducer from "./slices/urlParameterSlice"; +import priorityConfigReducer from "./slices/database/priorityConfigSlice"; export const store = configureStore({ reducer: { @@ -46,5 +47,6 @@ export const store = configureStore({ selectedArea: selectedAreaReducer, zoomTrigger: zoomTriggerReducer, urlParameter: urlParameterReducer, + priorityConfig: priorityConfigReducer, }, }); diff --git a/redux/thunks/database/fetchPriorityConfigThunk.js b/redux/thunks/database/fetchPriorityConfigThunk.js new file mode 100644 index 000000000..1b78988f7 --- /dev/null +++ b/redux/thunks/database/fetchPriorityConfigThunk.js @@ -0,0 +1,7 @@ +// /redux/thunks/database/fetchPriorityConfigThunk.js +import { createAsyncThunk } from "@reduxjs/toolkit"; +import { fetchPriorityConfigService } from "../../../services/database/fetchPriorityConfigService"; + +export const fetchPriorityConfigThunk = createAsyncThunk("priorityConfig/fetch", async () => { + return await fetchPriorityConfigService(); +}); diff --git a/services/database/fetchPriorityConfigService.js b/services/database/fetchPriorityConfigService.js new file mode 100644 index 000000000..0ef45d791 --- /dev/null +++ b/services/database/fetchPriorityConfigService.js @@ -0,0 +1,6 @@ +// /services/database/fetchLocationDevicesService.js +export const fetchPriorityConfigService = async () => { + const response = await fetch("/api/talas_v5_DB/priorityConfig"); + if (!response.ok) throw new Error("Fehler beim Laden der Prioritätskonfiguration"); + return await response.json(); +};