Skip to content
Snippets Groups Projects
DropDownComponent.js 2.74 KiB
Newer Older
chris's avatar
chris committed
/* eslint-disable no-underscore-dangle */
import React, { useContext, useMemo, useEffect, useState } from 'react';
import styled from 'styled-components';
chris's avatar
chris committed
import { WaxContext, ReactDropDownStyles } from 'wax-prosemirror-core';
chris's avatar
chris committed
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 {
    border: none;
    padding: 12px 122px 8px 10px;
chris's avatar
chris committed
    &:hover {
      box-shadow: none;
    }
  }

  .Dropdown-arrow {
    top: 17px;
  }

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

const DropDownComponent = ({ view, tools }) => {
chris's avatar
chris committed
  const context = useContext(WaxContext);
  const {
    activeView,
    activeViewId,
chris's avatar
chris committed
    pmViews: { main },
chris's avatar
chris committed
  } = context;
  const { state } = view;

  const [label, setLabel] = useState(null);
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: 'Multiple Choice',
chris's avatar
chris committed
      value: '0',
      item: tools[0],
    },
    {
chris's avatar
chris committed
      label: 'Multiple Choice (single correct)',
chris's avatar
chris committed
      value: '1',
      item: tools[1],
    },
    {
chris's avatar
chris committed
      label: 'True/False',
chris's avatar
chris committed
      value: '2',
      item: tools[2],
    },
    {
chris's avatar
chris committed
      label: 'True/False (single correct)',
chris's avatar
chris committed
      value: '3',
      item: tools[3],
    },
chris's avatar
chris committed
    {
chris's avatar
chris committed
      label: 'Matching',
chris's avatar
chris committed
      value: '4',
      item: tools[4],
    },
chris's avatar
chris committed
    {
chris's avatar
chris committed
      label: 'Essay',
chris's avatar
chris committed
      value: '5',
      item: tools[5],
    },
chris's avatar
chris committed
      label: 'Multiple DropDown',
      value: '6',
      item: tools[6],
    },
    {
chris's avatar
chris committed
      label: 'Fill The Gap',
      value: '7',
      item: tools[7],
    },
chris's avatar
chris committed
  ];

  useEffect(() => {
chris's avatar
chris committed
    setLabel('Question Type');
    dropDownOptions.forEach(option => {
chris's avatar
chris committed
      if (option.item.active(main.state)) {
chris's avatar
chris committed
        setTimeout(() => {
          setLabel(option.label);
        });
chris's avatar
chris committed
      }
    });
  }, [activeViewId]);

chris's avatar
chris committed
  let isDisabled = tools[0].select(state, activeView);
  if (!isEditable) isDisabled = false;
chris's avatar
chris committed

  const onChange = option => {
    tools[option.value].run(main, context);
  };

  const MultipleDropDown = useMemo(
    () => (
      <Wrapper key={uuidv4()}>
        <DropdownStyled
          key={uuidv4()}
          onChange={option => onChange(option)}
          options={dropDownOptions}
chris's avatar
chris committed
          placeholder="Question Type"
chris's avatar
chris committed
          select={isDisabled}
          value={label}
        />
      </Wrapper>
    ),
    [isDisabled, label],
  );

  return MultipleDropDown;
};

chris's avatar
chris committed
export default DropDownComponent;