mirror of
https://github.com/pybricks/pybricks-code.git
synced 2026-09-12 17:45:22 +00:00
46 lines
1.1 KiB
TypeScript
46 lines
1.1 KiB
TypeScript
// SPDX-License-Identifier: MIT
|
|
// Copyright (c) 2021 The Pybricks Authors
|
|
//
|
|
// Alternative to @blueprintjs/core ContextMenuTarget decorator.
|
|
|
|
import { ContextMenu } from '@blueprintjs/core';
|
|
|
|
export interface IContextMenuTarget {
|
|
renderContextMenu(): JSX.Element;
|
|
onContextMenuClose(): void;
|
|
}
|
|
|
|
export function handleContextMenu(
|
|
event: React.MouseEvent,
|
|
target: IContextMenuTarget,
|
|
): void {
|
|
// istanbul ignore if: not expected
|
|
if (event.defaultPrevented) {
|
|
return;
|
|
}
|
|
|
|
event.preventDefault();
|
|
|
|
const listener = (e: KeyboardEvent) => {
|
|
if (e.key === 'Escape') {
|
|
// istanbul ignore if: not expected
|
|
if (e.defaultPrevented) {
|
|
return;
|
|
}
|
|
|
|
e.preventDefault();
|
|
ContextMenu.hide();
|
|
}
|
|
};
|
|
window.addEventListener('keydown', listener);
|
|
|
|
ContextMenu.show(
|
|
target.renderContextMenu(),
|
|
{ left: event.clientX, top: event.clientY },
|
|
() => {
|
|
window.removeEventListener('keydown', listener);
|
|
target.onContextMenuClose();
|
|
},
|
|
);
|
|
}
|