import React, { PropTypes } from 'react'; import { createSelector } from 'reselect'; import { reduxForm } from 'redux-form'; import { FormControl, FormGroup } from 'react-bootstrap'; import { updateMyLang } from '../redux/actions'; import { userSelector } from '../../../redux/selectors'; import langs from '../../../../utils/supported-languages'; const propTypes = { fields: PropTypes.object, handleSubmit: PropTypes.func.isRequired, updateMyLang: PropTypes.func.isRequired }; const mapStateToProps = createSelector( userSelector, ({ user: { languageTag } }) => ({ // send null to prevent redux-form from initialize empty initialValues: languageTag ? { lang: languageTag } : null }) ); const mapDispatchToProps = { updateMyLang }; const fields = [ 'lang' ]; const validator = values => { if (!langs[values.lang]) { return { lang: `${values.lang} is unsupported` }; } return {}; }; const options = [( ), ...Object.keys(langs).map(tag => { return ( ); }), ( ) ]; export class LanguageSettings extends React.Component { constructor(...props) { super(...props); this.handleChange = this.handleChange.bind(this); } componentWillUnmount() { // make sure to clear timeout if it exist if (this.timeout) { clearTimeout(this.timeout); } } handleChange(e) { e.preventDefault(); this.props.fields.lang.onChange(e); // give redux-form HOC state time to catch up before // attempting to submit this.timeout = setTimeout( () => this.props.handleSubmit(this.props.updateMyLang)(), 0 ); } render() { const { fields: { lang: { name, value } } } = this.props; return ( { options } ); } } LanguageSettings.displayName = 'LanguageSettings'; LanguageSettings.propTypes = propTypes; export default reduxForm( { form: 'lang', fields, validator, overwriteOnInitialValuesChange: false }, mapStateToProps, mapDispatchToProps )(LanguageSettings);