Guest User

Untitled

a guest
Nov 13th, 2017
386
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.39 KB | None | 0 0
  1. import React from 'react';
  2. import { connect } from 'react-redux';
  3. import { reduxForm, Field, FieldArray } from 'redux-form';
  4.  
  5. const sleep = ms =>
  6. new Promise(resolve => setTimeout(resolve, ms));
  7.  
  8. const asyncValidateForm = (values) => {
  9. return sleep(1000)
  10. .then(() => {
  11. if (values.email !== 'gmleonr@gmail.com') {
  12. throw { email: 'Remoto: El correo es inválido' };
  13. }
  14. });
  15. };
  16.  
  17. const validateForm = (values) => {
  18. const errors = {};
  19.  
  20. if (!/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i.test(values.email)) {
  21. // errors.email = 'Debe ingresar un correo válido';
  22. }
  23.  
  24. if (Object.keys(errors).length > 0) {
  25. errors._error = 'Formulario inválido';
  26. }
  27.  
  28. return errors;
  29. }
  30.  
  31. const required = value =>
  32. value ? undefined : 'Debe ingresar un valor';
  33.  
  34. const email = value =>
  35. /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i.test(value) ? undefined : 'Debe ingresar un correo con formato correcto';
  36.  
  37. const validateFieldArray = (values) => {
  38. const errors = {};
  39. const commentsError = [];
  40.  
  41. console.log(values);
  42.  
  43. if (!values || values.length === 0) {
  44. errors.comments = {
  45. _error: 'Debe agregar al menos un comentario'
  46. }
  47. }
  48. else {
  49. values.forEach((value, index) => {
  50. const fieldErrors = {};
  51. if (!value || !value.text) {
  52. fieldErrors.text = 'El comentario necesita un contenido';
  53. commentsError[index] = fieldErrors;
  54. }
  55. });
  56.  
  57. if (commentsError.length > 0) {
  58. errors.comments = commentsError;
  59. }
  60. }
  61.  
  62. console.log(errors);
  63.  
  64. if (Object.keys(errors).length > 0) {
  65. return errors;
  66. }
  67. };
  68.  
  69. const renderField = (props) => {
  70. const { type, input, label, meta } = props;
  71.  
  72. return (
  73. <div>
  74. <label htmlFor={input.name}>{label}</label>
  75. <input type={type} {...input} />
  76. { meta.touched && meta.error && <span>{meta.error}</span> }
  77. </div>
  78. );
  79. };
  80.  
  81. const renderComments = ({ fields, meta, ...props }) => {
  82. console.log(meta, props);
  83. return (
  84. <ul>
  85. <li>
  86. {
  87. meta.submitFailed && meta.error
  88. && meta.error.comments
  89. && <span>{meta.error.comments._error}</span>
  90. }
  91. </li>
  92. <li>
  93. <button
  94. type="button"
  95. onClick={() => fields.push()}
  96. >
  97. Agregar comentario
  98. </button>
  99. </li>
  100. {fields.map((comment, index) => {
  101. return (
  102. <li key={index}>
  103. <button type="button" title="Quitar"
  104. onClick={() => fields.remove(index)}
  105. >
  106. Quitar
  107. </button>
  108. <Field
  109. name={`${comment}.subject`}
  110. type="text"
  111. component={renderField}
  112. label="Asunto"
  113. />
  114. <Field
  115. name={`${comment}.text`}
  116. type="text"
  117. component={renderField}
  118. label="Comentario"
  119. />
  120. {
  121. meta.submitFailed && meta.error
  122. && meta.error.comments
  123. && meta.error.comments[index]
  124. && <span>{meta.error.comments[index].text}</span>
  125. }
  126. </li>
  127. );
  128. })}
  129. </ul>
  130. );
  131. };
  132.  
  133. const ContactForm = (props) => {
  134. const { handleSubmit } = props;
  135.  
  136. return (
  137. <form onSubmit={handleSubmit}>
  138. <Field name='name' component='input' type='text' />
  139. <Field
  140. name='email'
  141. component={renderField}
  142. type='email'
  143. label='Correo electrónico'
  144. validate={[required, email]} />
  145. <FieldArray
  146. name='comments'
  147. component={renderComments}
  148. validate={validateFieldArray}
  149. />
  150. <button type='submit'>Enviar</button>
  151. {
  152. props.anyTouched &&
  153. props.error &&
  154. <span>{props.error}</span>
  155. }
  156. </form>
  157. );
  158. }
  159.  
  160. const EnhancedContactForm = reduxForm({
  161. form: 'contact-form',
  162. // validate: validateForm,
  163. asyncValidate: asyncValidateForm,
  164. asyncBlurFields: ['email'],
  165. // initialValues: {
  166. // name: 'Gustavo Leon',
  167. // email: 'gmleonr@gmail.com',
  168. // comments: [
  169. // undefined,
  170. // {
  171. // subject: 'Hola',
  172. // text: 'Mundo'
  173. // }
  174. // ]
  175. // }
  176. })(ContactForm);
  177.  
  178. const mapStateToProps = (state) => {
  179. return {
  180. initialValues: {
  181. name: 'Gustavo Leon',
  182. email: 'gmleonr@gmail.com',
  183. comments: [
  184. undefined,
  185. {
  186. subject: 'Hola',
  187. text: 'Mundo'
  188. }
  189. ]
  190. }
  191. };
  192. };
  193.  
  194. export default connect(mapStateToProps)(EnhancedContactForm);
Add Comment
Please, Sign In to add comment