2019-11-20 12:32:39 +00:00
|
|
|
import React, { Component } from "react";
|
|
|
|
import PropTypes from "prop-types";
|
|
|
|
import styled, { css } from "styled-components";
|
|
|
|
import { Icons } from "../icons";
|
2019-08-01 10:50:16 +00:00
|
|
|
import { Text } from "../text";
|
2019-08-01 07:50:25 +00:00
|
|
|
|
2019-11-22 11:19:23 +00:00
|
|
|
const ToggleButtonContainer = styled.label`
|
2019-11-20 12:32:39 +00:00
|
|
|
position: absolute;
|
|
|
|
-webkit-appearance: none;
|
|
|
|
display: flex;
|
|
|
|
align-items: center;
|
|
|
|
outline: none;
|
2019-08-01 07:50:25 +00:00
|
|
|
|
2019-11-20 12:32:39 +00:00
|
|
|
user-select: none;
|
|
|
|
-moz-user-select: none;
|
|
|
|
-o-user-select: none;
|
|
|
|
-webkit-user-select: none;
|
2019-08-01 10:50:16 +00:00
|
|
|
|
2019-11-20 12:32:39 +00:00
|
|
|
${props =>
|
|
|
|
props.isDisabled
|
|
|
|
? css`
|
|
|
|
cursor: default;
|
|
|
|
`
|
|
|
|
: css`
|
|
|
|
cursor: pointer;
|
|
|
|
`}
|
|
|
|
svg {
|
|
|
|
${props =>
|
|
|
|
props.isDisabled
|
|
|
|
? css`
|
|
|
|
rect {
|
|
|
|
fill: #eceff1;
|
|
|
|
}
|
|
|
|
`
|
|
|
|
: ""}
|
|
|
|
}
|
|
|
|
|
|
|
|
.toggleText {
|
|
|
|
margin-left: 8px;
|
|
|
|
}
|
2019-08-01 07:50:25 +00:00
|
|
|
`;
|
|
|
|
|
|
|
|
const HiddenInput = styled.input`
|
2019-11-20 12:32:39 +00:00
|
|
|
opacity: 0.0001;
|
|
|
|
position: absolute;
|
|
|
|
right: 0;
|
|
|
|
z-index: -1;
|
2019-08-01 07:50:25 +00:00
|
|
|
`;
|
|
|
|
|
2019-08-01 14:24:39 +00:00
|
|
|
const ToggleIcon = ({ isChecked }) => {
|
2019-11-20 12:32:39 +00:00
|
|
|
const iconName = isChecked ? "ToggleButtonCheckedIcon" : "ToggleButtonIcon";
|
|
|
|
return <>{React.createElement(Icons[iconName])}</>;
|
2019-08-01 07:50:25 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
class ToggleButton extends Component {
|
2019-11-20 12:32:39 +00:00
|
|
|
constructor(props) {
|
|
|
|
super(props);
|
|
|
|
this.state = {
|
|
|
|
checked: this.props.isChecked
|
|
|
|
};
|
|
|
|
}
|
2019-08-01 07:50:25 +00:00
|
|
|
|
2019-11-20 12:32:39 +00:00
|
|
|
componentDidUpdate(prevProps) {
|
|
|
|
if (this.props.isChecked !== prevProps.isChecked) {
|
|
|
|
this.setState({ checked: this.props.isChecked });
|
2019-08-01 07:50:25 +00:00
|
|
|
}
|
2019-11-20 12:32:39 +00:00
|
|
|
}
|
2019-08-01 07:50:25 +00:00
|
|
|
|
2019-11-20 12:32:39 +00:00
|
|
|
render() {
|
2019-11-22 11:19:23 +00:00
|
|
|
const { isDisabled, label, onChange, id, className } = this.props;
|
2019-11-20 12:32:39 +00:00
|
|
|
const colorProps = isDisabled ? { color: "#A3A9AE" } : {};
|
2019-08-08 14:48:07 +00:00
|
|
|
|
2019-11-20 12:32:39 +00:00
|
|
|
//console.log("ToggleButton render");
|
2019-08-08 14:48:07 +00:00
|
|
|
|
2019-11-20 12:32:39 +00:00
|
|
|
return (
|
2019-11-22 11:19:23 +00:00
|
|
|
<ToggleButtonContainer id={id} className={className} isDisabled={isDisabled}>
|
2019-11-20 12:32:39 +00:00
|
|
|
<HiddenInput
|
|
|
|
type="checkbox"
|
|
|
|
checked={this.state.checked}
|
|
|
|
disabled={isDisabled}
|
|
|
|
onChange={onChange}
|
|
|
|
/>
|
|
|
|
<ToggleIcon {...this.props} />
|
|
|
|
{label && (
|
|
|
|
<Text.Body className="toggleText" as="span" {...colorProps}>
|
|
|
|
{label}
|
|
|
|
</Text.Body>
|
|
|
|
)}
|
2019-11-22 11:19:23 +00:00
|
|
|
</ToggleButtonContainer>
|
2019-11-20 12:32:39 +00:00
|
|
|
);
|
|
|
|
}
|
2019-08-01 07:50:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
ToggleButton.propTypes = {
|
2019-11-20 12:32:39 +00:00
|
|
|
isChecked: PropTypes.bool.isRequired,
|
|
|
|
isDisabled: PropTypes.bool,
|
|
|
|
onChange: PropTypes.func,
|
2019-11-22 11:19:23 +00:00
|
|
|
label: PropTypes.string,
|
|
|
|
id: PropTypes.string,
|
|
|
|
className: PropTypes.string
|
2019-08-01 07:50:25 +00:00
|
|
|
};
|
|
|
|
|
2019-11-20 12:32:39 +00:00
|
|
|
export default ToggleButton;
|