2019-08-01 07:50:25 +00:00
|
|
|
import React, { Component } from 'react';
|
|
|
|
import PropTypes from 'prop-types';
|
|
|
|
import styled, { css } from 'styled-components';
|
|
|
|
import { Icons } from '../icons'
|
|
|
|
|
|
|
|
const disableColor = "#ECEFF1";
|
|
|
|
const DisableCss = css`
|
|
|
|
rect {
|
|
|
|
fill: ${disableColor};
|
|
|
|
}
|
|
|
|
`;
|
|
|
|
|
|
|
|
const ToggleContainer = styled.label`
|
|
|
|
|
|
|
|
position: absolute;
|
|
|
|
-webkit-appearance: none;
|
|
|
|
outline: none;
|
|
|
|
margin: 0;
|
|
|
|
display: flex;
|
|
|
|
align-items: center;
|
|
|
|
|
|
|
|
user-select: none;
|
|
|
|
-moz-user-select: none;
|
|
|
|
-o-user-select: none;
|
|
|
|
|
2019-08-01 09:30:00 +00:00
|
|
|
${props => props.isDisabled ?
|
|
|
|
css`
|
2019-08-01 07:50:25 +00:00
|
|
|
cursor: default !important;
|
|
|
|
svg {
|
|
|
|
${DisableCss}
|
|
|
|
}
|
2019-08-01 09:30:00 +00:00
|
|
|
`
|
|
|
|
: css`
|
2019-08-01 07:50:25 +00:00
|
|
|
cursor: pointer;
|
|
|
|
`
|
|
|
|
};
|
|
|
|
`;
|
|
|
|
|
|
|
|
const HiddenInput = styled.input`
|
|
|
|
opacity: 0.0001;
|
|
|
|
position: absolute;
|
|
|
|
right: 0;
|
|
|
|
z-index: -1;
|
|
|
|
`;
|
|
|
|
|
|
|
|
const CheckboxIcon = ({ isChecked }) => {
|
2019-08-01 09:30:00 +00:00
|
|
|
|
2019-08-01 07:50:25 +00:00
|
|
|
const iconName = isChecked ? "ToggleButtonCheckedIcon" : "ToggleButtonIcon";
|
|
|
|
|
|
|
|
return <>{React.createElement(Icons[iconName])}</>;
|
|
|
|
};
|
|
|
|
|
|
|
|
class ToggleButton extends Component {
|
|
|
|
constructor(props) {
|
|
|
|
super(props);
|
|
|
|
this.state = {
|
|
|
|
checked: this.props.isChecked
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
componentDidUpdate(prevProps) {
|
|
|
|
if (this.props.isChecked !== prevProps.isChecked) {
|
|
|
|
this.setState({ checked: this.props.isChecked });
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
onInputChange = (e) => {
|
|
|
|
this.setState({ checked: e.target.checked });
|
2019-08-01 09:30:00 +00:00
|
|
|
this.props.hasOwnProperty("onChange") && this.props.onChange(e);
|
2019-08-01 07:50:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
render() {
|
|
|
|
return (
|
|
|
|
<ToggleContainer isDisabled={this.props.isDisabled}>
|
|
|
|
<HiddenInput
|
|
|
|
type="checkbox"
|
|
|
|
checked={this.state.checked}
|
|
|
|
disabled={this.props.isDisabled}
|
|
|
|
onChange={this.onInputChange}
|
|
|
|
{...this.props}
|
|
|
|
/>
|
|
|
|
<CheckboxIcon {...this.props} />
|
|
|
|
</ToggleContainer>
|
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
ToggleButton.propTypes = {
|
|
|
|
isChecked: PropTypes.bool.isRequired,
|
|
|
|
isDisabled: PropTypes.bool,
|
|
|
|
onChange: PropTypes.func
|
|
|
|
};
|
|
|
|
|
|
|
|
export default ToggleButton;
|