From 4f81552d57b118546f0ae07735e21cbc4ca709b4 Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@stud.h-da.de> Date: Wed, 25 Sep 2024 15:09:56 +0200 Subject: [PATCH] ui: refactor utils path --- react-ui/docs/routine_pattern.md | 18 ++++ react-ui/docs/routine_pattern.png | Bin 0 -> 102971 bytes .../action.routine.ts} | 0 .../device.routine.ts} | 6 +- .../src/components/subscriptions/index.ts | 26 ------ .../components/view/device/device.view.tsx | 10 +- .../view_model/device.table.viewmodel.ts | 2 +- .../components/view_model/device.viewmodel.ts | 2 +- react-ui/src/index.tsx | 5 +- react-ui/src/routes.tsx | 10 +- react-ui/src/{utils => shared}/api/api.ts | 0 .../src/{utils => shared}/helper/coookie.ts | 0 react-ui/src/{utils => shared}/icons/icons.ts | 0 .../layouts/basic.layout.tsx | 4 +- .../layouts/login.layout.tsx | 0 .../protected.layout/protected.layout.scss | 0 .../protected.layout/protected.layout.tsx | 8 +- .../provider/auth.provider.tsx | 0 react-ui/src/shared/utils/routine.manager.ts | 88 ++++++++++++++++++ react-ui/src/stores/index.ts | 4 +- react-ui/src/stores/persist.store.ts | 6 +- .../{ => device.reducer}/device.reducer.ts | 1 - .../device.reducer}/mne.subscription.ts | 12 +-- ...cription.reducer.ts => routine.reducer.ts} | 68 ++++++++------ .../src/utils/api/subscription.handler.ts | 68 -------------- react-ui/tsconfig.json | 13 +-- react-ui/vite.config.mjs | 13 +-- 27 files changed, 196 insertions(+), 168 deletions(-) create mode 100644 react-ui/docs/routine_pattern.md create mode 100644 react-ui/docs/routine_pattern.png rename react-ui/src/components/{subscriptions/action.subscription.ts => routines/action.routine.ts} (100%) rename react-ui/src/components/{subscriptions/device.subscription.ts => routines/device.routine.ts} (86%) delete mode 100644 react-ui/src/components/subscriptions/index.ts rename react-ui/src/{utils => shared}/api/api.ts (100%) rename react-ui/src/{utils => shared}/helper/coookie.ts (100%) rename react-ui/src/{utils => shared}/icons/icons.ts (100%) rename react-ui/src/{utils => shared}/layouts/basic.layout.tsx (88%) rename react-ui/src/{utils => shared}/layouts/login.layout.tsx (100%) rename react-ui/src/{utils => shared}/layouts/protected.layout/protected.layout.scss (100%) rename react-ui/src/{utils => shared}/layouts/protected.layout/protected.layout.tsx (98%) rename react-ui/src/{utils => shared}/provider/auth.provider.tsx (100%) create mode 100644 react-ui/src/shared/utils/routine.manager.ts rename react-ui/src/stores/reducer/{ => device.reducer}/device.reducer.ts (97%) rename react-ui/src/{components/subscriptions => stores/reducer/device.reducer}/mne.subscription.ts (75%) rename react-ui/src/stores/reducer/{subscription.reducer.ts => routine.reducer.ts} (51%) delete mode 100644 react-ui/src/utils/api/subscription.handler.ts diff --git a/react-ui/docs/routine_pattern.md b/react-ui/docs/routine_pattern.md new file mode 100644 index 000000000..97a29da31 --- /dev/null +++ b/react-ui/docs/routine_pattern.md @@ -0,0 +1,18 @@ +## Routine pattern +The goal is to get a generic architecture to invoke persist and rerun asynchronous actions (thunks). + + +### Goals +* Invoke asyncronous actions +* Rerun actions after page reload by persisting +* Ability to access and manipulate the redux state +* Give a simple interface to the outside world by abstracting the task to achive the upper goals + + +### Usage +Add + + +### Description +The image displays the whole workflow starting by the user that clicks a button. The actual routine pattern takes place within the red border. + diff --git a/react-ui/docs/routine_pattern.png b/react-ui/docs/routine_pattern.png new file mode 100644 index 0000000000000000000000000000000000000000..86b582398523ed51922d8ebad316c15be59265db GIT binary patch literal 102971 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	TXYl1Gq9K%>XO|KO^NnfVX9 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 literal 0 HcmV?d00001 diff --git a/react-ui/src/components/subscriptions/action.subscription.ts b/react-ui/src/components/routines/action.routine.ts similarity index 100% rename from react-ui/src/components/subscriptions/action.subscription.ts rename to react-ui/src/components/routines/action.routine.ts diff --git a/react-ui/src/components/subscriptions/device.subscription.ts b/react-ui/src/components/routines/device.routine.ts similarity index 86% rename from react-ui/src/components/subscriptions/device.subscription.ts rename to react-ui/src/components/routines/device.routine.ts index 5afcc7c68..0290f637d 100644 --- a/react-ui/src/components/subscriptions/device.subscription.ts +++ b/react-ui/src/components/routines/device.routine.ts @@ -1,10 +1,10 @@ import { NetworkElementServiceGetAllFlattenedApiArg, api } from "@api/api"; -import { setDevices } from "@reducer/device.reducer"; +import { setDevices } from "@reducer/device.reducer/device.reducer"; import { setUser } from "@reducer/user.reducer"; import { createAsyncThunk } from "@reduxjs/toolkit"; import { RootState } from "src/stores"; -import { startListening } from "../../../src/stores/middleware/listener.middleware"; -import { FETCH_DEVICE_ACTION } from "./action.subscription"; +import { startListening } from "../../stores/middleware/listener.middleware"; +import { FETCH_DEVICE_ACTION } from "./action.routine"; // continously fetch devices const FETCH_DEVICES_INTERVAL = 15000; // in ms diff --git a/react-ui/src/components/subscriptions/index.ts b/react-ui/src/components/subscriptions/index.ts deleted file mode 100644 index 2a3e02f20..000000000 --- a/react-ui/src/components/subscriptions/index.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { AsyncThunk } from '@reduxjs/toolkit'; -import { fetchDevicesThunk } from './device.subscription'; -import { fetchSelectedMneThunk } from './mne.subscription'; - - -export enum THUNK_TYPE { - MNE = 'device/fetch', - DEVICE = 'mne/fetch', -} - -export interface SubscriptionThunkModule { - thunkFn?: AsyncThunk<any, any, {}> - type: THUNK_TYPE, -} - -export const SubscriptionThunks: SubscriptionThunkModule[] = [ - { - thunkFn: fetchDevicesThunk, - type: THUNK_TYPE.DEVICE - }, { - - thunkFn: fetchSelectedMneThunk, - type: THUNK_TYPE.MNE - } -] - diff --git a/react-ui/src/components/view/device/device.view.tsx b/react-ui/src/components/view/device/device.view.tsx index 0ef5c05b9..c85ce6be6 100644 --- a/react-ui/src/components/view/device/device.view.tsx +++ b/react-ui/src/components/view/device/device.view.tsx @@ -1,10 +1,10 @@ import { useDeviceViewModel } from '@viewmodel/device.viewmodel'; import { useRef } from 'react'; -import { Button, Col, Container, FloatingLabel, Form, Nav, NavLink, Row } from 'react-bootstrap'; +import { Button, Col, Container, Form, Nav, NavLink, Row } from 'react-bootstrap'; import { useTranslation } from 'react-i18next'; -import { DeviceViewTabs, DeviceViewTabValues } from './device.view.tabs'; import './device.scss'; import { DeviceViewTable } from './device.view.table'; +import { DeviceViewTabs, DeviceViewTabValues } from './device.view.tabs'; function DeviceView() { const { t } = useTranslation('common'); @@ -27,9 +27,9 @@ function DeviceView() { <Row className='align-items-center'> <Col sm={3}> - <Form.Group controlId='device.search' className='p-0 mx-1 pt-2'> - <Form.Control type="text" placeholder={t('device.search.placeholder')} ref={searchRef} /> - </Form.Group> + <Form.Group controlId='device.search' className='p-0 mx-1 pt-2'> + <Form.Control type="text" placeholder={t('device.search.placeholder')} ref={searchRef} /> + </Form.Group> </Col> <Col sm={{ span: 2, offset: 2 }} className='border-right pt-2'> <Button variant='primary' className='w-100 my-auto'>{t('device.add_device_button')}</Button> diff --git a/react-ui/src/components/view_model/device.table.viewmodel.ts b/react-ui/src/components/view_model/device.table.viewmodel.ts index 22d8ae9e0..0802d6b57 100644 --- a/react-ui/src/components/view_model/device.table.viewmodel.ts +++ b/react-ui/src/components/view_model/device.table.viewmodel.ts @@ -1,5 +1,5 @@ import { useAppDispatch } from "@hooks"; -import { Device, setSelectedDevice } from "@reducer/device.reducer"; +import { Device, setSelectedDevice } from "@reducer/device.reducer/device.reducer"; import { useEffect, useState } from "react"; export const useDeviceTableViewModel = (searchRef) => { diff --git a/react-ui/src/components/view_model/device.viewmodel.ts b/react-ui/src/components/view_model/device.viewmodel.ts index ec75927f0..6dd01d07e 100644 --- a/react-ui/src/components/view_model/device.viewmodel.ts +++ b/react-ui/src/components/view_model/device.viewmodel.ts @@ -1,5 +1,5 @@ import { useAppDispatch, useAppSelector } from "@hooks"; -import { setActiveTab as setActiveTabState } from "@reducer/device.reducer"; +import { setActiveTab as setActiveTabState } from "@reducer/device.reducer/device.reducer"; import { DeviceViewTabValues } from "@view/device/device.view.tabs"; export const useDeviceViewModel = () => { diff --git a/react-ui/src/index.tsx b/react-ui/src/index.tsx index a2ddc81a9..dddcf5c07 100644 --- a/react-ui/src/index.tsx +++ b/react-ui/src/index.tsx @@ -1,5 +1,5 @@ import React from 'react' -import ReactDOM, { Container } from 'react-dom/client' +import ReactDOM from 'react-dom/client' import { RouterProvider } from 'react-router-dom' @@ -12,8 +12,8 @@ import { ToastContainer } from 'react-toastify' import { PersistGate } from 'redux-persist/integration/react' import './i18n/config' import { router } from './routes' +import './shared/icons/icons' import { persistor, store } from './stores' -import './utils/icons/icons' const installToastify = () => { return ( @@ -34,4 +34,3 @@ ReactDOM.createRoot(document.getElementById("root")).render( </React.StrictMode> ); -import './components/subscriptions' \ No newline at end of file diff --git a/react-ui/src/routes.tsx b/react-ui/src/routes.tsx index b273246d9..a63d6d875 100644 --- a/react-ui/src/routes.tsx +++ b/react-ui/src/routes.tsx @@ -1,8 +1,8 @@ -import { BasicLayout } from "@layout/basic.layout" -import { LoginLayout } from "@layout/login.layout" -import { ProtectedLayout } from "@layout/protected.layout/protected.layout" -import DeviceView from "@view/device/device.view" -import { createBrowserRouter, createRoutesFromElements, Navigate, Route } from "react-router-dom" +import { BasicLayout } from "@layout/basic.layout"; +import { LoginLayout } from "@layout/login.layout"; +import { ProtectedLayout } from "@layout/protected.layout/protected.layout"; +import DeviceView from "@view/device/device.view"; +import { createBrowserRouter, createRoutesFromElements, Navigate, Route } from "react-router-dom"; export const DEVICE_URL = '/device/'; export const LOGIN_URL = '/login'; diff --git a/react-ui/src/utils/api/api.ts b/react-ui/src/shared/api/api.ts similarity index 100% rename from react-ui/src/utils/api/api.ts rename to react-ui/src/shared/api/api.ts diff --git a/react-ui/src/utils/helper/coookie.ts b/react-ui/src/shared/helper/coookie.ts similarity index 100% rename from react-ui/src/utils/helper/coookie.ts rename to react-ui/src/shared/helper/coookie.ts diff --git a/react-ui/src/utils/icons/icons.ts b/react-ui/src/shared/icons/icons.ts similarity index 100% rename from react-ui/src/utils/icons/icons.ts rename to react-ui/src/shared/icons/icons.ts diff --git a/react-ui/src/utils/layouts/basic.layout.tsx b/react-ui/src/shared/layouts/basic.layout.tsx similarity index 88% rename from react-ui/src/utils/layouts/basic.layout.tsx rename to react-ui/src/shared/layouts/basic.layout.tsx index 7b7f2b11c..640af3e1b 100644 --- a/react-ui/src/utils/layouts/basic.layout.tsx +++ b/react-ui/src/shared/layouts/basic.layout.tsx @@ -4,11 +4,11 @@ import { useOutlet } from "react-router-dom"; export const BasicLayout = () => { const outlet = useOutlet(); - + return ( <AuthProvider> - {outlet} + {outlet} </AuthProvider> ) } \ No newline at end of file diff --git a/react-ui/src/utils/layouts/login.layout.tsx b/react-ui/src/shared/layouts/login.layout.tsx similarity index 100% rename from react-ui/src/utils/layouts/login.layout.tsx rename to react-ui/src/shared/layouts/login.layout.tsx diff --git a/react-ui/src/utils/layouts/protected.layout/protected.layout.scss b/react-ui/src/shared/layouts/protected.layout/protected.layout.scss similarity index 100% rename from react-ui/src/utils/layouts/protected.layout/protected.layout.scss rename to react-ui/src/shared/layouts/protected.layout/protected.layout.scss diff --git a/react-ui/src/utils/layouts/protected.layout/protected.layout.tsx b/react-ui/src/shared/layouts/protected.layout/protected.layout.tsx similarity index 98% rename from react-ui/src/utils/layouts/protected.layout/protected.layout.tsx rename to react-ui/src/shared/layouts/protected.layout/protected.layout.tsx index 588491230..faff61c40 100644 --- a/react-ui/src/utils/layouts/protected.layout/protected.layout.tsx +++ b/react-ui/src/shared/layouts/protected.layout/protected.layout.tsx @@ -1,16 +1,16 @@ import logo from '@assets/logo.svg'; import { faCircleUser, faRightFromBracket } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import { useAppDispatch, useAppSelector } from '@hooks'; import { useAuth } from "@provider/auth.provider"; +import { fetchPnds } from '@reducer/device.reducer/device.reducer'; +import { fetchUser } from '@reducer/user.reducer'; +import { DEVICE_URL, LOGIN_URL } from '@routes'; import React, { useEffect } from "react"; import { Dropdown } from "react-bootstrap"; import { useTranslation } from "react-i18next"; import { Link, Outlet, useNavigate } from "react-router-dom"; import "./protected.layout.scss"; -import { useAppDispatch, useAppSelector } from '@hooks'; -import { fetchUser } from '@reducer/user.reducer'; -import { fetchPnds } from '@reducer/device.reducer'; -import { DEVICE_URL, LOGIN_URL } from '@routes'; export const ProtectedLayout = () => { diff --git a/react-ui/src/utils/provider/auth.provider.tsx b/react-ui/src/shared/provider/auth.provider.tsx similarity index 100% rename from react-ui/src/utils/provider/auth.provider.tsx rename to react-ui/src/shared/provider/auth.provider.tsx diff --git a/react-ui/src/shared/utils/routine.manager.ts b/react-ui/src/shared/utils/routine.manager.ts new file mode 100644 index 000000000..c86e30d4a --- /dev/null +++ b/react-ui/src/shared/utils/routine.manager.ts @@ -0,0 +1,88 @@ +import { fetchSelectedMneThunk } from '@reducer/device.reducer/mne.subscription'; +import { AsyncThunk } from '@reduxjs/toolkit'; +import { QueryActionCreatorResult } from '@reduxjs/toolkit/query'; +import { fetchDevicesThunk } from '@routine/device.routine'; + +type Routine = QueryActionCreatorResult<any>; + +interface Entity { + routine: Routine, + id: number +} + +const initialState = { + routines: [] as Entity[] +} + +export enum THUNK_KEY { + MNE = 'device/fetch', + DEVICE = 'mne/fetch', +} + +export const RoutineDictionary = new Map<THUNK_KEY,AsyncThunk<any, any, {}>>([ + [THUNK_KEY.DEVICE, fetchDevicesThunk], + [THUNK_KEY.MNE, fetchSelectedMneThunk] +]) + + +/** + * Routine manager is a singleton that holds all running routines. + * The redux store holds any persistable information about the routines. + * The routines objects itself are stored in the RoutineManager. + */ +export const RoutineManager = (() => { + let state = initialState; + const add = (routine: Routine): number => { + const id = state.routines.length; + + const newEntity: Entity = { + routine: routine, + id + } + + state.routines = [...state.routines, newEntity]; + + return id; + } + + + const unsubscribeAll = () => { + state.routines.forEach(({ routine: subscription }) => { + _unsubscribe(subscription) + }); + + state.routines = initialState.routines; + } + + /** + * @param id + * @returns returns true if the routine was stopped, false if it was not found + */ + const unsubscribe = (id: number): boolean => { + const routine = state.routines.find(({ id: routineId }) => routineId === id); + + if (routine) { + _unsubscribe(routine.routine); + } + + return !!routine; + } + + /** + * Actual unsubscribe process. + * This process is extracted to have a single process of unsubscribing. + * + * @param subscription + */ + const _unsubscribe = (subscription: Routine) => { + subscription.unsubscribe(); + // TODO remove from state + } + + + return { + add, + unsubscribe, + unsubscribeAll + } +})(); \ No newline at end of file diff --git a/react-ui/src/stores/index.ts b/react-ui/src/stores/index.ts index 8d2be362f..1b3c3335e 100644 --- a/react-ui/src/stores/index.ts +++ b/react-ui/src/stores/index.ts @@ -1,6 +1,6 @@ import { configureStore } from '@reduxjs/toolkit' import { setupListeners } from '@reduxjs/toolkit/query' -import { FETCH_DEVICE_ACTION, FETCH_MNE_ACTION } from '@subscription/action.subscription' +import { FETCH_DEVICE_ACTION, FETCH_MNE_ACTION } from '@routine/action.routine' import { FLUSH, PAUSE, PERSIST, PURGE, REGISTER, REHYDRATE } from 'redux-persist' import persistStore from 'redux-persist/es/persistStore' import { emptySplitApi } from './api.store' @@ -14,7 +14,7 @@ export const store = configureStore({ middleware: (getDefaultMiddleware) => getDefaultMiddleware({ serializableCheck: { - ignoredActions: [FLUSH, REHYDRATE, PAUSE, PERSIST, PURGE, REGISTER, FETCH_DEVICE_ACTION + '/fulfilled', FETCH_MNE_ACTION + '/fulfilled'], + ignoredActions: [FLUSH, REHYDRATE, PAUSE, PERSIST, PURGE, REGISTER, FETCH_DEVICE_ACTION + '/fulfilled', FETCH_MNE_ACTION + '/fulfilled', 'routine/addRoutine'], }, }).prepend(listenerMiddleware.middleware).concat(emptySplitApi.middleware, rtkQueryErrorLogger), }) diff --git a/react-ui/src/stores/persist.store.ts b/react-ui/src/stores/persist.store.ts index f14de1bd7..65ade7d3e 100644 --- a/react-ui/src/stores/persist.store.ts +++ b/react-ui/src/stores/persist.store.ts @@ -1,5 +1,5 @@ -import deviceReducer from "@reducer/device.reducer"; -import subscriptionReducer from "@reducer/subscription.reducer"; +import deviceReducer from "@reducer/device.reducer/device.reducer"; +import routineReducer from "@reducer/routine.reducer"; import userReducer from "@reducer/user.reducer"; import { combineReducers } from "redux"; import { persistReducer } from "redux-persist"; @@ -18,7 +18,7 @@ const rootPersistConfig = { const rootReducer = combineReducers({ user: userReducer, device: deviceReducer, - subscription: subscriptionReducer, + routine: routineReducer, [emptySplitApi.reducerPath]: emptySplitApi.reducer, }) diff --git a/react-ui/src/stores/reducer/device.reducer.ts b/react-ui/src/stores/reducer/device.reducer/device.reducer.ts similarity index 97% rename from react-ui/src/stores/reducer/device.reducer.ts rename to react-ui/src/stores/reducer/device.reducer/device.reducer.ts index 5919062d2..9f21bcbeb 100644 --- a/react-ui/src/stores/reducer/device.reducer.ts +++ b/react-ui/src/stores/reducer/device.reducer/device.reducer.ts @@ -1,7 +1,6 @@ import { api, NetworkelementFlattenedManagedNetworkElement, NetworkelementManagedNetworkElement, PndPrincipalNetworkDomain, PndServiceGetPndListApiArg } from '@api/api'; import { createAsyncThunk, createSlice, PayloadAction } from '@reduxjs/toolkit'; import { DeviceViewTabValues } from '@view/device/device.view.tabs'; -import { startListening } from '../middleware/listener.middleware'; export type Device = NetworkelementFlattenedManagedNetworkElement; diff --git a/react-ui/src/components/subscriptions/mne.subscription.ts b/react-ui/src/stores/reducer/device.reducer/mne.subscription.ts similarity index 75% rename from react-ui/src/components/subscriptions/mne.subscription.ts rename to react-ui/src/stores/reducer/device.reducer/mne.subscription.ts index b2b036007..d84e7c5a5 100644 --- a/react-ui/src/components/subscriptions/mne.subscription.ts +++ b/react-ui/src/stores/reducer/device.reducer/mne.subscription.ts @@ -1,17 +1,17 @@ import { api, NetworkElementServiceGetApiArg } from "@api/api"; -import { Device, setSelectedDevice, setSelectedMne } from "@reducer/device.reducer"; -import { CATEGORIES, triggerSubscription } from "@reducer/subscription.reducer"; +import { Device, setSelectedDevice, setSelectedMne } from "@reducer/device.reducer/device.reducer"; +import { addRoutine, CATEGORIES } from "@reducer/routine.reducer"; import { createAsyncThunk } from "@reduxjs/toolkit"; +import { THUNK_KEY } from "@utils/routine.manager"; import { RootState } from "src/stores"; -import { THUNK_TYPE } from "."; -import { startListening } from "../../../src/stores/middleware/listener.middleware"; -import { FETCH_MNE_ACTION } from "./action.subscription"; +import { FETCH_MNE_ACTION } from "../../../components/routines/action.routine"; +import { startListening } from "../../middleware/listener.middleware"; // fetch mne if selected device is set startListening({ predicate: (action) => setSelectedDevice.match(action) && !!action.payload, effect: async (action, listenerApi) => { - listenerApi.dispatch(triggerSubscription({category: CATEGORIES.TAB, thunkType: THUNK_TYPE.MNE, payload: action.payload})); + listenerApi.dispatch(addRoutine({category: CATEGORIES.TAB, thunkKey: THUNK_KEY.MNE, payload: action.payload})); }, }) diff --git a/react-ui/src/stores/reducer/subscription.reducer.ts b/react-ui/src/stores/reducer/routine.reducer.ts similarity index 51% rename from react-ui/src/stores/reducer/subscription.reducer.ts rename to react-ui/src/stores/reducer/routine.reducer.ts index 344b42d25..85ddd7b2b 100644 --- a/react-ui/src/stores/reducer/subscription.reducer.ts +++ b/react-ui/src/stores/reducer/routine.reducer.ts @@ -1,14 +1,14 @@ import { PayloadAction, createSlice } from '@reduxjs/toolkit'; -import { SubscriptionThunks, THUNK_TYPE } from '@subscription/index'; +import { RoutineDictionary, RoutineManager, THUNK_KEY } from '@utils/routine.manager'; +import { REHYDRATE } from 'redux-persist'; import { RootState } from '..'; -import { SubscriptionHandler } from '../../utils/api/subscription.handler'; import { startListening } from '../middleware/listener.middleware'; import { setToken } from './user.reducer'; interface ThunkEntityDTO { - thunkType: THUNK_TYPE, + thunkKey: THUNK_KEY, payload: any /** @@ -19,11 +19,11 @@ interface ThunkEntityDTO { interface ThunkEntity extends ThunkEntityDTO { id?: number, - locked: boolean + locked: boolean, } -export interface SubscriptionReducerState { +export interface ReducerState { thunks: {[key in keyof typeof CATEGORIES]: ThunkEntity | null} } @@ -32,18 +32,18 @@ export enum CATEGORIES { TAB } -const initialState: SubscriptionReducerState = { +const initialState: ReducerState = { thunks: { TABLE: null, TAB: null } } -const SubscriptionSlice = createSlice({ - name: 'subscription', +const RoutineSlice = createSlice({ + name: 'routine', initialState, reducers: { - triggerSubscription: (state, {payload}: PayloadAction<ThunkEntityDTO>) => { + addRoutine: (state, {payload}: PayloadAction<ThunkEntityDTO>) => { const newThunk: ThunkEntity = {...payload, locked: true}; state.thunks[CATEGORIES[payload.category]] = newThunk; }, @@ -60,51 +60,67 @@ const SubscriptionSlice = createSlice({ }, removeAll: (state) => { - SubscriptionHandler.unsubscribeAll() + RoutineManager.unsubscribeAll() state.thunks = initialState.thunks; }, }, }) -export const { triggerSubscription } = SubscriptionSlice.actions +export const { addRoutine } = RoutineSlice.actions -// on logout remove all subscriptions +// on logout remove all routine startListening({ predicate: (action) => setToken.match(action) && action.payload.token === null, effect: async (_, listenerApi) => { - listenerApi.dispatch(SubscriptionSlice.actions.removeAll()); + listenerApi.dispatch(RoutineSlice.actions.removeAll()); }, }) +// on rehydrate add all persistet routines +startListening({ + predicate: ({type}) => type === REHYDRATE, + effect: async (_, listenerApi) => { + const {routine} = listenerApi.getState() as RootState; + for (const [_,thunk] of Object.entries<ThunkEntity>(routine.thunks)) { + if (!thunk) { + return; + } + + const dto: ThunkEntityDTO = thunk; + listenerApi.dispatch(addRoutine(dto)); + } + }, +}) -// unsubscribe old subscription +// unsubscribe old routine startListening({ - predicate: (action) => triggerSubscription.match(action), + predicate: (action) => addRoutine.match(action), effect: async (action, listenerApi) => { - const {subscription} = listenerApi.getOriginalState() as RootState; - const lastThunk = subscription.thunks[CATEGORIES[action.payload.category]]; - SubscriptionHandler.unsubscribe(lastThunk.id); + const {routine} = listenerApi.getOriginalState() as RootState; + const lastThunk = routine.thunks[CATEGORIES[action.payload.category]]; + if (lastThunk) { + RoutineManager.unsubscribe(lastThunk.id); + } }, }) -// add new subscription +// add new routine startListening({ - predicate: (action) => triggerSubscription.match(action), + predicate: (action) => addRoutine.match(action), effect: async (action, listenerApi) => { - const {thunkType} = action.payload as ThunkEntity; + const {thunkKey} = action.payload as ThunkEntity; - const {thunkFn} = SubscriptionThunks.find(({type}) => type === thunkType); + const thunkFn = RoutineDictionary.get(thunkKey); if (!thunkFn) { // TODO throw new Error('Thunk not found'); } const subscription = await listenerApi.dispatch(thunkFn(action.payload.payload)); - const thunkId = await SubscriptionHandler.add(subscription.payload); - listenerApi.dispatch(SubscriptionSlice.actions.setThunkId({id: thunkId, category: action.payload.category})); - + const thunkId = await RoutineManager.add(subscription.payload); + listenerApi.dispatch(RoutineSlice.actions.setThunkId({id: thunkId, category: action.payload.category})); }, }) -export default SubscriptionSlice.reducer +export default RoutineSlice.reducer diff --git a/react-ui/src/utils/api/subscription.handler.ts b/react-ui/src/utils/api/subscription.handler.ts deleted file mode 100644 index e065879f0..000000000 --- a/react-ui/src/utils/api/subscription.handler.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { QueryActionCreatorResult } from '@reduxjs/toolkit/query'; - -type Subscription = QueryActionCreatorResult<any>; - -interface Entity { - subscription: Subscription, - id: number -} - - -const initialState = { - subscriptions: [] as Entity[] -} - -export const SubscriptionHandler = (() => { - let state = initialState; - const add = (subscription: Subscription): number => { - const id = state.subscriptions.length; - - const subscriptionEntity: Entity = { - subscription, - id - } - - state.subscriptions = [...state.subscriptions, subscriptionEntity]; - - return id; - } - - - const unsubscribeAll = () => { - state.subscriptions.forEach(({ subscription }) => { - unsubscribeAction(subscription) - }); - - state.subscriptions = initialState.subscriptions; - } - - /** - * @param id - * @returns returns true if the subscription was stopped, false if it was not found - */ - const unsubscribe = (id: number): boolean => { - const subscription = state.subscriptions.find(({ id: subscriptionId }) => subscriptionId === id); - - if (subscription) { - unsubscribeAction(subscription.subscription); - } - - return !!subscription; - } - - /** - * Actual unsubscribe action - * - * @param subscription - */ - const unsubscribeAction = (subscription: Subscription) => { - subscription.unsubscribe(); - } - - - return { - add, - unsubscribe, - unsubscribeAll - } -})(); \ No newline at end of file diff --git a/react-ui/tsconfig.json b/react-ui/tsconfig.json index 41c9c8f66..6bd0a18b7 100644 --- a/react-ui/tsconfig.json +++ b/react-ui/tsconfig.json @@ -23,17 +23,18 @@ "baseUrl": ".", "paths": { "@assets/*": ["assets/*"], - "@api/*": ["src/utils/api/*"], + "@api/*": ["src/shared/api/*"], "@viewmodel/*": ["src/components/view_model/*"], "@view/*": ["src/components/view/*"], "@reducer/*": ["src/stores/reducer/*"], - "@provider/*": ["src/utils/provider/*"], - "@layout/*": ["src/utils/layouts/*"], + "@provider/*": ["src/shared/provider/*"], + "@layout/*": ["src/shared/layouts/*"], "@hooks": ["src/hooks"], "@routes": ["src/routes.tsx"], - "@task/*": ["src/utils/tasks/*"], - "@helper/*": ["src/utils/helper/*"], - "@subscription/*": ["src/components/subscriptions/*"] + "@task/*": ["src/shared/tasks/*"], + "@helper/*": ["src/shared/helper/*"], + "@routine/*": ["src/components/routines/*"], + "@utils/*": ["src/shared/utils/*"] } }, "include": [ diff --git a/react-ui/vite.config.mjs b/react-ui/vite.config.mjs index 96be1c844..d36e8cf3a 100644 --- a/react-ui/vite.config.mjs +++ b/react-ui/vite.config.mjs @@ -36,17 +36,18 @@ export default defineConfig({ resolve: { alias: { '@assets': '/assets', - '@api': '/src/utils/api', + '@api': '/src/shared/api', '@viewmodel': '/src/components/view_model', '@view': '/src/components/view', '@reducer': '/src/stores/reducer', - '@provider': '/src/utils/provider', - '@layout': '/src/utils/layouts', + '@provider': '/src/shared/provider', + '@layout': '/src/shared/layouts', '@hooks': '/src/hooks.ts', - '@task': '/src/utils/tasks', - '@helper': '/src/utils/helper', + '@task': '/src/shared/tasks', + '@helper': '/src/shared/helper', '@routes': '/src/routes.tsx', - '@subscription': '/src/components/subscriptions', + '@routine': '/src/components/routines', + '@utils': '/src/shared/utils', }, }, -- GitLab