UNPKG

material-ui

Version:

Material Design UI components built with React

183 lines (156 loc) 4.71 kB
import React from 'react'; import StylePropable from './mixins/style-propable'; import Transitions from './styles/transitions'; import EnhancedSwitch from './enhanced-switch'; import RadioButtonOff from './svg-icons/toggle/radio-button-unchecked'; import RadioButtonOn from './svg-icons/toggle/radio-button-checked'; import DefaultRawTheme from './styles/raw-themes/light-raw-theme'; import ThemeManager from './styles/theme-manager'; const RadioButton = React.createClass({ propTypes: { checked: React.PropTypes.bool, disabled: React.PropTypes.bool, iconStyle: React.PropTypes.object, labelPosition: React.PropTypes.oneOf(['left', 'right']), labelStyle: React.PropTypes.object, onCheck: React.PropTypes.func, value: React.PropTypes.string, }, contextTypes: { muiTheme: React.PropTypes.object, }, //for passing default theme context to children childContextTypes: { muiTheme: React.PropTypes.object, }, mixins: [StylePropable], getInitialState() { return { muiTheme: this.context.muiTheme ? this.context.muiTheme : ThemeManager.getMuiTheme(DefaultRawTheme), }; }, getChildContext() { return { muiTheme: this.state.muiTheme, }; }, //to update theme inside state whenever a new theme is passed down //from the parent / owner using context componentWillReceiveProps(nextProps, nextContext) { let newMuiTheme = nextContext.muiTheme ? nextContext.muiTheme : this.state.muiTheme; this.setState({muiTheme: newMuiTheme}); }, getTheme() { return this.state.muiTheme.radioButton; }, getStyles() { let styles = { icon: { height: this.getTheme().size, width: this.getTheme().size, }, target: { transition: Transitions.easeOut(), position: 'absolute', opacity: 1, transform: 'scale(1)', fill: this.getTheme().borderColor, }, fill: { position: 'absolute', opacity: 1, transform: 'scale(0)', transformOrigin: '50% 50%', transition: Transitions.easeOut(), fill: this.getTheme().checkedColor, }, targetWhenChecked: { opacity: 0, transform: 'scale(0)', }, fillWhenChecked: { opacity: 1, transform: 'scale(1)', }, targetWhenDisabled: { fill: this.getTheme().disabledColor, }, fillWhenDisabled: { fill: this.getTheme().disabledColor, }, label: { color: this.props.disabled ? this.getTheme().labelDisabledColor : this.getTheme().labelColor, }, }; return styles; }, // Only called when selected, not when unselected. _handleCheck(e) { if (this.props.onCheck) this.props.onCheck(e, this.props.value); }, _handleStateChange() { }, isChecked() { return this.refs.enhancedSwitch.isSwitched(); }, // Use RadioButtonGroup.setSelectedValue(newSelectionValue) to set a // RadioButton's checked value. setChecked(newCheckedValue) { this.refs.enhancedSwitch.setSwitched(newCheckedValue); }, getValue() { return this.refs.enhancedSwitch.getValue(); }, render() { let { onCheck, ...other, } = this.props; let styles = this.getStyles(); let onStyles = this.mergeStyles( styles.target, this.props.checked && styles.targetWhenChecked, this.props.iconStyle, this.props.disabled && styles.targetWhenDisabled); let offStyles = this.mergeStyles( styles.fill, this.props.checked && styles.fillWhenChecked, this.props.iconStyle, this.props.disabled && styles.fillWhenDisabled); let radioButtonElement = ( <div> <RadioButtonOff style={onStyles} /> <RadioButtonOn style={offStyles} /> </div> ); let rippleColor = this.props.checked ? this.getTheme().checkedColor : this.getTheme().borderColor; let iconStyle = this.mergeStyles( styles.icon, this.props.iconStyle ); let labelStyle = this.mergeStyles( styles.label, this.props.labelStyle ); let enhancedSwitchProps = { ref: 'enhancedSwitch', inputType: 'radio', switched: this.props.checked || false, switchElement: radioButtonElement, rippleColor: rippleColor, iconStyle: iconStyle, labelStyle: labelStyle, onSwitch: this._handleCheck, onParentShouldUpdate: this._handleStateChange, labelPosition: (this.props.labelPosition) ? this.props.labelPosition : 'right', }; return ( <EnhancedSwitch {...other} {...enhancedSwitchProps}/> ); }, }); export default RadioButton;