Skip to content
Snippets Groups Projects
routine.manager.ts 1.94 KiB
Newer Older
  • Learn to ignore specific revisions
  • Matthias Feyll's avatar
    Matthias Feyll committed
    import { infoMessage, warnMessage } from '@helper/debug'
    
    import { QueryActionCreatorResult } from '@reduxjs/toolkit/query'
    
    Matthias Feyll's avatar
    Matthias Feyll committed
    import { Category, CategoryType } from '@shared/types/category.type'
    
    type Routine = QueryActionCreatorResult<any>
    
    Matthias Feyll's avatar
    Matthias Feyll committed
    
    interface Entity {
    
        routine: Routine
    
    Matthias Feyll's avatar
    Matthias Feyll committed
    
    interface RoutineState {
        routines: Record<CategoryType, Entity | null>
    }
    
    const initalState: RoutineState = {
        routines: {
            DEVICE: null,
            TABLE: null,
            TAB: null
        }
    
    Matthias Feyll's avatar
    Matthias Feyll committed
    * Routine manager is a singleton that holds all running routines.
    * The redux store holds any persistable information about the routines.
    * The routine objects itself are stored in the RoutineManager.
    */
    
    Matthias Feyll's avatar
    Matthias Feyll committed
    export const RoutineManager = (() => {
    
    Matthias Feyll's avatar
    Matthias Feyll committed
        let state = initalState
    
    Matthias Feyll's avatar
    Matthias Feyll committed
        const add = (routine: Routine, category: CategoryType): boolean => {
            const entity: Entity = {
    
    Matthias Feyll's avatar
    Matthias Feyll committed
                routine: routine,
            }
    
    
    Matthias Feyll's avatar
    Matthias Feyll committed
            state.routines = {
                ...state.routines,
                [category]: entity
            }
            infoMessage("Routine subscribed to category " + category)
    
    Matthias Feyll's avatar
    Matthias Feyll committed
            return true
    
    Matthias Feyll's avatar
    Matthias Feyll committed
        }
    
        const unsubscribeAll = () => {
    
    Matthias Feyll's avatar
    Matthias Feyll committed
            Object.keys(state.routines)
                .forEach((category) => {
                    unsubscribe(category as CategoryType)
                })
    
    Matthias Feyll's avatar
    Matthias Feyll committed
            state = initalState
    
    Matthias Feyll's avatar
    Matthias Feyll committed
         * @returns returns true if the routine was stopped, false if it was not found
         */
    
    Matthias Feyll's avatar
    Matthias Feyll committed
        const unsubscribe = (category: CategoryType): boolean => {
            const entity = state.routines[category]
    
    Matthias Feyll's avatar
    Matthias Feyll committed
            if (entity) {
                entity.routine.unsubscribe()
                state.routines[category] = null
                infoMessage("Routine unsubscribed from category " + category)
    
    Matthias Feyll's avatar
    Matthias Feyll committed
            if (!!entity) {
                warnMessage("Desired routine to unsubscribe does not exist in category " + Category[category])
            }
    
    Matthias Feyll's avatar
    Matthias Feyll committed
            return !!entity
    
    Matthias Feyll's avatar
    Matthias Feyll committed
        }
    
        return {
            add,
            unsubscribe,
    
    Matthias Feyll's avatar
    Matthias Feyll committed
    })()