2019-11-20 12:32:39 +00:00
|
|
|
import React, { Component } from "react";
|
|
|
|
import PropTypes from "prop-types";
|
2021-02-04 13:52:53 +00:00
|
|
|
import { ToggleButtonContainer, HiddenInput } from "./styled-toggle-button";
|
|
|
|
import { ToggleButtonIcon, ToggleButtonCheckedIcon } from "./svg";
|
2019-12-04 09:36:13 +00:00
|
|
|
import Text from "../text";
|
2021-03-02 08:25:11 +00:00
|
|
|
import globalColors from "../utils/globalColors";
|
2019-08-01 07:50:25 +00:00
|
|
|
|
2019-08-01 14:24:39 +00:00
|
|
|
const ToggleIcon = ({ isChecked }) => {
|
2020-11-05 13:56:15 +00:00
|
|
|
return (
|
2021-02-04 13:52:53 +00:00
|
|
|
<>
|
|
|
|
{isChecked ? (
|
|
|
|
<ToggleButtonCheckedIcon className="toggle-button" />
|
|
|
|
) : (
|
|
|
|
<ToggleButtonIcon className="toggle-button" />
|
|
|
|
)}
|
|
|
|
</>
|
2020-11-05 13:56:15 +00:00
|
|
|
);
|
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 = {
|
2020-10-16 13:16:01 +00:00
|
|
|
checked: props.isChecked,
|
2019-11-20 12:32:39 +00:00
|
|
|
};
|
|
|
|
}
|
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-12-03 13:47:09 +00:00
|
|
|
const { isDisabled, label, onChange, id, className, style } = this.props;
|
2021-03-02 08:25:11 +00:00
|
|
|
const { gray } = globalColors;
|
|
|
|
const colorProps = isDisabled ? { color: gray } : {};
|
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-25 06:24:00 +00:00
|
|
|
<ToggleButtonContainer
|
|
|
|
id={id}
|
|
|
|
className={className}
|
2019-12-03 13:47:09 +00:00
|
|
|
style={style}
|
2019-11-25 06:24:00 +00:00
|
|
|
isDisabled={isDisabled}
|
|
|
|
>
|
2019-11-20 12:32:39 +00:00
|
|
|
<HiddenInput
|
|
|
|
type="checkbox"
|
|
|
|
checked={this.state.checked}
|
|
|
|
disabled={isDisabled}
|
|
|
|
onChange={onChange}
|
|
|
|
/>
|
2019-11-22 11:24:40 +00:00
|
|
|
<ToggleIcon isChecked={this.state.checked} />
|
2019-11-20 12:32:39 +00:00
|
|
|
{label && (
|
2021-02-04 13:52:53 +00:00
|
|
|
<Text className="toggle-button-text" as="span" {...colorProps}>
|
2019-11-20 12:32:39 +00:00
|
|
|
{label}
|
2019-12-04 09:36:13 +00:00
|
|
|
</Text>
|
2019-11-20 12:32:39 +00:00
|
|
|
)}
|
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 = {
|
2021-03-11 21:17:02 +00:00
|
|
|
/** The checked property sets the checked state of a ToggleButton. */
|
2019-11-20 12:32:39 +00:00
|
|
|
isChecked: PropTypes.bool.isRequired,
|
2021-03-11 21:17:02 +00:00
|
|
|
/** Disables the ToggleButton */
|
2019-11-20 12:32:39 +00:00
|
|
|
isDisabled: PropTypes.bool,
|
2021-03-11 21:17:02 +00:00
|
|
|
/** Will be triggered whenever an ToggleButton is clicked */
|
|
|
|
onChange: PropTypes.func.isRequired,
|
|
|
|
/** Label of the input */
|
2019-11-22 11:19:23 +00:00
|
|
|
label: PropTypes.string,
|
2021-03-11 21:17:02 +00:00
|
|
|
/** Set component id */
|
2019-11-25 06:24:00 +00:00
|
|
|
id: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
|
2021-03-11 21:17:02 +00:00
|
|
|
/** Class name */
|
2019-12-03 13:47:09 +00:00
|
|
|
className: PropTypes.string,
|
2021-03-11 21:17:02 +00:00
|
|
|
/** Accepts css style */
|
2020-10-16 13:16:01 +00:00
|
|
|
style: PropTypes.oneOfType([PropTypes.object, PropTypes.array]),
|
2019-08-01 07:50:25 +00:00
|
|
|
};
|
|
|
|
|
2019-11-27 11:43:41 +00:00
|
|
|
ToggleIcon.propTypes = {
|
2020-10-16 13:16:01 +00:00
|
|
|
isChecked: PropTypes.bool,
|
|
|
|
};
|
2019-11-27 11:43:41 +00:00
|
|
|
|
2019-11-20 12:32:39 +00:00
|
|
|
export default ToggleButton;
|