Skip to content
Snippets Groups Projects
subscription.handler.ts 1.5 KiB
Newer Older
  • Learn to ignore specific revisions
  • 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];
    
            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
        }
    })();