diff --git a/web/src/shared/hooks/hooks.js b/web/src/shared/hooks/hooks.js index c0b6e33..cf9f561 100644 --- a/web/src/shared/hooks/hooks.js +++ b/web/src/shared/hooks/hooks.js @@ -18,10 +18,6 @@ export function conflictError(error, fallback) { export function useUnsavedChanges(dirty) { useEffect(() => { if (!dirty) return undefined - const beforeUnload = (event) => { - event.preventDefault() - event.returnValue = "" - } const click = (event) => { const anchor = event.target.closest?.("a[href]") if (!anchor || !anchor.getAttribute("href")?.startsWith("#/")) return @@ -29,10 +25,8 @@ export function useUnsavedChanges(dirty) { event.preventDefault() event.stopPropagation() } - window.addEventListener("beforeunload", beforeUnload) document.addEventListener("click", click, true) return () => { - window.removeEventListener("beforeunload", beforeUnload) document.removeEventListener("click", click, true) } }, [dirty]) diff --git a/web/src/shared/hooks/hooks.test.jsx b/web/src/shared/hooks/hooks.test.jsx index aae717a..f975499 100644 --- a/web/src/shared/hooks/hooks.test.jsx +++ b/web/src/shared/hooks/hooks.test.jsx @@ -1,6 +1,11 @@ import { afterEach, describe, expect, it } from "vitest"; import { render } from "@testing-library/react"; -import { conflictError, displayError, useTitle } from "./hooks"; +import { + conflictError, + displayError, + useTitle, + useUnsavedChanges, +} from "./hooks"; describe("hooks helpers", () => { afterEach(() => { @@ -38,4 +43,18 @@ describe("hooks helpers", () => { render(); expect(document.title).toBe("CreatorHub 测试"); }); + + it("does not block browser refresh for unsaved changes", () => { + function UnsavedChangesProbe() { + useUnsavedChanges(true); + return null; + } + const { unmount } = render(); + const event = new Event("beforeunload", { cancelable: true }); + + window.dispatchEvent(event); + + expect(event.defaultPrevented).toBe(false); + unmount(); + }); });