fix(app): guard tauri listener cleanup to prevent uncaught unlisten errors

This commit is contained in:
Mohamed Boudra
2026-02-17 09:43:22 +07:00
parent bb6d30e4f8
commit 12ba65d6e7
2 changed files with 44 additions and 6 deletions
+17 -2
View File
@@ -128,6 +128,21 @@ export function useFileDropZone({
let disposed = false;
let cleanup: (() => void) | undefined;
let didCleanup = false;
function runCleanup(unlisten?: () => void | Promise<void>) {
if (didCleanup) return;
const cleanupFn = unlisten ?? cleanup;
if (!cleanupFn) return;
didCleanup = true;
try {
void Promise.resolve(cleanupFn()).catch((error) => {
console.warn("[useFileDropZone] Failed to remove Tauri drag-drop listener:", error);
});
} catch (error) {
console.warn("[useFileDropZone] Failed to remove Tauri drag-drop listener:", error);
}
}
async function setupTauriDragDrop(): Promise<boolean> {
if (!isTauriEnvironment()) {
@@ -171,7 +186,7 @@ export function useFileDropZone({
);
if (disposed) {
unlisten();
runCleanup(unlisten);
return true;
}
@@ -271,7 +286,7 @@ export function useFileDropZone({
return () => {
disposed = true;
cleanup?.();
runCleanup();
};
}, [disabled]);
+27 -4
View File
@@ -109,7 +109,21 @@ export function useTrafficLightPadding(): { left: number; top: number } {
useEffect(() => {
if (Platform.OS !== "web" || !getIsTauriMac()) return;
let unlisten: (() => void) | undefined;
let disposed = false;
let cleanup: (() => void) | undefined;
let didCleanup = false;
function runCleanup() {
if (!cleanup || didCleanup) return;
didCleanup = true;
try {
void Promise.resolve(cleanup()).catch((error) => {
console.warn("[TauriWindow] Failed to remove resize listener", error);
});
} catch (error) {
console.warn("[TauriWindow] Failed to remove resize listener", error);
}
}
async function setup() {
const win = await getTauriWindow();
@@ -117,19 +131,28 @@ export function useTrafficLightPadding(): { left: number; top: number } {
// Check initial fullscreen state
const fullscreen = await win.isFullscreen();
if (disposed) return;
setIsFullscreen(fullscreen);
// Listen for resize events which include fullscreen changes
unlisten = await win.onResized(async () => {
const unlisten = await win.onResized(async () => {
if (disposed) return;
const fs = await win.isFullscreen();
if (disposed) return;
setIsFullscreen(fs);
});
cleanup = unlisten;
if (disposed) {
runCleanup();
}
}
setup();
void setup();
return () => {
unlisten?.();
disposed = true;
runCleanup();
};
}, []);