fix(app): guard tauri listener cleanup to prevent uncaught unlisten errors
This commit is contained in:
@@ -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]);
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
};
|
};
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user