Passed
Push — master ( 912bac...4ae8cd )
by Guangyu
05:25 queued 11s
created

src/components/experience/Experience.js   A

Complexity

Total Complexity 1
Complexity/F 0

Size

Lines of Code 67
Function Count 0

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 1
eloc 58
mnd 1
bc 1
fnc 0
dl 0
loc 67
rs 10
bpm 0
cpm 0
noi 0
c 0
b 0
f 0
1
import React, { Fragment, useState } from 'react';
2
import PropTypes from 'prop-types';
3
import { isIterableArray } from '../../helpers/utils';
4
import { Card, CardBody, Collapse } from 'reactstrap';
5
import FalconCardHeader from '../common/FalconCardHeader';
6
import ExperienceSummary from './ExperienceSummary';
7
import classNames from 'classnames';
8
import Loader from '../common/Loader';
9
import ExperienceForm from './ExperienceForm';
10
import Flex from '../common/Flex';
11
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
12
import useFakeFetch from '../../hooks/useFakeFetch';
13
14
const Experience = ({ experiences: rawExperiences, isEditable, isOpen, ...rest }) => {
15
  // Data
16
  const { loading: loadingExperiences, data: experiences, setData: setExperiences } = useFakeFetch(rawExperiences);
17
18
  const [collapse, setCollapse] = useState(isOpen);
19
20
  return (
21
    <Card {...rest}>
22
      <FalconCardHeader title="Experience" light={!isEditable} />
23
      <CardBody className={classNames('fs--1', { 'bg-light': isEditable })}>
24
        {isEditable && (
25
          <Fragment>
26
            <Flex
27
              align="center"
28
              className="mb-4 text-primary cursor-pointer fs-0"
29
              id="togglerAddExperience"
30
              onClick={() => {
31
                setCollapse(!collapse);
32
              }}
33
            >
34
              <span className="circle-dashed">
35
                <FontAwesomeIcon icon="plus" />
36
              </span>
37
              <span className="ml-3">Add new experience</span>
38
            </Flex>
39
            <Collapse toggler="#togglerAddExperience" isOpen={collapse}>
40
              <ExperienceForm experiences={experiences} setExperiences={setExperiences} />
41
              <hr className="border-dashed border-bottom-0 my-4" />
42
            </Collapse>
43
          </Fragment>
44
        )}
45
        {loadingExperiences ? (
46
          <Loader />
47
        ) : (
48
          isIterableArray(experiences) &&
49
          experiences.map((experience, index) => (
50
            <ExperienceSummary {...experience} isEditable={isEditable} key={index} />
51
          ))
52
        )}
53
      </CardBody>
54
    </Card>
55
  );
56
};
57
58
Experience.propTypes = {
59
  experiences: PropTypes.array,
60
  isEditable: PropTypes.bool,
61
  isOpen: PropTypes.bool
62
};
63
64
Experience.defaultProps = { isEditable: false, isOpen: false };
65
66
export default Experience;
67