fix: stop blocking browser refresh
This commit is contained in:
@@ -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])
|
||||
|
||||
@@ -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();
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user