mirror of
https://github.com/shlinkio/shlink-web-client.git
synced 2026-03-14 19:43:49 +00:00
Converted ShortUrlsRowMenu into functional component
This commit is contained in:
@@ -13,47 +13,30 @@ import React from 'react';
|
|||||||
import { ButtonDropdown, DropdownItem, DropdownMenu, DropdownToggle } from 'reactstrap';
|
import { ButtonDropdown, DropdownItem, DropdownMenu, DropdownToggle } from 'reactstrap';
|
||||||
import { serverType } from '../../servers/prop-types';
|
import { serverType } from '../../servers/prop-types';
|
||||||
import { shortUrlType } from '../reducers/shortUrlsList';
|
import { shortUrlType } from '../reducers/shortUrlsList';
|
||||||
|
import { useToggle } from '../../utils/helpers/hooks';
|
||||||
import PreviewModal from './PreviewModal';
|
import PreviewModal from './PreviewModal';
|
||||||
import QrCodeModal from './QrCodeModal';
|
import QrCodeModal from './QrCodeModal';
|
||||||
import VisitStatsLink from './VisitStatsLink';
|
import VisitStatsLink from './VisitStatsLink';
|
||||||
import './ShortUrlsRowMenu.scss';
|
import './ShortUrlsRowMenu.scss';
|
||||||
|
|
||||||
const ShortUrlsRowMenu = (
|
const propTypes = {
|
||||||
DeleteShortUrlModal,
|
selectedServer: serverType,
|
||||||
EditTagsModal,
|
shortUrl: shortUrlType,
|
||||||
EditMetaModal,
|
};
|
||||||
EditShortUrlModal,
|
|
||||||
ForServerVersion
|
|
||||||
) => class ShortUrlsRowMenu extends React.Component {
|
|
||||||
static propTypes = {
|
|
||||||
selectedServer: serverType,
|
|
||||||
shortUrl: shortUrlType,
|
|
||||||
};
|
|
||||||
|
|
||||||
state = {
|
const ShortUrlsRowMenu = (DeleteShortUrlModal, EditTagsModal, EditMetaModal, EditShortUrlModal, ForServerVersion) => {
|
||||||
isOpen: false,
|
const ShortUrlsRowMenuComp = ({ shortUrl, selectedServer }) => {
|
||||||
isQrModalOpen: false,
|
const [ isOpen, toggle ] = useToggle(false);
|
||||||
isPreviewModalOpen: false,
|
const [ isQrModalOpen, toggleQrCode ] = useToggle(false);
|
||||||
isTagsModalOpen: false,
|
const [ isPreviewModalOpen, togglePreview ] = useToggle(false);
|
||||||
isMetaModalOpen: false,
|
const [ isTagsModalOpen, toggleTags ] = useToggle(false);
|
||||||
isDeleteModalOpen: false,
|
const [ isMetaModalOpen, toggleMeta ] = useToggle(false);
|
||||||
isEditModalOpen: false,
|
const [ isDeleteModalOpen, toggleDelete ] = useToggle(false);
|
||||||
};
|
const [ isEditModalOpen, toggleEdit ] = useToggle(false);
|
||||||
toggle = () => this.setState(({ isOpen }) => ({ isOpen: !isOpen }));
|
|
||||||
|
|
||||||
render() {
|
|
||||||
const { shortUrl, selectedServer } = this.props;
|
|
||||||
const completeShortUrl = shortUrl && shortUrl.shortUrl ? shortUrl.shortUrl : '';
|
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 (
|
return (
|
||||||
<ButtonDropdown toggle={this.toggle} isOpen={this.state.isOpen}>
|
<ButtonDropdown toggle={toggle} isOpen={isOpen}>
|
||||||
<DropdownToggle size="sm" caret outline className="short-urls-row-menu__dropdown-toggle">
|
<DropdownToggle size="sm" caret outline className="short-urls-row-menu__dropdown-toggle">
|
||||||
<FontAwesomeIcon icon={menuIcon} />
|
<FontAwesomeIcon icon={menuIcon} />
|
||||||
</DropdownToggle>
|
</DropdownToggle>
|
||||||
@@ -65,32 +48,32 @@ const ShortUrlsRowMenu = (
|
|||||||
<DropdownItem onClick={toggleTags}>
|
<DropdownItem onClick={toggleTags}>
|
||||||
<FontAwesomeIcon icon={tagsIcon} fixedWidth /> Edit tags
|
<FontAwesomeIcon icon={tagsIcon} fixedWidth /> Edit tags
|
||||||
</DropdownItem>
|
</DropdownItem>
|
||||||
<EditTagsModal shortUrl={shortUrl} isOpen={this.state.isTagsModalOpen} toggle={toggleTags} />
|
<EditTagsModal shortUrl={shortUrl} isOpen={isTagsModalOpen} toggle={toggleTags} />
|
||||||
|
|
||||||
<ForServerVersion minVersion="1.18.0">
|
<ForServerVersion minVersion="1.18.0">
|
||||||
<DropdownItem onClick={toggleMeta}>
|
<DropdownItem onClick={toggleMeta}>
|
||||||
<FontAwesomeIcon icon={editIcon} fixedWidth /> Edit metadata
|
<FontAwesomeIcon icon={editIcon} fixedWidth /> Edit metadata
|
||||||
</DropdownItem>
|
</DropdownItem>
|
||||||
<EditMetaModal shortUrl={shortUrl} isOpen={this.state.isMetaModalOpen} toggle={toggleMeta} />
|
<EditMetaModal shortUrl={shortUrl} isOpen={isMetaModalOpen} toggle={toggleMeta} />
|
||||||
</ForServerVersion>
|
</ForServerVersion>
|
||||||
|
|
||||||
<ForServerVersion minVersion="2.1.0">
|
<ForServerVersion minVersion="2.1.0">
|
||||||
<DropdownItem onClick={toggleEdit}>
|
<DropdownItem onClick={toggleEdit}>
|
||||||
<FontAwesomeIcon icon={linkIcon} fixedWidth /> Edit long URL
|
<FontAwesomeIcon icon={linkIcon} fixedWidth /> Edit long URL
|
||||||
</DropdownItem>
|
</DropdownItem>
|
||||||
<EditShortUrlModal shortUrl={shortUrl} isOpen={this.state.isEditModalOpen} toggle={toggleEdit} />
|
<EditShortUrlModal shortUrl={shortUrl} isOpen={isEditModalOpen} toggle={toggleEdit} />
|
||||||
</ForServerVersion>
|
</ForServerVersion>
|
||||||
|
|
||||||
<DropdownItem onClick={toggleQrCode}>
|
<DropdownItem onClick={toggleQrCode}>
|
||||||
<FontAwesomeIcon icon={qrIcon} fixedWidth /> QR code
|
<FontAwesomeIcon icon={qrIcon} fixedWidth /> QR code
|
||||||
</DropdownItem>
|
</DropdownItem>
|
||||||
<QrCodeModal url={completeShortUrl} isOpen={this.state.isQrModalOpen} toggle={toggleQrCode} />
|
<QrCodeModal url={completeShortUrl} isOpen={isQrModalOpen} toggle={toggleQrCode} />
|
||||||
|
|
||||||
<ForServerVersion maxVersion="1.x">
|
<ForServerVersion maxVersion="1.x">
|
||||||
<DropdownItem onClick={togglePreview}>
|
<DropdownItem onClick={togglePreview}>
|
||||||
<FontAwesomeIcon icon={pictureIcon} fixedWidth /> Preview
|
<FontAwesomeIcon icon={pictureIcon} fixedWidth /> Preview
|
||||||
</DropdownItem>
|
</DropdownItem>
|
||||||
<PreviewModal url={completeShortUrl} isOpen={this.state.isPreviewModalOpen} toggle={togglePreview} />
|
<PreviewModal url={completeShortUrl} isOpen={isPreviewModalOpen} toggle={togglePreview} />
|
||||||
</ForServerVersion>
|
</ForServerVersion>
|
||||||
|
|
||||||
<DropdownItem divider />
|
<DropdownItem divider />
|
||||||
@@ -98,11 +81,15 @@ const ShortUrlsRowMenu = (
|
|||||||
<DropdownItem className="short-urls-row-menu__dropdown-item--danger" onClick={toggleDelete}>
|
<DropdownItem className="short-urls-row-menu__dropdown-item--danger" onClick={toggleDelete}>
|
||||||
<FontAwesomeIcon icon={deleteIcon} fixedWidth /> Delete short URL
|
<FontAwesomeIcon icon={deleteIcon} fixedWidth /> Delete short URL
|
||||||
</DropdownItem>
|
</DropdownItem>
|
||||||
<DeleteShortUrlModal shortUrl={shortUrl} isOpen={this.state.isDeleteModalOpen} toggle={toggleDelete} />
|
<DeleteShortUrlModal shortUrl={shortUrl} isOpen={isDeleteModalOpen} toggle={toggleDelete} />
|
||||||
</DropdownMenu>
|
</DropdownMenu>
|
||||||
</ButtonDropdown>
|
</ButtonDropdown>
|
||||||
);
|
);
|
||||||
}
|
};
|
||||||
|
|
||||||
|
ShortUrlsRowMenuComp.propTypes = propTypes;
|
||||||
|
|
||||||
|
return ShortUrlsRowMenuComp;
|
||||||
};
|
};
|
||||||
|
|
||||||
export default ShortUrlsRowMenu;
|
export default ShortUrlsRowMenu;
|
||||||
|
|||||||
@@ -63,34 +63,26 @@ describe('<ShortUrlsRowMenu />', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
describe('toggles state when toggling modal windows', () => {
|
describe('toggles state when toggling modal windows', () => {
|
||||||
const assert = (modalComponent, stateProp, done) => {
|
const assert = (modalComponent) => {
|
||||||
const wrapper = createWrapper();
|
const wrapper = createWrapper();
|
||||||
const modal = wrapper.find(modalComponent);
|
|
||||||
|
|
||||||
expect(wrapper.state(stateProp)).toEqual(false);
|
expect(wrapper.find(modalComponent).prop('isOpen')).toEqual(false);
|
||||||
modal.prop('toggle')();
|
wrapper.find(modalComponent).prop('toggle')();
|
||||||
setImmediate(() => {
|
expect(wrapper.find(modalComponent).prop('isOpen')).toEqual(true);
|
||||||
expect(wrapper.state(stateProp)).toEqual(true);
|
|
||||||
done();
|
|
||||||
});
|
|
||||||
};
|
};
|
||||||
|
|
||||||
it('DeleteShortUrlModal', (done) => assert(DeleteShortUrlModal, 'isDeleteModalOpen', done));
|
it('DeleteShortUrlModal', () => assert(DeleteShortUrlModal));
|
||||||
it('EditTagsModal', (done) => assert(EditTagsModal, 'isTagsModalOpen', done));
|
it('EditTagsModal', () => assert(EditTagsModal));
|
||||||
it('PreviewModal', (done) => assert(PreviewModal, 'isPreviewModalOpen', done));
|
it('PreviewModal', () => assert(PreviewModal));
|
||||||
it('QrCodeModal', (done) => assert(QrCodeModal, 'isQrModalOpen', done));
|
it('QrCodeModal', () => assert(QrCodeModal));
|
||||||
it('EditShortUrlModal', (done) => assert(EditShortUrlModal, 'isEditModalOpen', done));
|
it('EditShortUrlModal', () => assert(EditShortUrlModal));
|
||||||
});
|
});
|
||||||
|
|
||||||
it('toggles dropdown state when toggling dropdown', (done) => {
|
it('toggles dropdown state when toggling dropdown', () => {
|
||||||
const wrapper = createWrapper();
|
const wrapper = createWrapper();
|
||||||
const dropdown = wrapper.find(ButtonDropdown);
|
|
||||||
|
|
||||||
expect(wrapper.state('isOpen')).toEqual(false);
|
expect(wrapper.find(ButtonDropdown).prop('isOpen')).toEqual(false);
|
||||||
dropdown.prop('toggle')();
|
wrapper.find(ButtonDropdown).prop('toggle')();
|
||||||
setImmediate(() => {
|
expect(wrapper.find(ButtonDropdown).prop('isOpen')).toEqual(true);
|
||||||
expect(wrapper.state('isOpen')).toEqual(true);
|
|
||||||
done();
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user