hexlet-codebattle/codebattle

View on GitHub
services/app/apps/codebattle/assets/js/widgets/utils/useChatContextMenu.js

Summary

Maintainability
A
25 mins
Test Coverage
import { useCallback, useState, useMemo } from 'react';

import { useContextMenu } from 'react-contexify';

/**
 * @typedef {{ user: {name: string, isBot: boolean, userId: number, canInvite: boolean}}} MenuRequest
 *
 * @return {{menuId: number, menuRequest: MenuRequest, displayMenu: Function}}
 *
 */
const useChatContextMenu = ({
  type,
  users,
  canInvite = false,
}) => {
  const menuConf = useMemo(() => ({ id: `${type}-chat` }), [type]);
  const { show } = useContextMenu(menuConf);

  const [menuRequest, setMenuRequest] = useState();

  const displayMenu = useCallback(event => {
    const { userId, userName } = event.currentTarget.dataset;

    if (!userId) {
      return;
    }

    const user = users.find(({ id }) => id === Number(userId));
    const request = {
      user: {
        name: user?.name || userName,
        isBot: user?.isBot || Number(userId) < 0,
        userId: user?.id || Number(userId),
        canInvite: user ? canInvite : false,
      },
    };

    setMenuRequest(request);
    show({ event });
  }, [show, users, canInvite, setMenuRequest]);

  return {
    menuId: menuConf.id,
    menuRequest,
    displayMenu,
  };
};

export default useChatContextMenu;