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();
+ });
});