ProzillaOS/src/hooks/modals/ContextMenu.js
2023-12-10 11:38:00 +01:00

45 lines
No EOL
1.5 KiB
JavaScript

import { useCallback } from "react";
import { ContextMenu } from "../../components/modals/context-menu/ContextMenu.jsx";
import Vector2 from "../../features/math/vector2.js";
import Modal from "../../features/modals/modal.js";
import ModalsManager from "../../features/modals/modals.js";
import { useShortcuts } from "../utils/keyboard.js";
/**
* @typedef {Function} onContextMenuType
* @param {object} event
* @param {object} params
* @returns {Modal}
*/
/**
* @param {object} props
* @param {ModalsManager} props.modalsManager
* @param {Object<string, Object<string, Function>>} props.options
* @param {Object<string, Object<string, string[]>>} props.shortcuts
* @returns {{ onContextMenu: onContextMenuType }}
*/
export function useContextMenu({ modalsManager, options, shortcuts }) {
// Open a new modal when context menu is triggered
const onContextMenu = useCallback((event, params = {}) => {
let positionX = (event?.clientX ?? 0);
let positionY = (event?.clientY ?? 0);
if (modalsManager.containerRef?.current) {
const containerRect = modalsManager.containerRef.current.getBoundingClientRect();
positionX -= containerRect.x;
positionY -= containerRect.y / 2;
}
const newModal = new Modal(ContextMenu)
.setPosition(new Vector2(positionX, positionY))
.setProps({ options, shortcuts, params });
modalsManager.open(newModal);
return newModal;
}, [modalsManager, options, shortcuts]);
useShortcuts({ options, shortcuts, useCategories: false });
return { onContextMenu };
}