Completed
Push — master ( 158ed8...34f194 )
by Alejandro
04:53 queued 02:19
created

ShortUrlsRowMenu.js ➔ render   B

Complexity

Conditions 3

Size

Total Lines 56
Code Lines 55

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 8
CRAP Score 3

Importance

Changes 0
Metric Value
eloc 55
dl 0
loc 56
ccs 8
cts 8
cp 1
rs 8.4727
c 0
b 0
f 0
cc 3
crap 3

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
import { faCopy as copyIcon, faImage as pictureIcon } from '@fortawesome/free-regular-svg-icons';
2
import {
3
  faTags as tagsIcon,
4
  faChartPie as pieChartIcon,
5
  faEllipsisV as menuIcon,
6
  faQrcode as qrIcon,
7
  faMinusCircle as deleteIcon,
8
} from '@fortawesome/free-solid-svg-icons';
9
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
10
import React from 'react';
11
import { CopyToClipboard } from 'react-copy-to-clipboard';
12
import { Link } from 'react-router-dom';
13
import { ButtonDropdown, DropdownItem, DropdownMenu, DropdownToggle } from 'reactstrap';
14
import PropTypes from 'prop-types';
15
import { serverType } from '../../servers/prop-types';
16
import { shortUrlType } from '../reducers/shortUrlsList';
17
import PreviewModal from './PreviewModal';
18
import QrCodeModal from './QrCodeModal';
19
import './ShortUrlsRowMenu.scss';
20
21 7
const ShortUrlsRowMenu = (DeleteShortUrlModal, EditTagsModal) => class ShortUrlsRowMenu extends React.Component {
22
  static propTypes = {
23
    onCopyToClipboard: PropTypes.func,
24
    selectedServer: serverType,
25
    shortUrl: shortUrlType,
26
  };
27
28
  state = {
29
    isOpen: false,
30
    isQrModalOpen: false,
31
    isPreviewModalOpen: false,
32
    isTagsModalOpen: false,
33
    isDeleteModalOpen: false,
34
  };
35 1
  toggle = () => this.setState(({ isOpen }) => ({ isOpen: !isOpen }));
36
37
  render() {
38 12
    const { onCopyToClipboard, shortUrl, selectedServer } = this.props;
39 12
    const completeShortUrl = shortUrl && shortUrl.shortUrl ? shortUrl.shortUrl : '';
40 48
    const toggleModal = (prop) => () => this.setState((prevState) => ({ [prop]: !prevState[prop] }));
41 12
    const toggleQrCode = toggleModal('isQrModalOpen');
42 12
    const togglePreview = toggleModal('isPreviewModalOpen');
43 12
    const toggleTags = toggleModal('isTagsModalOpen');
44 12
    const toggleDelete = toggleModal('isDeleteModalOpen');
45
46 12
    return (
47
      <ButtonDropdown toggle={this.toggle} isOpen={this.state.isOpen}>
48
        <DropdownToggle size="sm" caret outline className="short-urls-row-menu__dropdown-toggle">
49
          &nbsp;<FontAwesomeIcon icon={menuIcon} />&nbsp;
50
        </DropdownToggle>
51
        <DropdownMenu right>
52
          <DropdownItem tag={Link} to={`/server/${selectedServer ? selectedServer.id : ''}/short-code/${shortUrl.shortCode}/visits`}>
53
            <FontAwesomeIcon icon={pieChartIcon} /> &nbsp;Visit stats
54
          </DropdownItem>
55
56
          <DropdownItem onClick={toggleTags}>
57
            <FontAwesomeIcon icon={tagsIcon} /> &nbsp;Edit tags
58
          </DropdownItem>
59
          <EditTagsModal
60
            url={completeShortUrl}
61
            shortUrl={shortUrl}
62
            isOpen={this.state.isTagsModalOpen}
63
            toggle={toggleTags}
64
          />
65
66
          <DropdownItem className="short-urls-row-menu__dropdown-item--danger" onClick={toggleDelete}>
67
            <FontAwesomeIcon icon={deleteIcon} /> &nbsp;Delete short URL
68
          </DropdownItem>
69
          <DeleteShortUrlModal shortUrl={shortUrl} isOpen={this.state.isDeleteModalOpen} toggle={toggleDelete} />
70
71
          <DropdownItem divider />
72
73
          <DropdownItem onClick={togglePreview}>
74
            <FontAwesomeIcon icon={pictureIcon} /> &nbsp;Preview
75
          </DropdownItem>
76
          <PreviewModal url={completeShortUrl} isOpen={this.state.isPreviewModalOpen} toggle={togglePreview} />
77
78
          <DropdownItem onClick={toggleQrCode}>
79
            <FontAwesomeIcon icon={qrIcon} /> &nbsp;QR code
80
          </DropdownItem>
81
          <QrCodeModal url={completeShortUrl} isOpen={this.state.isQrModalOpen} toggle={toggleQrCode} />
82
83
          <DropdownItem divider />
84
85
          <CopyToClipboard text={completeShortUrl} onCopy={onCopyToClipboard}>
86
            <DropdownItem>
87
              <FontAwesomeIcon icon={copyIcon} /> &nbsp;Copy to clipboard
88
            </DropdownItem>
89
          </CopyToClipboard>
90
        </DropdownMenu>
91
      </ButtonDropdown>
92
    );
93
  }
94
};
95
96
export default ShortUrlsRowMenu;
97