diff --git a/.changeset/deep-towns-attend.md b/.changeset/deep-towns-attend.md new file mode 100644 index 0000000..9197749 --- /dev/null +++ b/.changeset/deep-towns-attend.md @@ -0,0 +1,5 @@ +--- +'@playcanvas/react': patch +--- + +Fix useAppEvent dropping arguments for custom events diff --git a/packages/lib/src/hooks/use-app-event.test.tsx b/packages/lib/src/hooks/use-app-event.test.tsx index a2ef761..b0e49a3 100644 --- a/packages/lib/src/hooks/use-app-event.test.tsx +++ b/packages/lib/src/hooks/use-app-event.test.tsx @@ -1,10 +1,11 @@ -import { renderHook } from '@testing-library/react'; +import { renderHook, waitFor } from '@testing-library/react'; import React from 'react'; import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; import { Application } from '../Application.tsx'; import { useAppEvent } from './use-app-event.ts'; +import { useApp } from './use-app.tsx'; /** * Note that we can't test the actual firing of the callbacks in tests, @@ -113,4 +114,31 @@ describe('useAppEvent', () => { // Should not throw during cleanup unmount(); }); + it('should forward all arguments to the callback for custom events', async () => { + // eslint-disable-next-line @typescript-eslint/consistent-type-definitions -- preserve the interface generic coverage + interface CustomEventMap { + levelComplete: (level: number, score: number) => void; + } + + const levelCompleteCallback = vi.fn(); + let capturedApp: ReturnType | undefined; + + renderHook( + () => { + capturedApp = useApp(); + useAppEvent('levelComplete', levelCompleteCallback); + }, + { + wrapper: ({ children }) => {children} + } + ); + + await waitFor(() => expect(capturedApp).toBeDefined()); + + capturedApp!.fire('levelComplete', 3, 1000); + + const [level, score] = levelCompleteCallback.mock.calls[0]; + expect(level).toBe(3); + expect(score).toBe(1000); + }); }); diff --git a/packages/lib/src/hooks/use-app-event.ts b/packages/lib/src/hooks/use-app-event.ts index ff2c61e..53216c5 100644 --- a/packages/lib/src/hooks/use-app-event.ts +++ b/packages/lib/src/hooks/use-app-event.ts @@ -81,14 +81,9 @@ export function useAppEvent { - if (event === 'update') { - // update event always receives delta time as first argument - (callback as (dt: number) => void)(args[0] as number); - } else { - (callback as () => void)(); - } + (callback as (...args: unknown[]) => void)(...args); }, - [callback, event] + [callback] ); useEffect(() => {