Skip to content
Snippets Groups Projects
MultipleDropDownComponent.js 2.43 KiB
Newer Older
chris's avatar
chris committed
import React, { useContext, useEffect, useState } from 'react';
chris's avatar
chris committed
import { WaxContext, Icon } from 'wax-prosemirror-core';
import { v4 as uuidv4 } from 'uuid';
chris's avatar
chris committed
import styled, { css } from 'styled-components';
chris's avatar
chris committed
import ReadOnlyDropDown from './ReadOnlyDropDown';
chris's avatar
chris committed

const activeStylesContainer = css`
  background: #535e76;
chris's avatar
chris committed
  border-radius: 2px;
chris's avatar
chris committed
`;

const activeStylesSvg = css`
  fill: white !important;
`;

chris's avatar
chris committed
const StyledIconActionContainer = styled.span`
chris's avatar
chris committed
  display: inline-block;
chris's avatar
chris committed
  height: 24px;
  width: 24px;
chris's avatar
chris committed
  cursor: pointer;
chris's avatar
chris committed
  ${props => props.isActive && activeStylesContainer}
`;
chris's avatar
chris committed

chris's avatar
chris committed
const StyledIconAction = styled(Icon)`
chris's avatar
chris committed
  ${props => props.isActive && activeStylesSvg}
chris's avatar
chris committed
`;

chris's avatar
chris committed
const AnswerContainer = styled.div`
  display: inline-block;
  border-bottom: ${props =>
chris's avatar
chris committed
    props.isCorrect ? '1px solid #008000;' : '1px solid #FF3030'};
chris's avatar
chris committed
  border-top: ${props =>
chris's avatar
chris committed
    props.isCorrect ? '1px solid #008000;' : '1px solid #FF3030'};
chris's avatar
chris committed
  border-radius: 192px;
  padding: 2px 4px 2px 4px;
chris's avatar
chris committed
`;

chris's avatar
chris committed
const CorrectAnswer = styled.span``;

const Answer = styled.span``;
chris's avatar
chris committed

chris's avatar
chris committed
export default ({ node, getPos }) => {
chris's avatar
chris committed
  const context = useContext(WaxContext);
  const {
    pmViews: { main },
chris's avatar
chris committed
    pmViews,
    activeViewId,
chris's avatar
chris committed
  } = context;

chris's avatar
chris committed
  const [isActive, setIsActive] = useState(false);
chris's avatar
chris committed

chris's avatar
chris committed
  const customProps = main.props.customValues;
chris's avatar
chris committed
  const posFrom = pmViews[activeViewId].state.selection.from;
chris's avatar
chris committed

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

chris's avatar
chris committed
  const readOnly = !isEditable;
chris's avatar
chris committed
  useEffect(() => {
    setIsActive(false);
chris's avatar
chris committed
    if (getPos() === posFrom) {
chris's avatar
chris committed
      setIsActive(true);
    }
chris's avatar
chris committed
  }, [posFrom]);
chris's avatar
chris committed

chris's avatar
chris committed
  if (!readOnly) {
    return (
chris's avatar
chris committed
      <StyledIconActionContainer isActive={isActive}>
        <StyledIconAction isActive={isActive} name="mulitpleDropDown" />
      </StyledIconActionContainer>
    );
chris's avatar
chris committed
  }
chris's avatar
chris committed

  if (!(readOnly && customProps && !customProps.showFeedBack)) {
    const answer = node.attrs.options.find(
      option => option.value === node.attrs.answer,
    );

chris's avatar
chris committed
    const correct = node.attrs.options.find(
      option => option.value === node.attrs.correct,
    );

    const isCorrect = node.attrs.correct === node.attrs.answer;

chris's avatar
chris committed
    return (
chris's avatar
chris committed
      <AnswerContainer isCorrect={isCorrect}>
        Correct:
        {correct && <CorrectAnswer> {correct.label} | &nbsp;</CorrectAnswer>}
        Answer: {answer && <Answer> {answer.label}</Answer>}
      </AnswerContainer>
chris's avatar
chris committed
    );
chris's avatar
chris committed
  }
chris's avatar
chris committed

  return <ReadOnlyDropDown getPos={getPos} node={node} uniqueId={uuidv4()} />;
chris's avatar
chris committed
};