MetaPhase-Consulting/State-TalentMAP

View on GitHub
src/Components/ResultsFilterContainer/ResultsFilterContainer.jsx

Summary

Maintainability
A
0 mins
Test Coverage
F
28%
import { Component } from 'react';
import PropTypes from 'prop-types';
import ErrorBoundary from 'Components/ErrorBoundary';
import { isEmpty } from 'lodash';
import Sticky from 'react-sticky-el';
import { ACCORDION_SELECTION_OBJECT, BIDDER_OBJECT, FILTER_ITEMS_ARRAY,
  MISSION_DETAILS_ARRAY, POST_DETAILS_ARRAY } from '../../Constants/PropTypes';
import { ACCORDION_SELECTION } from '../../Constants/DefaultProps';
import SearchFiltersContainer from '../SearchFilters/SearchFiltersContainer';
import ResetFilters from '../ResetFilters/ResetFilters';
import MobileControls from './MobileControls';
import Spinner from '../Spinner';

class ResultsFilterContainer extends Component {
  shouldComponentUpdate(nextProps) {
    if (this.props !== nextProps) {
      return true;
    }
    return false;
  }

  render() {
    const { filters, resetFilters, setAccordion, selectedAccordion, isLoading,
      fetchMissionAutocomplete, missionSearchResults, missionSearchIsLoading,
      missionSearchHasErrored, fetchPostAutocomplete, onQueryParamUpdate, onQueryParamToggle,
      postSearchResults, postSearchIsLoading, postSearchHasErrored, showClear,
      client } = this.props;

    return (
      <div className={`filter-container ${isLoading ? 'is-loading' : ''}`}>
        {isLoading && <Spinner type="results-filter" size="small" />}
        <ErrorBoundary>
          <MobileControls />
        </ErrorBoundary>
        <div className="filter-container-bottom">
          <div className="usa-grid-full filter-control-container">
            <div className="filter-control-left">Select Filter:</div>
            <div className="filter-control-right">
              { showClear && <ResetFilters resetFilters={resetFilters} /> }
            </div>
          </div>
          <div className="usa-grid-full search-filters-container">
            <Sticky
              topOffset={0}
              hideOnBoundaryHit={false}
              stickyClassName={`${isEmpty(client) ? 'sticky' : 'filter-sticky-client-view'}`}
            >
              <ErrorBoundary>
                <SearchFiltersContainer
                  filters={filters}
                  queryParamUpdate={onQueryParamUpdate}
                  queryParamToggle={onQueryParamToggle}
                  selectedAccordion={selectedAccordion}
                  setAccordion={setAccordion}
                  fetchMissionAutocomplete={fetchMissionAutocomplete}
                  missionSearchResults={missionSearchResults}
                  missionSearchIsLoading={missionSearchIsLoading}
                  missionSearchHasErrored={missionSearchHasErrored}
                  fetchPostAutocomplete={fetchPostAutocomplete}
                  postSearchResults={postSearchResults}
                  postSearchIsLoading={postSearchIsLoading}
                  postSearchHasErrored={postSearchHasErrored}
                />
              </ErrorBoundary>
            </Sticky>
          </div>
        </div>
      </div>
    );
  }
}

ResultsFilterContainer.propTypes = {
  filters: FILTER_ITEMS_ARRAY.isRequired,
  isLoading: PropTypes.bool.isRequired,
  onQueryParamUpdate: PropTypes.func.isRequired,
  onQueryParamToggle: PropTypes.func.isRequired,
  resetFilters: PropTypes.func.isRequired,
  setAccordion: PropTypes.func.isRequired,
  selectedAccordion: ACCORDION_SELECTION_OBJECT,
  fetchMissionAutocomplete: PropTypes.func.isRequired,
  missionSearchResults: MISSION_DETAILS_ARRAY.isRequired,
  missionSearchIsLoading: PropTypes.bool.isRequired,
  missionSearchHasErrored: PropTypes.bool.isRequired,
  fetchPostAutocomplete: PropTypes.func.isRequired,
  postSearchResults: POST_DETAILS_ARRAY.isRequired,
  postSearchIsLoading: PropTypes.bool.isRequired,
  postSearchHasErrored: PropTypes.bool.isRequired,
  showClear: PropTypes.bool,
  client: BIDDER_OBJECT,
};

ResultsFilterContainer.defaultProps = {
  selectedAccordion: ACCORDION_SELECTION,
  showClear: false,
  client: {},
};

export default ResultsFilterContainer;