Skip to content
Snippets Groups Projects
RangeAnswerComponent.js 2.91 KiB
Newer Older
chris's avatar
chris committed
import React, { useRef, useState, useContext } from 'react';
chris's avatar
chris committed
import styled from 'styled-components';
chris's avatar
chris committed
import { DocumentHelpers, WaxContext } from 'wax-prosemirror-core';
chris's avatar
chris committed

chris's avatar
chris committed
const AnswerContainer = styled.div`
chris's avatar
chris committed
  display: flex;
  flex-direction: row;
  width: 100%;
`;

const ValueContainer = styled.div`
  display: flex;
  flex-direction: column;
  margin-right: 25px;
  label {
    font-size: 12px;
  }

  input:focus {
    outline: none;
  }
`;

const ValueInnerContainer = styled.div`
  display: flex;
  flex-direction: column;
`;
chris's avatar
chris committed

chris's avatar
chris committed
const RangeAnswerComponent = ({ node }) => {
  const context = useContext(WaxContext);
chris's avatar
chris committed
  const [minValue, setMinValue] = useState('');
  const [maxValue, setMaxValue] = useState('');

  const minRef = useRef(null);
  const maxRef = useRef(null);

  const onlyNumbers = value => {
    return value
      .replace(/[^0-9.]/g, '')
      .replace(/(\..*?)\..*/g, '$1')
      .replace(/^0[^.]/, '0');
  };

chris's avatar
chris committed
  const SaveValuesToNode = () => {
    const allNodes = getNodes(context.pmViews.main);
    allNodes.forEach(singleNode => {
      if (singleNode.node.attrs.id === node.attrs.id) {
        const obj = {
          minAnswer: onlyNumbers(minRef.current.value),
chris's avatar
chris committed
          maxAnswer: onlyNumbers(maxRef.current.value),
chris's avatar
chris committed
        };

        context.pmViews.main.dispatch(
          context.pmViews.main.state.tr.setNodeMarkup(
            singleNode.pos,
            undefined,
            {
              ...singleNode.node.attrs,
              answersRange: obj,
            },
          ),
        );
      }
    });
  };

chris's avatar
chris committed
  const onChangeMin = () => {
    setMinValue(onlyNumbers(minRef.current.value));
chris's avatar
chris committed
    SaveValuesToNode();
chris's avatar
chris committed
  };

  const onChangeMax = () => {
    setMaxValue(onlyNumbers(maxRef.current.value));
chris's avatar
chris committed
    SaveValuesToNode();
chris's avatar
chris committed
  };

  return (
chris's avatar
chris committed
    <AnswerContainer>
chris's avatar
chris committed
      <ValueContainer>
        <label htmlFor="minAnswer">
          <ValueInnerContainer>
            <span>Min</span>
            <input
              name="minAnswer"
              onChange={onChangeMin}
              ref={minRef}
              type="text"
              value={minValue}
            />
          </ValueInnerContainer>
        </label>
      </ValueContainer>
      <ValueContainer>
        <label htmlFor="maxAnswer">
          <ValueInnerContainer>
            <span>Max</span>
            <input
              name="maxAnswer"
              onChange={onChangeMax}
              ref={maxRef}
              type="text"
              value={maxValue}
            />
          </ValueInnerContainer>
        </label>
      </ValueContainer>
chris's avatar
chris committed
    </AnswerContainer>
chris's avatar
chris committed
  );
const getNodes = view => {
  const allNodes = DocumentHelpers.findBlockNodes(view.state.doc);
  const numericalAnswerpContainerNodes = [];
  allNodes.forEach(node => {
    if (node.node.type.name === 'numerical_answer_container') {
      numericalAnswerpContainerNodes.push(node);
    }
  });
  return numericalAnswerpContainerNodes;
};

chris's avatar
chris committed
export default RangeAnswerComponent;