From 6040e1cceb2f002868e2f7f74dba54aba45ece1c Mon Sep 17 00:00:00 2001 From: Curt Grimes Date: Thu, 9 Nov 2023 08:54:53 -0600 Subject: [PATCH] feat(createEventHook): allow trigger to optionally have no parameters (#3507) --- packages/shared/createEventHook/index.test.ts | 12 ++++++++++++ packages/shared/createEventHook/index.ts | 17 +++++++++-------- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/packages/shared/createEventHook/index.test.ts b/packages/shared/createEventHook/index.test.ts index ec7ccc86e5b..366164ec620 100644 --- a/packages/shared/createEventHook/index.test.ts +++ b/packages/shared/createEventHook/index.test.ts @@ -27,6 +27,18 @@ describe('createEventHook', () => { expect(message).toBe('Hello World') }) + it('should trigger event with no params', () => { + let timesFired = 0 + + const { on: onResult, trigger } = createEventHook() + + onResult(() => timesFired++) + trigger() + trigger() + + expect(timesFired).toBe(2) + }) + it('should add and remove event listener', () => { const listener = vi.fn() const { on, off, trigger } = createEventHook() diff --git a/packages/shared/createEventHook/index.ts b/packages/shared/createEventHook/index.ts index d9a4f535227..9f99ee7d339 100644 --- a/packages/shared/createEventHook/index.ts +++ b/packages/shared/createEventHook/index.ts @@ -4,9 +4,10 @@ */ import { tryOnScopeDispose } from '../tryOnScopeDispose' -export type EventHookOn = (fn: (param: T) => void) => { off: () => void } -export type EventHookOff = (fn: (param: T) => void) => void -export type EventHookTrigger = (param: T) => Promise +type Callback = T extends void ? () => void : (param: T) => void +export type EventHookOn = (fn: Callback) => { off: () => void } +export type EventHookOff = (fn: Callback) => void +export type EventHookTrigger = (param?: T) => Promise export interface EventHook { on: EventHookOn @@ -20,13 +21,13 @@ export interface EventHook { * @see https://vueuse.org/createEventHook */ export function createEventHook(): EventHook { - const fns: Set<(param: T) => void> = new Set() + const fns: Set> = new Set() - const off = (fn: (param: T) => void) => { + const off = (fn: Callback) => { fns.delete(fn) } - const on = (fn: (param: T) => void) => { + const on = (fn: Callback) => { fns.add(fn) const offFn = () => off(fn) @@ -37,8 +38,8 @@ export function createEventHook(): EventHook { } } - const trigger = (param: T) => { - return Promise.all(Array.from(fns).map(fn => fn(param))) + const trigger: EventHookTrigger = (param?: T) => { + return Promise.all(Array.from(fns).map(fn => param ? fn(param) : (fn as Callback)())) } return {