replace redux with zustand

This commit is contained in:
2025-07-25 01:03:11 +02:00
parent 5448285211
commit 3bcd2e16a2
30 changed files with 510 additions and 534 deletions

26
src/store/flatastic.ts Normal file
View File

@@ -0,0 +1,26 @@
import { create } from "zustand";
import Flatastic from "@/api/flatastic";
import type { FlatasticChore } from "@/types/flatasticChore";
interface FlatasticStore {
chores: FlatasticChore[];
fetch: () => Promise<void>;
}
const useFlatasticStore = create<FlatasticStore>(
(set: (state: Partial<FlatasticStore>) => void) => ({
chores: [],
fetch: async () => {
if (!import.meta.env.VITE_FLATTASTIC_API_KEY) {
throw new Error("Flatastic API Key is not set");
}
const flatastic = new Flatastic(import.meta.env.VITE_FLATTASTIC_API_KEY);
const data = await flatastic.getTaskList();
console.log("Flatastic chores fetched:", data);
set({ chores: data as FlatasticChore[] });
},
}),
);
export { useFlatasticStore };

View File

@@ -1,43 +0,0 @@
import { configureStore } from "@reduxjs/toolkit";
import { persistReducer } from "redux-persist";
import timetableSlice from "./slices/timetableSlice";
import flatasticChoresSlice from "./slices/flatastiucChoresSlice";
import fetchTimetable from "./thunks/fetchTimetable";
import persistConfig from "./persist/persistConfig";
const persistedTimetableReducer = persistReducer(
persistConfig,
timetableSlice.reducer
);
const persistedFlatasticChoresReducer = persistReducer(
persistConfig,
flatasticChoresSlice.reducer
);
const store = configureStore({
reducer: {
timetable: persistedTimetableReducer,
flatasticChores: persistedFlatasticChoresReducer
},
middleware: (getDefaultMiddleware) =>
getDefaultMiddleware({
serializableCheck: {
ignoredActions: [
"persist/PERSIST",
"persist/REHYDRATE",
"persist/PAUSE",
"persist/FLUSH",
"persist/REGISTER",
"persist/PURGE",
],
},
}),
});
export { store, fetchTimetable };
export default store;
export type RootState = ReturnType<typeof store.getState>;
export type AppState = ReturnType<typeof store.getState>;
export type AppDispatch = typeof store.dispatch;
export type ThunkDispatch = typeof store.dispatch;

25
src/store/kvv.ts Normal file
View File

@@ -0,0 +1,25 @@
import { create } from "zustand";
import { fetchKvvDepartures } from "@/api/kvv";
import type { DepartureType } from "@/types/departureType";
import { devtools } from "zustand/middleware";
const useKVVStore = create(
devtools((set) => ({
pStreet: [] as DepartureType[],
hStreet: [] as DepartureType[],
fetch: async () => {
const hStreetStopId = 7000044;
const pStreetStopId = 7000045;
const hStreetData = await fetchKvvDepartures(hStreetStopId);
const pStreetData = await fetchKvvDepartures(pStreetStopId);
const hStreetJson = await hStreetData.json();
const pStreetJson = await pStreetData.json();
set({
hStreet: hStreetJson as DepartureType[],
pStreet: pStreetJson as DepartureType[],
});
},
})),
);
export { useKVVStore };

View File

@@ -1,8 +0,0 @@
import storage from 'redux-persist/lib/storage';
const persistConfig = {
key: 'root',
storage,
};
export default persistConfig;

View File

@@ -1,20 +0,0 @@
import { createSlice } from "@reduxjs/toolkit";
import fetchFlatasticChores from "../thunks/fetchFlatasticChores";
const timetableSlice = createSlice({
name: "chores",
initialState: {
chores: [] as any[],
},
reducers: {},
extraReducers: (builder) => {
builder.addCase(fetchFlatasticChores.fulfilled, (state, action) => {
// Filter out timetable-related entries
state.chores = Array.isArray(action.payload)
? action.payload.filter((item) => item.name !== "hstreeet" && item.name !== "pstreet")
: [];
});
},
});
export default timetableSlice;

View File

@@ -1,24 +0,0 @@
import { createSlice } from "@reduxjs/toolkit";
import fetchTimetable from "@thunks/fetchTimetable";
import { type DepartureList } from "@/types/types";
const timetableSlice = createSlice({
name: "timetable",
initialState: {
hStreet: {
departureList: [] as DepartureList[],
},
pStreet: {
departureList: [] as DepartureList[],
},
},
reducers: {},
extraReducers: (builder) => {
builder.addCase(fetchTimetable.fulfilled, (state, action) => {
state.hStreet = action.payload.hStreet;
state.pStreet = action.payload.pStreet;
});
},
});
export default timetableSlice;

View File

@@ -1,22 +0,0 @@
import { createAsyncThunk } from "@reduxjs/toolkit";
import { Flatastic } from "@/api/flatastic";
const fetchFlatasticChores = createAsyncThunk("flatastic/chores", async () => {
if (!import.meta.env.VITE_FLATTASTIC_API_KEY) {
throw new Error("Flatastic API Key is not set");
}
const flatastic = new Flatastic(import.meta.env.VITE_FLATTASTIC_API_KEY);
const data = await new Promise((resolve, reject) => {
flatastic.getTaskList((info) => {
if (info.error) {
reject(new Error(info.error));
} else {
resolve(info);
}
});
});
return data;
});
export default fetchFlatasticChores;

View File

@@ -1,18 +0,0 @@
import { createAsyncThunk } from "@reduxjs/toolkit";
import { callApi } from "@/api/api";
const fetchTimetable = createAsyncThunk("timetable/fetchTimeTable", async () => {
const hStreetStopId = 7000044;
const pStreetStopId = 7000045;
const hStreetData = await callApi(hStreetStopId);
const pStreetData = await callApi(pStreetStopId);
const hStreetJson = await hStreetData.json();
const pStreetJson = await pStreetData.json();
return {
hStreet: hStreetJson,
pStreet: pStreetJson,
};
});
export default fetchTimetable;