Files
mattermost/webapp/components/toggle_modal_button.jsx
Christopher Speller 2bbedd9def Updating client dependencies. Switching to yarn. (#6433)
* Updating client dependancies. Switching to using yarn.

* Updating React

* Moving pure components to using function syntax (performance gains with newer react version)

* Updating client dependancies.

* Ignore .yarninstall

* Enabling pre-lockfile because it's the entire point of using yarn.

* Removing old webpack config

* Moving to new prop-types

* Fixing ESLint Errors

* Updating jest snapshots.

* Cleaning up package.json
2017-05-18 09:28:18 -04:00

83 lines
2.1 KiB
JavaScript

import PropTypes from 'prop-types';
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See License.txt for license information.
import React from 'react';
export default class ModalToggleButton extends React.Component {
constructor(props) {
super(props);
this.show = this.show.bind(this);
this.hide = this.hide.bind(this);
this.state = {
show: false
};
}
show(e) {
if (e) {
e.preventDefault();
}
this.setState({show: true});
}
hide() {
this.setState({show: false});
}
render() {
const {children, dialogType, dialogProps, onClick, ...props} = this.props;
// allow callers to provide an onClick which will be called before the modal is shown
let clickHandler = this.show;
if (onClick) {
clickHandler = (e) => {
onClick();
this.show(e);
};
}
let dialog;
if (this.state.show) {
// this assumes that all modals will have an onHide event and will show when mounted
dialog = React.createElement(dialogType, Object.assign({}, dialogProps, {
onHide: () => {
this.hide();
if (dialogProps.onHide) {
dialogProps.onHide();
}
}
}));
}
// nesting the dialog in the anchor tag looks like it shouldn't work, but it does due to how react-bootstrap
// renders modals at the top level of the DOM instead of where you specify in the virtual DOM
return (
<a
{...props}
href='#'
onClick={clickHandler}
>
{children}
{dialog}
</a>
);
}
}
ModalToggleButton.propTypes = {
children: PropTypes.node.isRequired,
dialogType: PropTypes.func.isRequired,
dialogProps: PropTypes.object,
onClick: PropTypes.func
};
ModalToggleButton.defaultProps = {
dialogProps: {}
};