MetaPhase-Consulting/State-TalentMAP

View on GitHub
src/Components/BidderPortfolio/BidderPortfolioGridItemAdditional/AdditionalView/AdditionalView.jsx

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
import PropTypes from 'prop-types';
import PositionInformation from '../../../ProfileDashboard/PositionInformation';
import ItemList from '../ItemList';
import Spinner from '../../../Spinner';
import AlertAlt from '../../../Alert/AlertAlt';
import { CLIENT_BY_ID } from '../../../../Constants/PropTypes';
import { formatBidTitle, formatWaiverTitle } from '../../../../utilities';
import { DRAFT_PROP, SUBMITTED_PROP } from '../../../../Constants/BidData';

const AdditionalView = ({ client, isLoading, hasErrored }) => {
  const showAlert = !isLoading && hasErrored;
  const showLoading = isLoading && !hasErrored;
  const showDetails = !isLoading && !hasErrored;

  // set to empty arrays until we're ready to render data
  let waiverList = [];
  let draftList = [];
  let submittedList = [];

  // If we're ready to render our waivers, convert objects into formatted
  // strings to display in lists
  const shouldMapWaivers = showDetails && client.waivers && client.waivers.length;
  if (shouldMapWaivers) {
    waiverList = client.waivers.map(waiver => formatWaiverTitle(waiver));
  }

  // And do the same for bids
  const shouldMapBids = showDetails && client.bids && client.bids.length;
  if (shouldMapBids) {
    draftList = client.bids
      .filter(bid => bid.status === DRAFT_PROP)
      .map(bid => formatBidTitle(bid));

    submittedList = client.bids
      .filter(bid => bid.status === SUBMITTED_PROP)
      .map(bid => formatBidTitle(bid));
  }
  return (
    <div className="usa-grid-full bidder-portfolio-additional-container">
      {
        showAlert &&
        <AlertAlt
          title="Error loading additional details"
          message="Try closing and re-opening this section"
          type="error"
        />
      }
      {
        showLoading &&
          <Spinner size="big" inverse type="portfolio-additional" />
      }
      {
        showDetails &&
          <div className="usa-grid-full bidder-portfolio-additional">
            <div className="usa-width-one-third bidder-portfolio-additional-section">
              <PositionInformation assignment={client.current_assignment || {}} />
            </div>
            <div className="usa-width-two-thirds">
              <div className="usa-width-one-whole bidder-portfolio-additional-section">
                <ItemList title="Waiver History" items={waiverList} />
              </div>
              <div className="usa-width-one-half bidder-portfolio-additional-section">
                <ItemList title="Draft Bids" items={draftList} />
              </div>
              <div className="usa-width-one-half bidder-portfolio-additional-section">
                <ItemList title="Submitted Bids" items={submittedList} />
              </div>
            </div>
          </div>
      }
    </div>
  );
};

AdditionalView.propTypes = {
  client: CLIENT_BY_ID.isRequired,
  isLoading: PropTypes.bool,
  hasErrored: PropTypes.bool,
};

AdditionalView.defaultProps = {
  isLoading: false,
  hasErrored: false,
};

export default AdditionalView;