Skip to content

Commit acb57e9

Browse files
committed
[IMPL] useContextMenu hook
1 parent ea939ff commit acb57e9

7 files changed

Lines changed: 97 additions & 4 deletions

File tree

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { useCallback, useRef } from "react"
2+
import { useContextMenu } from "../../../../../../packages/react-tools/src";
3+
4+
/**
5+
The component uses _useContextMenu_ hook and renders two paragraph. It uses the hook to disabled native contextmenu event on first paragraph.
6+
*/
7+
export const UseContextMenu = () => {
8+
const pRef = useRef<HTMLParagraphElement>(null);
9+
useContextMenu({
10+
element: pRef,
11+
listener: useCallback((evt: PointerEvent) => {
12+
evt.preventDefault();
13+
}, [])
14+
});
15+
16+
return <div>
17+
<p ref={pRef}>The context menu on this paragraph is disabled.</p>
18+
<p>On this paragraph context menu is enabled.</p>
19+
</div>
20+
}

apps/react-tools-demo/src/constants/components.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,8 @@ export const COMPONENTS = [
6969
"useScreen",
7070
"useHotKeys",
7171
"usePinchZoom",
72-
"usePointerLock"
72+
"usePointerLock",
73+
"useContextMenu"
7374
],
7475
//API DOM
7576
[
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
# useContextMenu
2+
Hook to add contextmenu event listener. The contextmenu event fires when the user attempts to open a context menu. This event is typically triggered by clicking the right mouse button, or by pressing the context menu key.
3+
4+
## Usage
5+
6+
```tsx
7+
export const UseContextMenu = () => {
8+
const pRef = useRef<HTMLParagraphElement>(null);
9+
useContextMenu({
10+
element: pRef,
11+
listener: useCallback((evt: PointerEvent) => {
12+
evt.preventDefault();
13+
}, [])
14+
});
15+
16+
return <div>
17+
<p ref={pRef}>The context menu on this paragraph is disabled.</p>
18+
<p>On this paragraph context menu is enabled.</p>
19+
</div>
20+
}
21+
```
22+
23+
> The component uses _useContextMenu_ hook and renders two paragraph. It uses the hook to disabled native contextmenu event on first paragraph.
24+
25+
26+
## API
27+
28+
```tsx
29+
useContextMenu({ element, listener, effectType, listenerOpts }: { element: RefObject<HTMLElement> | Window, listener: (evt: PointerEvent) => void | Promise<void>, effectType?: "normal" | "layout", listenerOpts?: boolean | AddEventListenerOptions | undefined })
30+
```
31+
32+
> ### Params
33+
>
34+
> - __param__: _Object_
35+
props
36+
> - __param.listener?__: _(evt: PointerEvent)=>void|Promise<void>_
37+
listener function executed when event fires.
38+
> - __options.element=window?__: _RefObject<HTMLElement> | Window_
39+
element on which attaching eventListener.
40+
> - __param.effectType="normal"?__: _"normal"|"layout"_
41+
props
42+
> - __param.listenerOpts?__: _boolean | AddEventListenerOptions_
43+
props
44+
>
45+
46+
> ### Returns
47+
>
48+
>
49+
>
50+
>

packages/react-tools/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@
6969
- [x] useHotKeys
7070
- [x] usePinchZoom
7171
- [x] usePointerLock
72-
- [ ] useContextMenu
72+
- [x] useContextMenu
7373
- [ ] useInfiniteScroll
7474
- [ ] useDragAndDrop (check for mobile usage)
7575

packages/react-tools/src/hooks/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,4 +90,5 @@ export { useAnimation } from './useAnimation';
9090
export { useAudio } from './useAudio';
9191
export { useVideo } from './useVideo';
9292
export { useEventSource } from './useEventSource';
93-
export { useWebSocket } from './useWebSocket';
93+
export { useWebSocket } from './useWebSocket';
94+
export { useContextMenu } from './useContextMenu';
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { RefObject } from "react"
2+
import { useEventListener } from "."
3+
4+
/**
5+
* **`useContextMenu`**: Hook to add contextmenu event listener. The contextmenu event fires when the user attempts to open a context menu. This event is typically triggered by clicking the right mouse button, or by pressing the context menu key.
6+
* @param {Object} param - props
7+
* @param {(evt: PointerEvent)=>void|Promise<void>} [param.listener] - listener function executed when event fires.
8+
* @param {RefObject<HTMLElement> | Window} [options.element=window] - element on which attaching eventListener.
9+
* @param {"normal"|"layout"} [param.effectType="normal"] - props
10+
* @param {boolean | AddEventListenerOptions} [param.listenerOpts] - props
11+
*/
12+
export const useContextMenu = ({ element, listener, effectType, listenerOpts }: { element: RefObject<HTMLElement> | Window, listener: (evt: PointerEvent) => void | Promise<void>, effectType?: "normal" | "layout", listenerOpts?: boolean | AddEventListenerOptions | undefined }) => {
13+
useEventListener({
14+
type: "contextmenu",
15+
listener,
16+
effectType,
17+
listenerOpts,
18+
element
19+
})
20+
}

packages/react-tools/src/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,8 @@ export {
163163
useAudio,
164164
useVideo,
165165
useEventSource,
166-
useWebSocket
166+
useWebSocket,
167+
useContextMenu
167168
} from './hooks'
168169

169170
export {

0 commit comments

Comments
 (0)