Skip to content

Commit

Permalink
feat(createEventHook): allow trigger to optionally have no parameters (
Browse files Browse the repository at this point in the history
  • Loading branch information
curtgrimes committed Nov 9, 2023
1 parent 151f9b0 commit 6040e1c
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 8 deletions.
12 changes: 12 additions & 0 deletions packages/shared/createEventHook/index.test.ts
Expand Up @@ -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<string>()
Expand Down
17 changes: 9 additions & 8 deletions packages/shared/createEventHook/index.ts
Expand Up @@ -4,9 +4,10 @@
*/
import { tryOnScopeDispose } from '../tryOnScopeDispose'

export type EventHookOn<T = any> = (fn: (param: T) => void) => { off: () => void }
export type EventHookOff<T = any> = (fn: (param: T) => void) => void
export type EventHookTrigger<T = any> = (param: T) => Promise<unknown[]>
type Callback<T> = T extends void ? () => void : (param: T) => void
export type EventHookOn<T = any> = (fn: Callback<T>) => { off: () => void }
export type EventHookOff<T = any> = (fn: Callback<T>) => void
export type EventHookTrigger<T = any> = (param?: T) => Promise<unknown[]>

export interface EventHook<T = any> {
on: EventHookOn<T>
Expand All @@ -20,13 +21,13 @@ export interface EventHook<T = any> {
* @see https://vueuse.org/createEventHook
*/
export function createEventHook<T = any>(): EventHook<T> {
const fns: Set<(param: T) => void> = new Set()
const fns: Set<Callback<T>> = new Set()

const off = (fn: (param: T) => void) => {
const off = (fn: Callback<T>) => {
fns.delete(fn)
}

const on = (fn: (param: T) => void) => {
const on = (fn: Callback<T>) => {
fns.add(fn)
const offFn = () => off(fn)

Expand All @@ -37,8 +38,8 @@ export function createEventHook<T = any>(): EventHook<T> {
}
}

const trigger = (param: T) => {
return Promise.all(Array.from(fns).map(fn => fn(param)))
const trigger: EventHookTrigger<T> = (param?: T) => {
return Promise.all(Array.from(fns).map(fn => param ? fn(param) : (fn as Callback<void>)()))
}

return {
Expand Down

0 comments on commit 6040e1c

Please sign in to comment.