UNPKG

@furman1331/page-scroller

Version:

Amazing plugin for creating smooth scroll on your website

68 lines (58 loc) 1.87 kB
import type { IEmitter, IEventHandlerMap, TEmitterEventType, TEmitterEventHandler, TEmitterEventWildcardHandler, TEmitterHandlerList, TEmitterWildcardHandlerList, } from '@/types/emitter' export enum EmitterEvents { onSectionChange = 'onSectionChange', onBeforeSectionChange = 'onBeforeSectionChange', onSlideChange = 'onSlideChange', onBeforeSlideChange = 'onBeforeSlideChange', onPageScrollStatusChanged = 'onPageScrollStatusChanged', onPageScrollModeAutomatic = 'onPageScrollModeAutomatic', onPageScrollModeManual = 'onPageScrollModeManual', } function mitt<Events extends Record<TEmitterEventType, unknown>>(all?: IEventHandlerMap<Events>): IEmitter<Events> { type GenericEventHandler = TEmitterEventHandler<Events[keyof Events]> | TEmitterEventWildcardHandler<Events> all = all || new Map() return { all, on<Key extends keyof Events>(type: Key, handler: GenericEventHandler) { const handlers: Array<GenericEventHandler> | undefined = all!.get(type) if (handlers) { handlers.push(handler) } else { all!.set(type, [handler] as TEmitterHandlerList<Events[keyof Events]>) } }, off<Key extends keyof Events>(type: Key, handler?: GenericEventHandler) { const handlers: Array<GenericEventHandler> | undefined = all!.get(type) if (handlers) { if (handler) { handlers.splice(handlers.indexOf(handler) >>> 0, 1) } else { all!.set(type, []) } } }, emit<Key extends keyof Events>(type: Key, evt?: Events[Key]) { let handlers = all!.get(type) if (handlers) { ;(handlers as TEmitterHandlerList<Events[keyof Events]>).slice().map((handler) => { handler(evt!) }) } handlers = all!.get('*') if (handlers) { ;(handlers as TEmitterWildcardHandlerList<Events>).slice().map((handler) => { handler(type, evt!) }) } }, } } export const emitter = mitt()