import BlocBase from "./BlocBase"; import { ChangeEvent, TransitionEvent } from "./types"; export interface BlocObserverOptions { /* Called whenever any state changes global or local, Bloc or Cubit. */ onChange?: (bloc: BlocBase, event: ChangeEvent) => void; /* Called only when a Bloc changes (global or local). */ onTransition?: (bloc: BlocBase, event: TransitionEvent) => void; } export default class BlocObserver { onChange: (bloc: BlocBase, event: ChangeEvent) => void onTransition: (bloc: BlocBase, event: TransitionEvent) => void constructor(methods: BlocObserverOptions = {}) { this.onChange = methods.onChange ? methods.onChange : this.defaultAction; this.onTransition = methods.onTransition ? methods.onTransition : this.defaultAction; } // trigger events readonly addChange = (bloc: BlocBase, state: any) => { this.onChange(bloc, this.createChangeEvent(bloc, state)); } readonly addTransition = (bloc: BlocBase, state: any, event: any) => { this.onTransition(bloc, this.createTransitionEvent(bloc, state, event)); } readonly addBlocAdded = (bloc: BlocBase) => { this.onBlocAdded(bloc); } readonly addBlocRemoved = (bloc: BlocBase) => { this.onBlocRemoved(bloc); } // consume private readonly defaultAction = () => {} onBlocAdded: (bloc: BlocBase) => void = this.defaultAction onBlocRemoved: (bloc: BlocBase) => void = this.defaultAction private createTransitionEvent(bloc: BlocBase, state: any, event: any): TransitionEvent { return { currentState: bloc.state, event, nextState: state, } } private createChangeEvent(bloc: BlocBase, state: any): ChangeEvent { return { currentState: bloc.state, nextState: state, } } }