Skip to content
Snippets Groups Projects
EditingSuggestingDropDown.js 2.8 KiB
Newer Older
/* eslint react/prop-types: 0 */
chris's avatar
chris committed
import React, { useMemo, useContext } from 'react';
import styled from 'styled-components';
chris's avatar
chris committed
import { WaxContext, ReactDropDownStyles } from 'wax-prosemirror-core';
import Dropdown from 'react-dropdown';
chris's avatar
chris committed
import { Icon } from 'wax-prosemirror-components';
chris's avatar
chris committed
const Wrapper = styled.span`
  ${ReactDropDownStyles};
`;

const DropdownStyled = styled(Dropdown)`
  display: inline-flex;
  opacity: ${props => (props.select ? 1 : 0.4)};

  .Dropdown-control {
    border: none;
chris's avatar
chris committed
    cursor: ${props => (props.select ? 'pointer' : 'not-allowed')};
    pointer-events: ${props => (props.select ? 'default' : 'none')};
chris's avatar
chris committed

    &:hover {
      box-shadow: none;
    }
  }

  .Dropdown-arrow {
    right: 25px;
    top: 14px;
  }

  .Dropdown-menu {
    align-items: flex-start;
    display: flex;
    flex-direction: column;
    width: 120%;

    .Dropdown-option {
      width: 100%;
    }
  }
`;

const StyledIcon = styled(Icon)`
  height: 16px;
  margin-right: 5px;
  width: 16px;
`;

const Editing = () => {
  return (
    <span>
      <StyledIcon name="editing" />
      Editing
    </span>
  );
};

const Suggesting = () => {
  return (
    <span>
      <StyledIcon name="suggesting" />
      Suggesting
    </span>
  );
};

const Viewing = () => {
  return (
    <span>
      <StyledIcon name="viewing" />
      Viewing
    </span>
  );
};

const dropDownOptions = [
  { label: <Editing />, value: 'editing' },
  { label: <Suggesting />, value: 'suggesting' },
chris's avatar
chris committed
// eslint-disable-next-line no-unused-vars
const EditingSuggesting = ({ view: { dispatch, state }, item }) => {
chris's avatar
chris committed
  const { app, activeView, pmViews } = useContext(WaxContext);
chris's avatar
chris committed
  const enableService = app.config.get('config.EnableTrackChangeService')
    ? app.config.get('config.EnableTrackChangeService')
    : { toggle: false };
  const isDisabled = enableService.toggle;
chris's avatar
chris committed
  const isEditable = pmViews.main.props.editable(editable => {
    return editable;
  });

  const enableDisableTrackChanges = () => {
    enableService.enabled = !enableService.enabled;
    if (enableService.updateTrackStatus)
      enableService.updateTrackStatus(enableService.enabled);

chris's avatar
chris committed
    setTimeout(() => {
      activeView.focus();
    }, 100);
chris's avatar
chris committed
  };

  const selectedOption = () => {
    if (enableService.enabled) {
chris's avatar
chris committed
      return dropDownOptions[1];
chris's avatar
chris committed
    return dropDownOptions[0];
  };

  const EditingSuggestingComponent = useMemo(
    () => (
chris's avatar
chris committed
      <Wrapper>
        <DropdownStyled
chris's avatar
chris committed
          // eslint-disable-next-line no-unused-vars
chris's avatar
chris committed
          onChange={option => {
            return enableDisableTrackChanges();
          }}
          options={dropDownOptions}
          select={isDisabled}
          value={selectedOption()}
        />
      </Wrapper>
  if (!isEditable) return <Viewing />;
  return EditingSuggestingComponent;
};

export default EditingSuggesting;