1. /**
    
  2.  * Copyright (c) Meta Platforms, Inc. and affiliates.
    
  3.  *
    
  4.  * This source code is licensed under the MIT license found in the
    
  5.  * LICENSE file in the root directory of this source tree.
    
  6.  *
    
  7.  * @flow
    
  8.  */
    
  9. 
    
  10. import {useContext, useEffect} from 'react';
    
  11. import {RegistryContext} from './Contexts';
    
  12. 
    
  13. import type {OnChangeFn, RegistryContextType} from './Contexts';
    
  14. import type {ElementRef} from 'react';
    
  15. 
    
  16. export default function useContextMenu({
    
  17.   data,
    
  18.   id,
    
  19.   onChange,
    
  20.   ref,
    
  21. }: {
    
  22.   data: Object,
    
  23.   id: string,
    
  24.   onChange?: OnChangeFn,
    
  25.   ref: {current: ElementRef<any> | null},
    
  26. }) {
    
  27.   const {showMenu} = useContext<RegistryContextType>(RegistryContext);
    
  28. 
    
  29.   useEffect(() => {
    
  30.     if (ref.current !== null) {
    
  31.       const handleContextMenu = (event: MouseEvent | TouchEvent) => {
    
  32.         event.preventDefault();
    
  33.         event.stopPropagation();
    
  34. 
    
  35.         const pageX =
    
  36.           (event: any).pageX ||
    
  37.           (event.touches && (event: any).touches[0].pageX);
    
  38.         const pageY =
    
  39.           (event: any).pageY ||
    
  40.           (event.touches && (event: any).touches[0].pageY);
    
  41. 
    
  42.         showMenu({data, id, onChange, pageX, pageY});
    
  43.       };
    
  44. 
    
  45.       const trigger = ref.current;
    
  46.       trigger.addEventListener('contextmenu', handleContextMenu);
    
  47. 
    
  48.       return () => {
    
  49.         trigger.removeEventListener('contextmenu', handleContextMenu);
    
  50.       };
    
  51.     }
    
  52.   }, [data, id, showMenu]);
    
  53. }