From b0dd885c09b3f8d0d9491f254dd8ddb92a3392b3 Mon Sep 17 00:00:00 2001 From: Alejandro Celaya Date: Mon, 30 Mar 2020 21:01:01 +0200 Subject: [PATCH] Converted ShortUrlsRowMenu into functional component --- src/short-urls/helpers/ShortUrlsRowMenu.js | 65 ++++++++----------- .../helpers/ShortUrlsRowMenu.test.js | 34 ++++------ 2 files changed, 39 insertions(+), 60 deletions(-) diff --git a/src/short-urls/helpers/ShortUrlsRowMenu.js b/src/short-urls/helpers/ShortUrlsRowMenu.js index 8dedfbbc..fe490cc8 100644 --- a/src/short-urls/helpers/ShortUrlsRowMenu.js +++ b/src/short-urls/helpers/ShortUrlsRowMenu.js @@ -13,47 +13,30 @@ import React from 'react'; import { ButtonDropdown, DropdownItem, DropdownMenu, DropdownToggle } from 'reactstrap'; import { serverType } from '../../servers/prop-types'; import { shortUrlType } from '../reducers/shortUrlsList'; +import { useToggle } from '../../utils/helpers/hooks'; import PreviewModal from './PreviewModal'; import QrCodeModal from './QrCodeModal'; import VisitStatsLink from './VisitStatsLink'; import './ShortUrlsRowMenu.scss'; -const ShortUrlsRowMenu = ( - DeleteShortUrlModal, - EditTagsModal, - EditMetaModal, - EditShortUrlModal, - ForServerVersion -) => class ShortUrlsRowMenu extends React.Component { - static propTypes = { - selectedServer: serverType, - shortUrl: shortUrlType, - }; +const propTypes = { + selectedServer: serverType, + shortUrl: shortUrlType, +}; - state = { - isOpen: false, - isQrModalOpen: false, - isPreviewModalOpen: false, - isTagsModalOpen: false, - isMetaModalOpen: false, - isDeleteModalOpen: false, - isEditModalOpen: false, - }; - toggle = () => this.setState(({ isOpen }) => ({ isOpen: !isOpen })); - - render() { - const { shortUrl, selectedServer } = this.props; +const ShortUrlsRowMenu = (DeleteShortUrlModal, EditTagsModal, EditMetaModal, EditShortUrlModal, ForServerVersion) => { + const ShortUrlsRowMenuComp = ({ shortUrl, selectedServer }) => { + const [ isOpen, toggle ] = useToggle(false); + const [ isQrModalOpen, toggleQrCode ] = useToggle(false); + const [ isPreviewModalOpen, togglePreview ] = useToggle(false); + const [ isTagsModalOpen, toggleTags ] = useToggle(false); + const [ isMetaModalOpen, toggleMeta ] = useToggle(false); + const [ isDeleteModalOpen, toggleDelete ] = useToggle(false); + const [ isEditModalOpen, toggleEdit ] = useToggle(false); const completeShortUrl = shortUrl && shortUrl.shortUrl ? shortUrl.shortUrl : ''; - const toggleModal = (prop) => () => this.setState((prevState) => ({ [prop]: !prevState[prop] })); - const toggleQrCode = toggleModal('isQrModalOpen'); - const togglePreview = toggleModal('isPreviewModalOpen'); - const toggleTags = toggleModal('isTagsModalOpen'); - const toggleMeta = toggleModal('isMetaModalOpen'); - const toggleDelete = toggleModal('isDeleteModalOpen'); - const toggleEdit = toggleModal('isEditModalOpen'); return ( - +    @@ -65,32 +48,32 @@ const ShortUrlsRowMenu = ( Edit tags - + Edit metadata - + Edit long URL - + QR code - + Preview - + @@ -98,11 +81,15 @@ const ShortUrlsRowMenu = ( Delete short URL - + ); - } + }; + + ShortUrlsRowMenuComp.propTypes = propTypes; + + return ShortUrlsRowMenuComp; }; export default ShortUrlsRowMenu; diff --git a/test/short-urls/helpers/ShortUrlsRowMenu.test.js b/test/short-urls/helpers/ShortUrlsRowMenu.test.js index 853b2d9c..aecd2d84 100644 --- a/test/short-urls/helpers/ShortUrlsRowMenu.test.js +++ b/test/short-urls/helpers/ShortUrlsRowMenu.test.js @@ -63,34 +63,26 @@ describe('', () => { }); describe('toggles state when toggling modal windows', () => { - const assert = (modalComponent, stateProp, done) => { + const assert = (modalComponent) => { const wrapper = createWrapper(); - const modal = wrapper.find(modalComponent); - expect(wrapper.state(stateProp)).toEqual(false); - modal.prop('toggle')(); - setImmediate(() => { - expect(wrapper.state(stateProp)).toEqual(true); - done(); - }); + expect(wrapper.find(modalComponent).prop('isOpen')).toEqual(false); + wrapper.find(modalComponent).prop('toggle')(); + expect(wrapper.find(modalComponent).prop('isOpen')).toEqual(true); }; - it('DeleteShortUrlModal', (done) => assert(DeleteShortUrlModal, 'isDeleteModalOpen', done)); - it('EditTagsModal', (done) => assert(EditTagsModal, 'isTagsModalOpen', done)); - it('PreviewModal', (done) => assert(PreviewModal, 'isPreviewModalOpen', done)); - it('QrCodeModal', (done) => assert(QrCodeModal, 'isQrModalOpen', done)); - it('EditShortUrlModal', (done) => assert(EditShortUrlModal, 'isEditModalOpen', done)); + it('DeleteShortUrlModal', () => assert(DeleteShortUrlModal)); + it('EditTagsModal', () => assert(EditTagsModal)); + it('PreviewModal', () => assert(PreviewModal)); + it('QrCodeModal', () => assert(QrCodeModal)); + it('EditShortUrlModal', () => assert(EditShortUrlModal)); }); - it('toggles dropdown state when toggling dropdown', (done) => { + it('toggles dropdown state when toggling dropdown', () => { const wrapper = createWrapper(); - const dropdown = wrapper.find(ButtonDropdown); - expect(wrapper.state('isOpen')).toEqual(false); - dropdown.prop('toggle')(); - setImmediate(() => { - expect(wrapper.state('isOpen')).toEqual(true); - done(); - }); + expect(wrapper.find(ButtonDropdown).prop('isOpen')).toEqual(false); + wrapper.find(ButtonDropdown).prop('toggle')(); + expect(wrapper.find(ButtonDropdown).prop('isOpen')).toEqual(true); }); });