Passed
Push — master ( cfe6bd...bdceca )
by Guangyu
04:33 queued 12s
created

src/components/e-commerce/FavouriteItems.js   A

Complexity

Total Complexity 3
Complexity/F 0

Size

Lines of Code 141
Function Count 0

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 3
eloc 125
mnd 3
bc 3
fnc 0
dl 0
loc 141
rs 10
bpm 0
cpm 0
noi 0
c 0
b 0
f 0
1
import React, { Fragment, useContext, useState } from 'react';
2
import PropTypes from 'prop-types';
3
import AppContext, { ProductContext } from '../../context/Context';
4
import { Card, CardBody, Col, Media, Row } from 'reactstrap';
5
import { Link } from 'react-router-dom';
6
import { calculateSale, isIterableArray } from '../../helpers/utils';
7
import FalconCardHeader from '../common/FalconCardHeader';
8
import ButtonIcon from '../common/ButtonIcon';
9
10
const FavouriteItem = ({ id }) => {
11
  const { currency } = useContext(AppContext);
12
  const { products, handleCartAction, favouriteItemsDispatch } = useContext(ProductContext);
13
  const [cartLoading, setCartLoading] = useState(false);
14
15
  const handleAddToCart = () => {
16
    setCartLoading(true);
17
    setTimeout(() => {
18
      handleCartAction({ id });
19
      setCartLoading(false);
20
    }, 1000);
21
  };
22
23
  const { title, files, price, sale } = products.find(product => product.id === id);
24
25
  return (
26
    <Row noGutters className="align-items-center px-1 border-bottom border-200">
27
      <Col xs={8} className="py-3 px-2 px-md-3">
28
        <Media className="align-items-center">
29
          <Link to={`/e-commerce/product-details/${id}`}>
30
            <img
31
              className="rounded mr-3 d-none d-md-block"
32
              src={files[0]['src'] || files[0]['base64']}
33
              alt=""
34
              width="60"
35
            />
36
          </Link>
37
          <Media body>
38
            <h5 className="fs-0">
39
              <Link className="text-900" to={`/e-commerce/product-details/${id}`}>
40
                {title}
41
              </Link>
42
            </h5>
43
            <div
44
              className="fs--2 fs-md--1 text-danger cursor-pointer"
45
              onClick={() => favouriteItemsDispatch({ type: 'REMOVE', id })}
46
            >
47
              Remove
48
            </div>
49
          </Media>
50
        </Media>
51
      </Col>
52
      <Col xs={4} className="p-3">
53
        <Row className="align-items-center">
54
          <Col md={4} className="d-flex justify-content-end justify-content-md-center px-2 px-md-3 order-1 order-md-0">
55
            {currency}
56
            {calculateSale(price, sale)}
57
          </Col>
58
          <Col md={8} className="text-right pl-0 pr-2 pr-md-3 order-0 order-md-1 mb-2 mb-md-0 text-600">
59
            {cartLoading ? (
60
              <ButtonIcon
61
                color="outline-primary"
62
                size="sm"
63
                icon="circle-notch"
64
                iconClassName="fa-spin ml-2 d-none d-md-inline-block"
65
                style={{ cursor: 'progress' }}
66
                disabled
67
              >
68
                Processing
69
              </ButtonIcon>
70
            ) : (
71
              <ButtonIcon
72
                color="outline-primary"
73
                size="sm"
74
                icon="cart-plus"
75
                iconClassName="ml-2 d-none d-md-inline-block"
76
                onClick={handleAddToCart}
77
              >
78
                Add to Cart
79
              </ButtonIcon>
80
            )}
81
          </Col>
82
        </Row>
83
      </Col>
84
    </Row>
85
  );
86
};
87
88
FavouriteItem.propTypes = { id: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired };
89
90
const FavouriteItems = () => {
91
  const { favouriteItems } = useContext(ProductContext);
92
93
  return (
94
    <Card>
95
      <FalconCardHeader
96
        title={`Favourites (${favouriteItems.length} Item${favouriteItems.length === 1 ? '' : 's'})`}
97
        light={false}
98
      >
99
        <ButtonIcon
100
          icon="chevron-left"
101
          color="primary"
102
          size="sm"
103
          className="border-300"
104
          tag={Link}
105
          to="/e-commerce/products/list"
106
        >
107
          Continue Shopping
108
        </ButtonIcon>
109
      </FalconCardHeader>
110
      <CardBody className="p-0">
111
        {isIterableArray(favouriteItems) ? (
112
          <Fragment>
113
            <Row noGutters className="bg-200 text-900 px-1 fs--1 font-weight-semi-bold">
114
              <Col xs={9} md={8} className="p-2 px-md-3">
115
                Name
116
              </Col>
117
              <Col xs={3} md={4} className="px-3">
118
                <Row>
119
                  <Col md={4} className="py-2 d-none d-md-block text-center">
120
                    Price
121
                  </Col>
122
                  <Col md={8} className="text-right p-2 px-md-3">
123
                    Cart
124
                  </Col>
125
                </Row>
126
              </Col>
127
            </Row>
128
            {favouriteItems.map(favouriteItem => (
129
              <FavouriteItem {...favouriteItem} key={favouriteItem.id} />
130
            ))}
131
          </Fragment>
132
        ) : (
133
          <p className="p-card mb-0 bg-light">0 items in your Favourite list. Go ahead and add something!</p>
134
        )}
135
      </CardBody>
136
    </Card>
137
  );
138
};
139
140
export default FavouriteItems;
141