import { useDebounceFn } from '@vueuse/core' import type { AnyFn, DebounceFilterOptions, MaybeRefOrGetter, PromisifyFn, } from '@vueuse/core' export type EventAnyFn = AnyFn export type EventCallbacks = Record export type EventPromiseFn = PromisifyFn export interface EventOptions extends DebounceFilterOptions { ms?: MaybeRefOrGetter } export const useEvents = ( callbacks: T, options?: EventOptions, ) => { const { ms = 0, maxWait = 0, rejectOnCancel } = options || {} return useDebounceFn( (key: keyof T, ...args: any) => { const callback = callbacks[key] as EventPromiseFn if (callback) callback.apply({}, args) }, ms, { maxWait: maxWait || ms, rejectOnCancel }, ) }