Skip to content
Snippets Groups Projects
Commit 0b694797 authored by Matthias Feyll's avatar Matthias Feyll :cookie: Committed by matthiasf
Browse files

ui: refactor SubscriptionHandler

parent e8f6afc9
No related branches found
No related tags found
2 merge requests!1162Draft: Ui integration,!1128UI: Implement yang model view
import { PayloadAction, createSlice, current } from '@reduxjs/toolkit'; import { PayloadAction, createSlice } from '@reduxjs/toolkit';
import { SubscriptionThunks, THUNK_TYPE } from '@subscription/index'; import { SubscriptionThunks, THUNK_TYPE } from '@subscription/index';
import { RootState } from '..'; import { RootState } from '..';
import { addSubscription, unsubscribe, unsubscribeAll } from '../../utils/api/subscription.handler'; import { SubscriptionHandler } from '../../utils/api/subscription.handler';
import { startListening } from '../middleware/listener.middleware'; import { startListening } from '../middleware/listener.middleware';
import { setToken } from './user.reducer';
...@@ -43,12 +44,7 @@ const SubscriptionSlice = createSlice({ ...@@ -43,12 +44,7 @@ const SubscriptionSlice = createSlice({
initialState, initialState,
reducers: { reducers: {
triggerSubscription: (state, {payload}: PayloadAction<ThunkEntityDTO>) => { triggerSubscription: (state, {payload}: PayloadAction<ThunkEntityDTO>) => {
// overwrite old subscription if it exists
const currentState = current(state)
const currentThunk = currentState.thunks[CATEGORIES[payload.category]];
const newThunk: ThunkEntity = {...payload, locked: true}; const newThunk: ThunkEntity = {...payload, locked: true};
state.thunks[CATEGORIES[payload.category]] = newThunk; state.thunks[CATEGORIES[payload.category]] = newThunk;
}, },
...@@ -63,14 +59,23 @@ const SubscriptionSlice = createSlice({ ...@@ -63,14 +59,23 @@ const SubscriptionSlice = createSlice({
state.thunks[CATEGORIES[payload.category]] = {...thunk, id: payload.id, locked: false}; state.thunks[CATEGORIES[payload.category]] = {...thunk, id: payload.id, locked: false};
}, },
stopAllSubscriptions: (state) => { removeAll: (state) => {
unsubscribeAll() SubscriptionHandler.unsubscribeAll()
state.thunks = initialState.thunks; state.thunks = initialState.thunks;
}, },
}, },
}) })
export const { triggerSubscription, stopAllSubscriptions } = SubscriptionSlice.actions export const { triggerSubscription } = SubscriptionSlice.actions
// on logout remove all subscriptions
startListening({
predicate: (action) => setToken.match(action) && action.payload.token === null,
effect: async (_, listenerApi) => {
listenerApi.dispatch(SubscriptionSlice.actions.removeAll());
},
})
// unsubscribe old subscription // unsubscribe old subscription
startListening({ startListening({
...@@ -78,7 +83,7 @@ startListening({ ...@@ -78,7 +83,7 @@ startListening({
effect: async (action, listenerApi) => { effect: async (action, listenerApi) => {
const {subscription} = listenerApi.getOriginalState() as RootState; const {subscription} = listenerApi.getOriginalState() as RootState;
const lastThunk = subscription.thunks[CATEGORIES[action.payload.category]]; const lastThunk = subscription.thunks[CATEGORIES[action.payload.category]];
unsubscribe(lastThunk.id); SubscriptionHandler.unsubscribe(lastThunk.id);
}, },
}) })
...@@ -95,7 +100,7 @@ startListening({ ...@@ -95,7 +100,7 @@ startListening({
} }
const subscription = await listenerApi.dispatch(thunkFn(action.payload.payload)); const subscription = await listenerApi.dispatch(thunkFn(action.payload.payload));
const thunkId = await addSubscription(subscription.payload); const thunkId = await SubscriptionHandler.add(subscription.payload);
listenerApi.dispatch(SubscriptionSlice.actions.setThunkId({id: thunkId, category: action.payload.category})); listenerApi.dispatch(SubscriptionSlice.actions.setThunkId({id: thunkId, category: action.payload.category}));
}, },
......
import { QueryActionCreatorResult } from '@reduxjs/toolkit/query'; import { QueryActionCreatorResult } from '@reduxjs/toolkit/query';
type SubscriptionType = QueryActionCreatorResult<any>; type Subscription = QueryActionCreatorResult<any>;
interface SubscriptionEntity { interface Entity {
subscription: SubscriptionType, subscription: Subscription,
id: number id: number
} }
interface SubscriptionReducerState {
subscriptions: SubscriptionEntity[]
}
const initialState: SubscriptionReducerState = { const initialState = {
subscriptions: [] subscriptions: [] as Entity[]
} }
let state = initialState; export const SubscriptionHandler = (() => {
let state = initialState;
const add = (subscription: Subscription): number => {
const id = state.subscriptions.length;
const subscriptionEntity: Entity = {
subscription,
id
}
export const addSubscription = (subscription: SubscriptionType): number => { state.subscriptions = [...state.subscriptions, subscriptionEntity];
const id = state.subscriptions.length;
const subscriptionEntity: SubscriptionEntity = { return id;
subscription,
id
} }
state.subscriptions = [...state.subscriptions, subscriptionEntity];
return id; const unsubscribeAll = () => {
} state.subscriptions.forEach(({ subscription }) => {
unsubscribeAction(subscription)
});
state.subscriptions = initialState.subscriptions;
}
export const unsubscribeAll = () => { /**
state.subscriptions.forEach(({ subscription }) => { * @param id
unsubscribeAction(subscription) * @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);
state.subscriptions = initialState.subscriptions; if (subscription) {
} unsubscribeAction(subscription.subscription);
}
/** return !!subscription;
* @param id }
* @returns returns true if the subscription was stopped, false if it was not found
*/
export const unsubscribe = (id: number): boolean => {
const subscription = state.subscriptions.find(({ id: subscriptionId }) => subscriptionId === id);
if (subscription) { /**
unsubscribeAction(subscription.subscription); * Actual unsubscribe action
*
* @param subscription
*/
const unsubscribeAction = (subscription: Subscription) => {
subscription.unsubscribe();
} }
return !!subscription;
}
/** return {
* Actual unsubscribe action add,
* unsubscribe,
* @param subscription unsubscribeAll
*/ }
const unsubscribeAction = (subscription: SubscriptionType) => { })();
subscription.unsubscribe(); \ No newline at end of file
}
\ No newline at end of file
import { AuthServiceLoginApiArg, AuthServiceLoginApiResponse, useAuthServiceLoginMutation } from "@api/api"; import { AuthServiceLoginApiArg, AuthServiceLoginApiResponse, useAuthServiceLoginMutation } from "@api/api";
import { unsubscribeAll } from "@api/subscription.handler";
import { getCookieValue } from "@helper/coookie"; import { getCookieValue } from "@helper/coookie";
import { useAppDispatch, useAppSelector } from "@hooks"; import { useAppDispatch, useAppSelector } from "@hooks";
import { setToken } from "@reducer/user.reducer"; import { setToken } from "@reducer/user.reducer";
...@@ -100,7 +99,6 @@ export const AuthProvider = ({ children }) => { ...@@ -100,7 +99,6 @@ export const AuthProvider = ({ children }) => {
} }
const logout = () => { const logout = () => {
unsubscribeAll();
dispatch(setToken(null)); dispatch(setToken(null));
// TODO: purge other information // TODO: purge other information
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment