Skip to content
Snippets Groups Projects
Button.js 1.45 KiB
Newer Older
chris's avatar
chris committed
/* eslint react/prop-types: 0 */
import React, { useContext, useMemo } from 'react';
chris's avatar
chris committed
import { useTranslation } from 'react-i18next';
chris's avatar
chris committed
import { WaxContext } from '../WaxContext';
import MenuButton from './ui/MenuButton';

const Button = ({ view = {}, item }) => {
chris's avatar
chris committed
  const { t, i18n } = useTranslation();
chris's avatar
chris committed
  const { active, icon, label, run, select, title } = item;
  const context = useContext(WaxContext);
  const {
    pmViews: { main },
    activeViewId,
    activeView,
  } = context;

  const isEditable = main.props.editable(editable => {
    return editable;
  });

  const { state } = view;

  const handleMouseDown = e => {
    e.preventDefault();
    run(activeView.state, activeView.dispatch, activeView, context);
  };

  const isActive = !!(
    active(activeView.state, activeViewId) &&
    select(state, activeViewId, activeView)
  );

chris's avatar
chris committed
  let isDisabled = !select(
    context.activeView.state,
    context.activeViewId,
    context.activeView,
  );
chris's avatar
chris committed
  if (!isEditable) isDisabled = true;

  const MenuButtonComponent = useMemo(
    () => (
      <MenuButton
        active={isActive || false}
        disabled={isDisabled}
        iconName={icon}
        label={label}
        onMouseDown={e => handleMouseDown(e)}
chris's avatar
chris committed
        title={
chris's avatar
chris committed
          i18n.exists(`Wax.Annotations.${title}`)
            ? t(`Wax.Annotations.${title}`)
chris's avatar
chris committed
            : title
        }
chris's avatar
chris committed
      />
    ),
    [isActive, isDisabled, activeViewId],
  );

  return MenuButtonComponent;
};

export default Button;