From a099e99b55fcd5181ae72707ca7c0187fcac572c Mon Sep 17 00:00:00 2001 From: Tobias Oitzinger Date: Wed, 14 May 2025 00:19:25 +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 05ce47a0..c3a0a0e8 100644 --- a/packages/react/src/hooks/use-echo.ts +++ b/packages/react/src/hooks/use-echo.ts @@ -75,7 +75,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, ) => { @@ -102,7 +102,9 @@ export const useEcho = < } events.forEach((e) => { - subscription.current.stopListening(e, callbackFunc); + subscription.current.stopListening(e, (payload: TPayload) => + callbackFunc(payload, e), + ); }); listening.current = false; @@ -114,7 +116,9 @@ export const useEcho = < } events.forEach((e) => { - subscription.current.listen(e, callbackFunc); + subscription.current.listen(e, (payload: TPayload) => + callbackFunc(payload, e), + ); }); listening.current = true; @@ -169,7 +173,7 @@ export const useEchoPresence = < >( channelName: string, event: string | string[] = [], - callback: (payload: TPayload) => void = () => {}, + callback: (payload: TPayload, event: string) => void = () => {}, dependencies: any[] = [], ) => { return useEcho( @@ -187,7 +191,7 @@ export const useEchoPublic = < >( channelName: string, event: string | string[] = [], - callback: (payload: TPayload) => void = () => {}, + callback: (payload: TPayload, event: string) => void = () => {}, dependencies: any[] = [], ) => { return useEcho( @@ -207,7 +211,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 96f52de2..62e27093 100644 --- a/packages/react/tests/use-echo.test.ts +++ b/packages/react/tests/use-echo.test.ts @@ -122,18 +122,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), ); }); @@ -190,7 +196,7 @@ describe("useEcho hook", async () => { expect(echoInstance.private(channelName).listen).toHaveBeenCalledWith( event, - mockCallback, + expect.any(Function), ); }); @@ -251,15 +257,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 () => { @@ -274,7 +289,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 () => { @@ -387,22 +405,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), ); }); @@ -531,7 +549,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 () => { @@ -601,18 +622,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), ); }); @@ -755,18 +782,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), ); });