Guest User

Untitled

a guest
Jan 15th, 2019
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.94 KB | None | 0 0
  1. export const renderSelectField = (field) => {
  2. var styles = {};
  3. var containerStyle = getInputStylesContainer();
  4.  
  5. if (field.input.value || field.meta.touched) {
  6. if (!field.meta.error) {
  7. styles = getInputStylesSuccess();
  8. containerStyle = classNames(containerStyle, {'has-success': true});
  9. } else {
  10. styles = getInputStylesError();
  11. containerStyle = classNames(containerStyle, {'has-error': true});
  12. }
  13. }
  14.  
  15. return (<div className={containerStyle}>
  16. {displayInputLabel(styles.idInput, field.label)}
  17. <select className='form-control' name={field.input.name} id={styles.idInput} aria-describedby={styles.ariaDescribedBy}>
  18. {field.options}
  19. </select>
  20. <span className={styles.glyphicon} aria-hidden='true' />
  21. {field.meta.touched && field.meta.error &&
  22. displayErrorMessage(field.meta.error)}
  23. </div>);
  24. };
  25.  
  26. export class ProfileContainer extends React.Component {
  27. render () {
  28. // TODO: Check user connection (via the store or via a check within the cookie ?
  29. // TODO: Retrieve the proper userId (via mapStateToProps
  30. if (this.props.connected === false) browserHistory.push('/');
  31. return <ProfileForm
  32. user={this.props.user}
  33. fields={this.props.fields}
  34. errorMessage={this.props.errorMessage}
  35. confirmationMessage={this.props.confirmationMessage}
  36. onSubmitProfileUpdate={this.props.onSubmitProfileUpdate} />;
  37. }
  38. }
  39.  
  40. ProfileContainer.propTypes = {
  41. user: React.PropTypes.object,
  42. connected: React.PropTypes.bool,
  43. fields: React.PropTypes.shape({
  44. email: React.PropTypes.string,
  45. firstname: React.PropTypes.string,
  46. lastname: React.PropTypes.string,
  47. ranking: React.PropTypes.string,
  48. telephone: React.PropTypes.string,
  49. city: React.PropTypes.string
  50. }),
  51. errorMessage: React.PropTypes.string,
  52. confirmationMessage: React.PropTypes.string,
  53. onSubmitProfileUpdate: React.PropTypes.func.isRequired
  54. };
  55.  
  56. const mapStateToProps = (state) => {
  57. return {
  58. connected: state.userConnection.connection.connected,
  59. user: state.userConnection.loadProfile.user,
  60. errorMessage: state.profile.error,
  61. confirmationMessage: state.profile.confirmation
  62. };
  63. };
  64.  
  65. const mapDispatchToProps = (dispatch) => {
  66. return {
  67. onSubmitProfileUpdate: (values) => {
  68. const user = {
  69. email: values.email,
  70. telephone: values.telephone,
  71. firstname: values.firstname,
  72. lastname: values.lastname,
  73. city: values.city,
  74. ranking: values.ranking
  75. };
  76. console.log(values);
  77. console.log('RANKING', user.ranking);
  78. dispatch(profileUpdate(user));
  79. }
  80. };
  81. };
  82.  
  83. export default connect(
  84. mapStateToProps,
  85. mapDispatchToProps
  86. )(ProfileContainer);
  87.  
  88. class ProfileForm extends React.Component {
  89.  
  90. getTennisRankingsOptions (rankings) {
  91. return (
  92. tennisRankings.map(ranking =>
  93. <option value={ranking} key={ranking}>{ranking}</option>)
  94. );
  95. }
  96. render () {
  97. const { handleSubmit } = this.props;
  98. const messageClassname = this.props.errorMessage !== undefined ? stylesShared.errorMessage : this.props.confirmationMessage !== undefined ? stylesShared.confirmationMessage : '';
  99. return (
  100. <div>
  101. <div>
  102. <div>
  103. <form onSubmit={handleSubmit(this.props.onSubmitProfileUpdate)}>
  104. <div>
  105. <center><h4>Votre profil</h4></center>
  106. </div>
  107. <div className={messageClassname}>
  108. {this.props.errorMessage &&
  109. <span>{this.props.errorMessage}</span>
  110. }
  111. {this.props.confirmationMessage &&
  112. <span>{this.props.confirmationMessage}</span>
  113. }
  114. </div>
  115. <div>
  116. <Field name='firstname' type='text' label='Prénom' component={renderBasicField} />
  117. </div>
  118. <div>
  119. <Field name='lastname' type='text' label='Nom' component={renderBasicField} />
  120. </div>
  121. <div>
  122. <Field name='email' type='email' label='Email' component={renderEmailField} />
  123. </div>
  124. <div>
  125. <Field name='telephone' type='text' label='Téléphone' component={renderBasicField} />
  126. </div>
  127. <div>
  128. <Field name='ranking' className='input-row form-group form-control' options={this.getTennisRankingsOptions()} type='select' component={renderSelectField} />
  129. </div>
  130. <div>
  131. <Field name='city' type='text' label='Ville' component={renderBasicField} />
  132. </div>
  133. <div>
  134. <button className='btn btn-info btn-lg center-block' type='submit'>Mettre à jour</button>
  135. </div>
  136. </form>
  137. </div>
  138. </div>
  139. </div>
  140. );
  141. }
  142. }
  143.  
  144. ProfileForm.propTypes = {
  145. user: React.PropTypes.object,
  146. fields: React.PropTypes.shape({
  147. firstname: React.PropTypes.string,
  148. lastname: React.PropTypes.string,
  149. email: React.PropTypes.string,
  150. telephone: React.PropTypes.string,
  151. ranking: React.PropTypes.string,
  152. city: React.PropTypes.string
  153. }),
  154. errorMessage: React.PropTypes.string,
  155. confirmationMessage: React.PropTypes.string,
  156. onSubmitProfileUpdate: React.PropTypes.func.isRequired,
  157. handleSubmit: propTypes.handleSubmit,
  158. initialize: propTypes.initialize
  159. };
  160.  
  161. const validateProfileForm = values => {
  162. const errors = {};
  163.  
  164. if (!values.firstname) errors.firstname = 'Un prénom est requis';
  165. else if (validator.isLength(values.firstname + '', {min: 0, max: 1})) errors.firstname = 'Votre prénom doit faire au moins 2 caractères';
  166.  
  167. if (!values.lastname) errors.lastname = 'Un nom est requis';
  168. else if (validator.isLength(values.lastname + '', {min: 0, max: 1})) errors.lastname = 'Votre nom doit faire au moins 2 caractères';
  169.  
  170. if (!values.email) errors.email = 'Un email est requis';
  171. else if (!validator.isEmail(values.email + '')) {
  172. errors.email = 'Adresse email invalide';
  173. }
  174.  
  175. if (!values.telephone) errors.telephone = 'Un telephone est requis';
  176. else if (!validator.isMobilePhone(values.telephone + '', 'fr-FR')) {
  177. errors.telephone = 'Téléphone invalide';
  178. }
  179.  
  180. if (!values.password) errors.password = 'Un mot de passe est requis';
  181. else if (validator.isLength(values.password + '', {min: 0, max: 4})) errors.password = 'Votre mot de passe doit faire au moins 5 caractères';
  182.  
  183. return errors;
  184. };
  185.  
  186. export default reduxForm({
  187. form: 'profile',
  188. validate: validateProfileForm
  189. })(ProfileForm);
  190.  
  191. export const renderSelectField = (field) => {
  192. // *snip snip*
  193. return (
  194. <div className={containerStyle}>
  195. {displayInputLabel(styles.idInput, field.label)}
  196. <select className='form-control' name={field.input.name}
  197. id={styles.idInput} aria-describedby={styles.ariaDescribedBy}
  198. onChange={field.input.onChange}>
  199. {field.options}
  200. </select>
  201. <span className={styles.glyphicon} aria-hidden='true' />
  202. {field.meta.touched && field.meta.error &&
  203. displayErrorMessage(field.meta.error)}
  204. </div>);
  205. };
Add Comment
Please, Sign In to add comment