Skip to content
Snippets Groups Projects
BlockDropDownComponent.js 2.86 KiB
Newer Older
chris's avatar
chris committed
/* eslint-disable no-underscore-dangle */
chris's avatar
chris committed
import React, { useContext, useMemo, useState, useEffect } from 'react';
chris's avatar
chris committed
import styled from 'styled-components';
import { WaxContext, ReactDropDownStyles } from 'wax-prosemirror-core';
import Dropdown from 'react-dropdown';
import { v4 as uuidv4 } from 'uuid';

const Wrapper = styled.div`
  ${ReactDropDownStyles};
`;
const DropdownStyled = styled(Dropdown)`
  display: inline-flex;
  cursor: not-allowed;
  opacity: ${props => (props.select ? 1 : 0.4)};
  pointer-events: ${props => (props.select ? 'default' : 'none')};
  .Dropdown-control {
chris's avatar
chris committed
    width: 170px;
chris's avatar
chris committed
    border: none;
chris's avatar
chris committed
    padding: 12px 26px 8px 10px;
chris's avatar
chris committed
    &:hover {
      box-shadow: none;
    }
  }

  .Dropdown-arrow {
    top: 17px;
  }

  .Dropdown-menu {
chris's avatar
chris committed
    width: 102%;
chris's avatar
chris committed
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    .Dropdown-option {
      width: 100%;
    }
  }
`;

// eslint-disable-next-line react/prop-types
const BlockDropDownComponent = ({ view, tools }) => {
  const context = useContext(WaxContext);
  const {
    activeViewId,
    pmViews: { main },
  } = context;
chris's avatar
chris committed
  const [label, setLabel] = useState(null);
chris's avatar
chris committed

chris's avatar
chris committed
  const isEditable = main.props.editable(editable => {
    return editable;
  });

chris's avatar
chris committed
  const dropDownOptions = [
chris's avatar
chris committed
    // { label: 'Title (H1)', value: '0', item: tools[0] },
chris's avatar
chris committed
    // { label: 'author', value: '1', item: tools[1] },
    // { label: 'Subtitle', value: '2', item: tools[2] },
    // { label: 'Epigraph Prose', value: '3', item: tools[3] },
    // { label: 'Epigraph Poetry', value: '4', item: tools[4] },
    { label: 'Heading 2', value: '5', item: tools[5] },
    { label: 'Heading 3', value: '6', item: tools[6] },
    // { label: 'Heading 3', value: '7', item: tools[7] },
chris's avatar
chris committed
    { label: 'Paragraph', value: '8', item: tools[8] },
chris's avatar
chris committed
    // { label: 'Paragraph Continued', value: '9', item: tools[9] },
    // { label: 'Extract Prose', value: '10', item: tools[10] },
    // { label: 'Extract Poetry', value: '11', item: tools[11] },
    // { label: 'Source Note', value: '12', item: tools[12] },
chris's avatar
chris committed
    { label: 'Block Quote', value: '13', item: tools[13] },
  ];

chris's avatar
chris committed
  useEffect(() => {
    setLabel('Block Level');
    dropDownOptions.forEach(option => {
      if (option.item.active(main.state, activeViewId)) {
        setTimeout(() => {
          setLabel(option.item.label);
        });
      }
    });
  }, [main.state.selection.$from.parent.type.name]);
chris's avatar
chris committed

  const MultipleDropDown = useMemo(
    () => (
      <Wrapper key={uuidv4()}>
        <DropdownStyled
          key={uuidv4()}
          onChange={option => {
chris's avatar
chris committed
            tools[option.value].run(main.state, main.dispatch);
chris's avatar
chris committed
          }}
          options={dropDownOptions}
          placeholder="Block Level"
chris's avatar
chris committed
          select={isEditable}
chris's avatar
chris committed
          value={label}
chris's avatar
chris committed
        />
      </Wrapper>
    ),
chris's avatar
chris committed
    [label, isEditable],
chris's avatar
chris committed
  );

  return MultipleDropDown;
};

export default BlockDropDownComponent;