From ee6b857336d96c63ddb1182777952f529d74e882 Mon Sep 17 00:00:00 2001 From: oomeow Date: Sun, 14 Dec 2025 13:06:34 +0800 Subject: [PATCH] perf: cache listen functions to prevent always repeatedly remove and re-add listener on `useLayoutEvents` hook --- src/hooks/use-listen.ts | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/hooks/use-listen.ts b/src/hooks/use-listen.ts index f2bf4e906..309754b66 100644 --- a/src/hooks/use-listen.ts +++ b/src/hooks/use-listen.ts @@ -1,20 +1,20 @@ import { event } from "@tauri-apps/api"; import { listen, UnlistenFn, EventCallback } from "@tauri-apps/api/event"; -import { useRef } from "react"; +import { useCallback, useRef } from "react"; export const useListen = () => { const unlistenFns = useRef([]); - const addListener = async ( - eventName: string, - handler: EventCallback, - ) => { - const unlisten = await listen(eventName, handler); - unlistenFns.current.push(unlisten); - return unlisten; - }; + const addListener = useCallback( + async (eventName: string, handler: EventCallback) => { + const unlisten = await listen(eventName, handler); + unlistenFns.current.push(unlisten); + return unlisten; + }, + [], + ); - const removeAllListeners = () => { + const removeAllListeners = useCallback(() => { const errors: Error[] = []; unlistenFns.current.forEach((unlisten) => { @@ -33,13 +33,13 @@ export const useListen = () => { } unlistenFns.current.length = 0; - }; + }, []); - const setupCloseListener = async function () { + const setupCloseListener = useCallback(async () => { await event.once("tauri://close-requested", async () => { removeAllListeners(); }); - }; + }, [removeAllListeners]); return { addListener,