fix: hook
This commit is contained in:
@@ -0,0 +1,30 @@
|
||||
import { useEffect } from "react";
|
||||
import { useSchedulesStore } from "../state/schedulesStore";
|
||||
|
||||
/**
|
||||
* 监听全局 pointerdown / blur / resize / scroll / Escape,关闭当前打开的右键菜单。
|
||||
* 菜单的 open/close 生命周期归菜单自己管——页面不再持有这段 effect。
|
||||
*/
|
||||
export function useContextMenuDismiss(): void {
|
||||
const contextMenu = useSchedulesStore((s) => s.contextMenu);
|
||||
const setContextMenu = useSchedulesStore((s) => s.setContextMenu);
|
||||
useEffect(() => {
|
||||
if (!contextMenu) return undefined;
|
||||
const close = (): void => setContextMenu(null);
|
||||
const onKeyDown = (event: KeyboardEvent): void => {
|
||||
if (event.key === "Escape") close();
|
||||
};
|
||||
window.addEventListener("pointerdown", close);
|
||||
window.addEventListener("blur", close);
|
||||
window.addEventListener("resize", close);
|
||||
window.addEventListener("scroll", close, true);
|
||||
window.addEventListener("keydown", onKeyDown);
|
||||
return () => {
|
||||
window.removeEventListener("pointerdown", close);
|
||||
window.removeEventListener("blur", close);
|
||||
window.removeEventListener("resize", close);
|
||||
window.removeEventListener("scroll", close, true);
|
||||
window.removeEventListener("keydown", onKeyDown);
|
||||
};
|
||||
}, [contextMenu, setContextMenu]);
|
||||
}
|
||||
Reference in New Issue
Block a user