mirror of
https://github.com/block/buzz.git
synced 2026-10-28 04:51:40 +00:00
33 lines
1.1 KiB
TypeScript
33 lines
1.1 KiB
TypeScript
import * as React from "react";
|
|
|
|
import { acquireEscapeSurface } from "@/shared/hooks/escapeSurfaces";
|
|
|
|
/**
|
|
* Calls `onEscape` when the Escape key is pressed, unless the event
|
|
* was already handled (`defaultPrevented`) — so nested controls
|
|
* (autocomplete, edit mode) that claim Escape on the element always win.
|
|
*
|
|
* While enabled, the surface is registered with `escapeSurfaces` so
|
|
* app-level Escape shortcuts (mark channel read) know to yield instead
|
|
* of racing this listener on registration order.
|
|
*
|
|
* Pass `enabled: false` to skip registering the listener entirely.
|
|
*/
|
|
export function useEscapeKey(onEscape: () => void, enabled: boolean = true) {
|
|
React.useEffect(() => {
|
|
if (!enabled) return;
|
|
const releaseSurface = acquireEscapeSurface();
|
|
function handleKeyDown(event: KeyboardEvent) {
|
|
if (event.key === "Escape" && !event.defaultPrevented) {
|
|
event.preventDefault();
|
|
onEscape();
|
|
}
|
|
}
|
|
window.addEventListener("keydown", handleKeyDown);
|
|
return () => {
|
|
window.removeEventListener("keydown", handleKeyDown);
|
|
releaseSurface();
|
|
};
|
|
}, [enabled, onEscape]);
|
|
}
|