fix: stop blocking browser refresh

This commit is contained in:
2026-09-21 09:28:56 +08:00
parent 7934435475
commit 75658022df
2 changed files with 20 additions and 7 deletions
-6
View File
@@ -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])
+20 -1
View File
@@ -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(<TitleProbe />);
expect(document.title).toBe("CreatorHub 测试");
});
it("does not block browser refresh for unsaved changes", () => {
function UnsavedChangesProbe() {
useUnsavedChanges(true);
return null;
}
const { unmount } = render(<UnsavedChangesProbe />);
const event = new Event("beforeunload", { cancelable: true });
window.dispatchEvent(event);
expect(event.defaultPrevented).toBe(false);
unmount();
});
});