Newer
Older
import { QueryActionCreatorResult } from '@reduxjs/toolkit/query';
type Subscription = QueryActionCreatorResult<any>;
interface Entity {
subscription: Subscription,
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];
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);
}
/**
* Actual unsubscribe action
*
* @param subscription
*/
const unsubscribeAction = (subscription: Subscription) => {
subscription.unsubscribe();
return {
add,
unsubscribe,
unsubscribeAll
}
})();