Skip to content
Snippets Groups Projects
TransformCaseComponent.js 3.9 KiB
Newer Older
import React, { useContext, useMemo, useRef, useState } from 'react';
import styled from 'styled-components';
chris's avatar
chris committed
import { isEmpty } from 'lodash';
import { useTranslation } from 'react-i18next';
chris's avatar
chris committed
import { grid, override } from '@pubsweet/ui-toolkit';
import { v4 as uuid } from 'uuid';
chris's avatar
chris committed
import {
  WaxContext,
  useOnClickOutside,
  MenuButton,
chris's avatar
chris committed
  Icon,
chris's avatar
chris committed
} from 'wax-prosemirror-core';

const Wrapper = styled.div`
  font-size: 0;
  position: relative;
  z-index: 2;
`;

const DropWrapper = styled.div`
  background: white;
  margin-top: ${grid(1)};
  position: absolute;
  top: 32px;
  width: max-content;
chris's avatar
chris committed

  ${override('Wax.TransformToolWrapper')}
`;
const TextTransformCaseComponent = styled.div`
  background: white;
  border: 1px solid gray;
  display: flex;
  flex-direction: column;
`;
const Transformer = styled.div`
  cursor: pointer;
  display: inline-grid;
  height: 25px;
  margin: 5px 10px;
  min-width: 25px;
`;

const StyledIcon = styled(Icon)`
  height: 24px;
  width: 24px;
`;

const TransformCaseComponent = ({ view: { state }, item }) => {
  const { icon, title, select } = item;
  const [isOpen, setIsOpen] = useState(false);
  const ref = useRef();
chris's avatar
chris committed
  const { activeViewId, activeView, pmViews } = useContext(WaxContext);

  const isEditable = pmViews.main.props.editable(editable => {
chris's avatar
chris committed
    return editable;
  });
  let isDisabled = !select(state, activeViewId, activeView);
  if (!isEditable) isDisabled = true;

  useOnClickOutside(ref, () => setIsOpen(false));

chris's avatar
chris committed
  const { t, i18n } = useTranslation();
chris's avatar
chris committed
  const translatedLabel = (translation, defaultTr) => {
chris's avatar
chris committed
    return !isEmpty(i18n) && i18n.exists(translation)
      ? t(translation)
chris's avatar
chris committed
      : defaultTr;
chris's avatar
chris committed
  };

  const transformCaseDropDown = [
chris's avatar
chris committed
    {
      id: 1,
chris's avatar
chris committed
      name: translatedLabel('Wax.TransformCase.Upper Case', 'Upper Case'),
chris's avatar
chris committed
      iconName: 'transformCase',
    },
    {
      id: 2,
chris's avatar
chris committed
      name: translatedLabel('Wax.TransformCase.Lower Case', 'Lower Case'),
chris's avatar
chris committed
      iconName: 'lowerCaseTransform',
    },
    {
      id: 3,
chris's avatar
chris committed
      name: translatedLabel('Wax.TransformCase.Sentence Case', 'Sentence Case'),
chris's avatar
chris committed
      iconName: 'transformCase',
    },
chris's avatar
chris committed
    // { id: 4, name: 'Title Case', iconName: 'transformCase' },
  ];

  const onClickTransform = (e, id) => {
    switch (id) {
      case 1:
        item.run(activeView.state, activeView.dispatch, 'upperCase');
        break;
      case 2:
        item.run(activeView.state, activeView.dispatch, 'lowerCase');
        break;
      case 3:
        item.run(activeView.state, activeView.dispatch, 'sentenceCase');
        break;
chris's avatar
chris committed
      // case 4:
      //   item.run(activeView.state, activeView.dispatch, 'titleCase');
      //   break;
    setIsOpen(false);
  };

  const renderList = () => {
    return (
      <div>
        {transformCaseDropDown.map(data => (
          <Transformer
            key={uuid()}
            onClick={e => onClickTransform(e, data.id)}
            title={data.name}
          >
            <StyledIcon name={data.iconName} />
          </Transformer>
        ))}
      </div>
  };

  return useMemo(
    () => (
      <Wrapper ref={ref}>
        <MenuButton
          active={isOpen}
          disabled={isDisabled}
          iconName={icon}
          onMouseDown={() => {
            setIsOpen(!isOpen);
          }}
chris's avatar
chris committed
          title={
            !isEmpty(i18n) && i18n.exists(`Wax.TransformCase.${title}`)
              ? t(`Wax.TransformCase.${title}`)
              : title
          }
        />

        {isOpen && (
          <DropWrapper>
            <TextTransformCaseComponent
              close={() => {
                setIsOpen(false);
              }}
              item={item}
              key={uuid()}
              view={state}
            >
              {renderList()}
            </TextTransformCaseComponent>
          </DropWrapper>
        )}
      </Wrapper>
    ),
chris's avatar
chris committed
    [isOpen, isDisabled, t(`Wax.TransformCase.${title}`)],
};

export default TransformCaseComponent;