import { toArray } from './helpers'; import { StateCache } from './StateCache'; import type { Types } from './types'; export class EventRegister { private stateCache: StateCache; private subscribedEvents: Map< (keyof S)[] | symbol, (current: S, prev: Partial) => void >; constructor(stateCache: StateCache) { this.stateCache = stateCache; this.subscribedEvents = new Map(); } add( callback: (current: S, prev: Partial) => void, trigger: Types.UpdateKeys | true, ) { const key = trigger === true ? Symbol('UPDATE_ALL') : toArray(trigger); this.subscribedEvents.set(key, callback); return () => this.subscribedEvents.delete(key); } triggerUpdated(updatedState?: Partial) { this.subscribedEvents.forEach((callback, trigger) => { if ( updatedState && (typeof trigger === 'symbol' || Object.keys(updatedState).some((key) => trigger.includes(key))) ) { callback(this.stateCache.current, this.stateCache.prev); } }); } triggerRefresh(refreshKey?: keyof S | (keyof S)[] | true) { this.subscribedEvents.forEach((callback, trigger) => { if ( refreshKey === true || typeof trigger === 'symbol' || toArray(refreshKey).some((key) => trigger.includes(key)) ) { callback(this.stateCache.current, this.stateCache.current); } }); } removeAll() { this.subscribedEvents.clear(); } }