AugurProject/augur-ui

View on GitHub
src/modules/modal/components/modal-market-review.jsx

Summary

Maintainability
C
1 day
Test Coverage
import React, { Component } from "react";
import PropTypes from "prop-types";

import Styles from "modules/modal/components/common/common.styles";

import ModalActions from "modules/modal/components/common/modal-actions";
import Checkbox from "src/modules/common/components/checkbox/checkbox";

export default class ModalMarketReview extends Component {
  static propTypes = {
    closeModal: PropTypes.func.isRequired,
    markModalAsSeen: PropTypes.func.isRequired,
    unmarkModalAsSeen: PropTypes.func.isRequired,
    handleAction: PropTypes.func.isRequired,
    market: PropTypes.object.isRequired
  };

  constructor(props) {
    super(props);

    this.state = {
      didCheck: false,
      readMore: false
    };

    this.checkCheckbox = this.checkCheckbox.bind(this);
  }

  checkCheckbox() {
    this.setState({ didCheck: !this.state.didCheck }, () => {
      if (this.state.didCheck) {
        this.props.markModalAsSeen();
      } else {
        this.props.unmarkModalAsSeen();
      }
    });
  }

  render() {
    const { closeModal, handleAction, market } = this.props;
    const { didCheck } = this.state;

    const showReadMore = market.details && market.details.length > 126;
    const readMore = showReadMore && (
      <div>
        {`${market.details.substr(0, 126)}...`}{" "}
        <button
          onClick={() => this.setState({ readMore: true })}
          className={Styles.ModalMarketReview__ReadMore}
        >
          Read more
        </button>
      </div>
    );

    return (
      <section className={Styles.ModalMarketReview}>
        <h1>Review market details</h1>
        <div className={Styles.ModalMarketReview__Header}>
          <p>
            Review the markets details to confirm that there are{" "}
            <span>no conflicts</span>, in particular between the Markets
            Question, Additional Details and Reporting Start Time.
          </p>

          <p>
            If the reporting start time doesn’t match up to the title or
            description, the market might resolve as invalid.
          </p>
        </div>
        <div className={Styles.ModalMarketReview__TextBox}>
          <div>
            <p>Market Question</p>
            {market.description}
          </div>

          {market.details && (
            <div>
              <p>Additional details</p>
              {showReadMore && !this.state.readMore && readMore}
              {(!showReadMore || this.state.readMore) && (
                <div>{market.details}</div>
              )}
            </div>
          )}

          {market.endTime && (
            <div>
              <p>Reporting starts</p>
              <div>{market.endTime.formattedUtc}</div>
              <div>{market.endTime.formattedTimezone}</div>
            </div>
          )}

          <div>
            <p>Resolution source</p>
            {market.resolutionSource
              ? market.resolutionSource
              : "General knowledge"}
          </div>
        </div>

        <div
          className={Styles.ModalMarketReview__checkbox}
          role="button"
          tabIndex="0"
          onClick={e => {
            e.preventDefault();
            this.checkCheckbox();
          }}
        >
          <label htmlFor="marketReview">
            <Checkbox
              id="marketReview"
              type="checkbox"
              value={didCheck}
              isChecked={didCheck}
              onClick={e => {
                e.preventDefault();
                this.checkCheckbox();
              }}
            />
            Don’t show this message on any more markets
          </label>
        </div>

        <div className={Styles.ModalMarketReview__ActionButtons}>
          <ModalActions
            buttons={[
              {
                label: "Cancel",
                type: "gray",
                action: closeModal
              }
            ]}
          />
          <ModalActions
            buttons={[
              {
                label: "Confirm",
                type: "purple",
                action: handleAction
              }
            ]}
          />
        </div>
      </section>
    );
  }
}