import { Theme } from './interfaces' type ThemeUpdateHandler = (theme: Theme) => any interface ThemeSubscriptions { [componentId: string]: ThemeUpdateHandler } export class ThemeNotifier { public subscriptions: ThemeSubscriptions = {} constructor(public theme: Theme) {} public setTheme(theme: Theme) { this.theme = theme Object.values(this.subscriptions) .forEach((cb: ThemeUpdateHandler) => cb(theme)) } public subscribe(componentId: string, callback: ThemeUpdateHandler) { this.subscriptions[componentId] = callback } public unsubscribe = (id: string) => { delete this.subscriptions[id] } }