From a02f07da89db23201fd0c4594cdc1b97a41a94f1 Mon Sep 17 00:00:00 2001 From: Tobias Oitzinger Date: Tue, 24 Jun 2025 18:24:45 +0200 Subject: [PATCH] feat: return event name in callback Signed-off-by: Tobias Oitzinger --- packages/react/src/hooks/use-echo.ts | 19 ++++--- packages/react/tests/use-echo.test.ts | 77 +++++++++++++++++++-------- 2 files changed, 68 insertions(+), 28 deletions(-) diff --git a/packages/react/src/hooks/use-echo.ts b/packages/react/src/hooks/use-echo.ts index 800e13e9..311d9fb2 100644 --- a/packages/react/src/hooks/use-echo.ts +++ b/packages/react/src/hooks/use-echo.ts @@ -76,7 +76,7 @@ export const useEcho = < >( channelName: string, event: string | string[] = [], - callback: (payload: TPayload) => void = () => {}, + callback: (payload: TPayload, event: string) => void = () => {}, dependencies: any[] = [], visibility: TVisibility = "private" as TVisibility, ) => { @@ -103,7 +103,9 @@ export const useEcho = < } events.forEach((e) => { - subscription.current.stopListening(e, callbackFunc); + subscription.current.stopListening(e, (payload: TPayload) => + callbackFunc(payload, e), + ); }); listening.current = false; @@ -115,7 +117,9 @@ export const useEcho = < } events.forEach((e) => { - subscription.current.listen(e, callbackFunc); + subscription.current.listen(e, (payload: TPayload) => + callbackFunc(payload, e), + ); }); listening.current = true; @@ -255,7 +259,7 @@ export const useEchoPresence = < >( channelName: string, event: string | string[] = [], - callback: (payload: TPayload) => void = () => {}, + callback: (payload: TPayload, event: string) => void = () => {}, dependencies: any[] = [], ) => { return useEcho( @@ -273,7 +277,7 @@ export const useEchoPublic = < >( channelName: string, event: string | string[] = [], - callback: (payload: TPayload) => void = () => {}, + callback: (payload: TPayload, event: string) => void = () => {}, dependencies: any[] = [], ) => { return useEcho( @@ -293,7 +297,10 @@ export const useEchoModel = < model: TModel, identifier: string | number, event: ModelEvents | ModelEvents[] = [], - callback: (payload: ModelPayload) => void = () => {}, + callback: ( + payload: ModelPayload, + event: string, + ) => void = () => {}, dependencies: any[] = [], ) => { return useEcho, TDriver, "private">( diff --git a/packages/react/tests/use-echo.test.ts b/packages/react/tests/use-echo.test.ts index 698c85f4..4de1424a 100644 --- a/packages/react/tests/use-echo.test.ts +++ b/packages/react/tests/use-echo.test.ts @@ -123,18 +123,24 @@ describe("useEcho hook", async () => { const channel = echoInstance.private(channelName); - expect(channel.listen).toHaveBeenCalledWith(events[0], mockCallback); - expect(channel.listen).toHaveBeenCalledWith(events[1], mockCallback); + expect(channel.listen).toHaveBeenCalledWith( + events[0], + expect.any(Function), + ); + expect(channel.listen).toHaveBeenCalledWith( + events[1], + expect.any(Function), + ); expect(() => unmount()).not.toThrow(); expect(channel.stopListening).toHaveBeenCalledWith( events[0], - mockCallback, + expect.any(Function), ); expect(channel.stopListening).toHaveBeenCalledWith( events[1], - mockCallback, + expect.any(Function), ); }); @@ -191,7 +197,7 @@ describe("useEcho hook", async () => { expect(echoInstance.private(channelName).listen).toHaveBeenCalledWith( event, - mockCallback, + expect.any(Function), ); }); @@ -252,15 +258,24 @@ describe("useEcho hook", async () => { const channel = echoInstance.private(channelName); - expect(channel.listen).toHaveBeenCalledWith(event, mockCallback); + expect(channel.listen).toHaveBeenCalledWith( + event, + expect.any(Function), + ); result.current.stopListening(); - expect(channel.stopListening).toHaveBeenCalledWith(event, mockCallback); + expect(channel.stopListening).toHaveBeenCalledWith( + event, + expect.any(Function), + ); result.current.listen(); - expect(channel.listen).toHaveBeenCalledWith(event, mockCallback); + expect(channel.listen).toHaveBeenCalledWith( + event, + expect.any(Function), + ); }); it("can manually stop listening to events", async () => { @@ -275,7 +290,10 @@ describe("useEcho hook", async () => { result.current.stopListening(); const channel = echoInstance.private(channelName); - expect(channel.stopListening).toHaveBeenCalledWith(event, mockCallback); + expect(channel.stopListening).toHaveBeenCalledWith( + event, + expect.any(Function), + ); }); it("stopListening is a no-op when not listening", async () => { @@ -388,22 +406,22 @@ describe("useEchoModel hook", async () => { expect(channel.listen).toHaveBeenCalledWith( `.${events[0]}`, - mockCallback, + expect.any(Function), ); expect(channel.listen).toHaveBeenCalledWith( `.${events[1]}`, - mockCallback, + expect.any(Function), ); expect(() => unmount()).not.toThrow(); expect(channel.stopListening).toHaveBeenCalledWith( `.${events[0]}`, - mockCallback, + expect.any(Function), ); expect(channel.stopListening).toHaveBeenCalledWith( `.${events[1]}`, - mockCallback, + expect.any(Function), ); }); @@ -532,7 +550,10 @@ describe("useEchoModel hook", async () => { expect(echoInstance.private).toHaveBeenCalledWith(expectedChannelName); const channel = echoInstance.private(expectedChannelName); - expect(channel.listen).toHaveBeenCalledWith(`.${event}`, mockCallback); + expect(channel.listen).toHaveBeenCalledWith( + `.${event}`, + expect.any(Function), + ); }); it("events and listeners are optional", async () => { @@ -602,18 +623,24 @@ describe("useEchoPublic hook", async () => { const channel = echoInstance.channel(channelName); - expect(channel.listen).toHaveBeenCalledWith(events[0], mockCallback); - expect(channel.listen).toHaveBeenCalledWith(events[1], mockCallback); + expect(channel.listen).toHaveBeenCalledWith( + events[0], + expect.any(Function), + ); + expect(channel.listen).toHaveBeenCalledWith( + events[1], + expect.any(Function), + ); expect(() => unmount()).not.toThrow(); expect(channel.stopListening).toHaveBeenCalledWith( events[0], - mockCallback, + expect.any(Function), ); expect(channel.stopListening).toHaveBeenCalledWith( events[1], - mockCallback, + expect.any(Function), ); }); @@ -756,18 +783,24 @@ describe("useEchoPresence hook", async () => { const channel = echoInstance.join(channelName); - expect(channel.listen).toHaveBeenCalledWith(events[0], mockCallback); - expect(channel.listen).toHaveBeenCalledWith(events[1], mockCallback); + expect(channel.listen).toHaveBeenCalledWith( + events[0], + expect.any(Function), + ); + expect(channel.listen).toHaveBeenCalledWith( + events[1], + expect.any(Function), + ); expect(() => unmount()).not.toThrow(); expect(channel.stopListening).toHaveBeenCalledWith( events[0], - mockCallback, + expect.any(Function), ); expect(channel.stopListening).toHaveBeenCalledWith( events[1], - mockCallback, + expect.any(Function), ); });