MetaPhase-Consulting/State-TalentMAP

View on GitHub
src/Components/Agenda/AgendaItemHistory/AgendaItemHistory.jsx

Summary

Maintainability
A
1 hr
Test Coverage
F
6%
import { useEffect, useState } from 'react';
import BackButton from 'Components/BackButton';
import { AGENDA_ITEM_HISTORY_FILTERS } from 'Constants/Sort';
import SelectForm from 'Components/SelectForm';
import { get, isNil } from 'lodash';
import { useDispatch, useSelector } from 'react-redux';
import { withRouter } from 'react-router';
import { Link } from 'react-router-dom';
import { agendaItemHistoryExport, aihFetchData } from 'actions/agendaItemHistory';
import { useMount, usePrevious } from 'hooks';
import ExportButton from 'Components/ExportButton';
import Spinner from 'Components/Spinner';
import Alert from 'Components/Alert';
import { checkFlag } from 'flags';
import FontAwesome from 'react-fontawesome';
import AgendaItemCard from '../AgendaItemCard';
import AgendaItemRow from '../AgendaItemRow';
import ResultsViewBy from '../../ResultsViewBy/ResultsViewBy';
import ScrollUpButton from '../../ScrollUpButton';

const useAgendaItemMaintenance = () => checkFlag('flags.agenda_item_maintenance');
const useAgendaItemMaintenanceCreate = () => checkFlag('flags.agenda_item_maintenance_create');

const AgendaItemHistory = (props) => {
  const sorts = AGENDA_ITEM_HISTORY_FILTERS;
  const perdet = get(props, 'match.params.id');
  const isCDO = get(props, 'isCDO');
  const viewType = get(props, 'viewType');
  const showAgendaItemMaintenance = useAgendaItemMaintenance();
  const showAgendaItemMaintenanceCreate = useAgendaItemMaintenanceCreate();

  const [cardView, setCardView] = useState(false);
  const [sort, setSort] = useState(sorts.defaultSort);

  const [exportIsLoading, setExportIsLoading] = useState(false);
  const view = cardView ? 'card' : 'grid';

  const aihResults = useSelector(state => state.aih);
  const isLoading = useSelector(state => state.aihIsLoading);
  const hasErrored = useSelector(state => state.aihHasErrored);

  const aih = get(aihResults, 'results.results') || [];

  const employee = get(aihResults, 'employee.results', [])[0] || {};
  const employeeName = get(employee, 'person.fullName') || '';

  const employeeHasCDO = !isNil(get(employee, 'person.cdo'));

  let profileLink;
  switch (viewType) {
    case 'ao':
      profileLink = employeeHasCDO ?
        (
          <Link to={`/profile/public/${perdet}/ao`}>
            <span className="aih-title">
              {` ${employeeName}`}
            </span>
          </Link>
        ) : employeeName;
      break;
    case 'cdo':
      profileLink = isCDO && employeeHasCDO ?
        (<Link to={`/profile/public/${perdet}`}>
          <span className="aih-title">
            {` ${employeeName}`}
          </span>
        </Link>)
        : employeeName;
      break;
    default:
      profileLink = employeeName;
      break;
  }

  // Actions
  const dispatch = useDispatch();

  const getData = () => {
    dispatch(aihFetchData(perdet, sort));
  };

  const prevSort = usePrevious(sort);

  const exportAgendaItem = () => {
    if (!exportIsLoading) {
      setExportIsLoading(true);
      agendaItemHistoryExport(perdet, sort, employeeName.replaceAll(' ', '_'))
        .then(() => {
          setExportIsLoading(false);
        })
        .catch(() => {
          setExportIsLoading(false);
        });
    }
  };

  useMount(() => {
    getData();
  });

  useEffect(() => {
    if (prevSort && sort && sort !== prevSort) {
      getData();
    }
  }, [sort]);

  const isLoading$ = isLoading;

  const exportDisabled = (aih || []).length <= 0;

  return (
    <div className="agenda-item-history-container">
      <div className="aih-header-container">
        <FontAwesome
          name="user-circle-o"
          size="lg"
        />
        Agenda Item History
        {
          <span className="aih-title-dash">
              -
            {profileLink}
          </span>
        }
      </div>
      <div className="usa-grid-full profile-content-inner-container">
        <BackButton />
        <div className="usa-grid-full portfolio-controls">
          <div className="usa-width-one-whole results-dropdown agenda-controls-container">
            <div className="agenda-results-controls">
              <ResultsViewBy initial={view} onClick={e => setCardView(e === 'card')} />
              <SelectForm
                id="agenda-item-history-results"
                options={sorts.options}
                label="Sort by:"
                defaultSort={sort}
                onSelectOption={e => setSort(get(e, 'target.value'))}
              />
              {
                false &&
                <div className="export-button-container">
                  <ExportButton
                    onClick={exportAgendaItem}
                    isLoading={exportIsLoading}
                    disabled={exportDisabled}
                  />
                </div>
              }
            </div>
          </div>
        </div>
        {
          isLoading$ && !hasErrored && <div className="ai-history-cards-container"><Spinner type="agenda-item-history" size="big" /></div>
        }
        {
          !isLoading$ && !hasErrored && (aih || []).length < 1 &&
          <div className="ai-history-cards-container"><Alert type="info" title="No agenda items" messages={[{ body: 'This user does not have any agenda items.' }]} /></div>
        }
        {
          !isLoading$ && hasErrored &&
          <div className="ai-history-cards-container"><Alert type="error" title="Error loading agenda history" messages={[{ body: 'Please try again.' }]} /></div>
        }
        {
          !isLoading$ && !hasErrored &&
            <>
              {
                cardView &&
                <div className="ai-history-cards-container">
                  {
                    showAgendaItemMaintenance && showAgendaItemMaintenanceCreate &&
                      <AgendaItemCard
                        isCreate
                        isCDO={isCDO}
                        perdet={Number(perdet)}
                      />
                  }
                  {
                    aih.map(result => (
                      <AgendaItemCard
                        key={result.id}
                        agenda={result}
                        isCDO={isCDO}
                        isAIHView
                      />
                    ))
                  }
                </div>
              }
              {
                !cardView &&
                <div className="agenda-item-row-container">
                  {
                    showAgendaItemMaintenance && showAgendaItemMaintenanceCreate &&
                      <AgendaItemRow
                        isCreate
                        isCDO={isCDO}
                        perdet={Number(perdet)}
                      />
                  }
                  {
                    aih.map(result => (
                      <AgendaItemRow
                        agenda={result}
                        key={result.id}
                        isCDO={isCDO}
                      />
                    ))
                  }
                </div>
              }
            </>
        }
        <ScrollUpButton />
      </div>
    </div>
  );
};

export default withRouter(AgendaItemHistory);