From 3ced97763dcc4a5326c99892540ca38120af5411 Mon Sep 17 00:00:00 2001
From: Alf Eaton <eaton.alf@gmail.com>
Date: Mon, 18 Sep 2017 16:34:42 +0100
Subject: [PATCH] Move ValidatedField component out of render function

---
 package.json                |  1 +
 src/atoms/ValidatedField.js | 48 +++++++++++++++++++++----------------
 src/atoms/ValidatedField.md | 10 ++++----
 3 files changed, 35 insertions(+), 24 deletions(-)

diff --git a/package.json b/package.json
index 1f28697d3..6d247574f 100644
--- a/package.json
+++ b/package.json
@@ -18,6 +18,7 @@
     "react-redux": "^5.0.2",
     "react-router": "^3.0.5",
     "react-tag-autocomplete": "^5.4.1",
+    "recompose": "^0.25.0",
     "redux": "^3.6.0",
     "redux-form": "^7.0.3",
     "xpub-fonts": "^0.0.2"
diff --git a/src/atoms/ValidatedField.js b/src/atoms/ValidatedField.js
index 32afa56c8..2028f9793 100644
--- a/src/atoms/ValidatedField.js
+++ b/src/atoms/ValidatedField.js
@@ -1,33 +1,41 @@
 import React from 'react'
+import { compose, withHandlers } from 'recompose'
 import classnames from 'classnames'
 import { Field } from 'redux-form'
 import classes from './ValidatedField.local.scss'
 
 // TODO: pass ...props.input to children automatically?
 
-const ValidatedField = ({ component, ...rest }) => (
-  <Field
-    {...rest}
-    component={({ meta, input }) => (
-      <div className={classes.root}>
-        {component(input)}
+const ValidatedFieldComponent = ({ component }) => ({ meta, input }) => (
+  <div>
+    {component(input)}
 
-        <div className={classes.messages}>
-          {meta.error && (
-            <div className={classnames(classes.message, classes.error)}>
-              {meta.error}
-            </div>
-          )}
+    {console.log(meta)}
 
-          {meta.warning && (
-            <div className={classnames(classes.message, classes.warning)}>
-              {meta.warning}
-            </div>
-          )}
-        </div>
+    {meta.touched && (
+      <div className={classes.messages}>
+        {meta.error && (
+          <div className={classnames(classes.message, classes.error)}>
+            {meta.error}
+          </div>
+        )}
+
+        {meta.warning && (
+          <div className={classnames(classes.message, classes.warning)}>
+            {meta.warning}
+          </div>
+        )}
       </div>
     )}
-  />
+  </div>
+)
+
+const ValidatedField = ({ fieldComponent, ...rest }) => (
+  <Field {...rest} component={fieldComponent}/>
 )
 
-export default ValidatedField
+export default compose(
+  withHandlers({
+    fieldComponent: ValidatedFieldComponent
+  })
+)(ValidatedField)
diff --git a/src/atoms/ValidatedField.md b/src/atoms/ValidatedField.md
index 78e3bd0b1..136df6151 100644
--- a/src/atoms/ValidatedField.md
+++ b/src/atoms/ValidatedField.md
@@ -8,11 +8,12 @@ const ValidatedFieldForm = reduxForm({
   onChange: values => console.log(values)
 })(ValidatedField);
 
+const TextInput = input => <TextField {...input}/>;
+
 <ValidatedFieldForm 
     name="error" 
     validate={() => 'Required'}
-    component={input => <TextField {...input}/>}
-    />
+    component={TextInput}/>
 ```
 
 ```js
@@ -23,9 +24,10 @@ const ValidatedFieldForm = reduxForm({
   onChange: values => console.log(values)
 })(ValidatedField);
 
+const TextInput = input => <TextField {...input}/>;
+
 <ValidatedFieldForm 
     name="warning" 
     warn={() => 'Expected'}
-    component={input => <TextField {...input}/>}
-    />
+    component={TextInput}/>
 ```
-- 
GitLab