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 disposed = false;
let cleanup: (() => void) | undefined; 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> { async function setupTauriDragDrop(): Promise<boolean> {
if (!isTauriEnvironment()) { if (!isTauriEnvironment()) {
@@ -171,7 +186,7 @@ export function useFileDropZone({
); );
if (disposed) { if (disposed) {
unlisten(); runCleanup(unlisten);
return true; return true;
} }
@@ -271,7 +286,7 @@ export function useFileDropZone({
return () => { return () => {
disposed = true; disposed = true;
cleanup?.(); runCleanup();
}; };
}, [disabled]); }, [disabled]);
+27 -4
View File
@@ -109,7 +109,21 @@ export function useTrafficLightPadding(): { left: number; top: number } {
useEffect(() => { useEffect(() => {
if (Platform.OS !== "web" || !getIsTauriMac()) return; 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() { async function setup() {
const win = await getTauriWindow(); const win = await getTauriWindow();
@@ -117,19 +131,28 @@ export function useTrafficLightPadding(): { left: number; top: number } {
// Check initial fullscreen state // Check initial fullscreen state
const fullscreen = await win.isFullscreen(); const fullscreen = await win.isFullscreen();
if (disposed) return;
setIsFullscreen(fullscreen); setIsFullscreen(fullscreen);
// Listen for resize events which include fullscreen changes // 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(); const fs = await win.isFullscreen();
if (disposed) return;
setIsFullscreen(fs); setIsFullscreen(fs);
}); });
cleanup = unlisten;
if (disposed) {
runCleanup();
}
} }
setup(); void setup();
return () => { return () => {
unlisten?.(); disposed = true;
runCleanup();
}; };
}, []); }, []);