Skip to content
This repository was archived by the owner on Aug 23, 2022. It is now read-only.

Commit 5e7a8bb

Browse files
committed
Internalizing proprietary <Errors> methods and adding unit tests for wrapper and component props
1 parent 31ef8a0 commit 5e7a8bb

File tree

3 files changed

+501
-278
lines changed

3 files changed

+501
-278
lines changed

src/components/errors-component.js

Lines changed: 63 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -5,38 +5,10 @@ import map from 'lodash/map';
55
import compact from 'lodash/compact';
66
import iteratee from 'lodash/iteratee';
77
import isArray from 'lodash/isArray';
8+
import isPlainObject from 'lodash/isPlainObject';
89

910
import { getFieldFromState } from '../utils';
1011

11-
function createErrorComponent(component, message, modelValue, key) {
12-
const messageString = typeof message === 'function'
13-
? message(modelValue)
14-
: message;
15-
16-
return React.createElement(
17-
component,
18-
{ key },
19-
messageString);
20-
}
21-
22-
function mapErrorMessages(errors, messages, modelValue, component) {
23-
return compact(map(errors, (error, key) => {
24-
const message = messages[key];
25-
26-
if (error) {
27-
if (message) {
28-
return createErrorComponent(component, message, modelValue, key);
29-
} else if (typeof error === 'string') {
30-
return createErrorComponent(component, error, modelValue, key);
31-
} else if (typeof error === 'object') {
32-
return mapErrorMessages(error, messages, modelValue, component);
33-
}
34-
}
35-
36-
return false;
37-
})).reduce((a, b) => a.concat(b), []);
38-
}
39-
4012
function showErrors(field, show = true) {
4113
if (typeof show === 'function') {
4214
return show(field);
@@ -56,19 +28,62 @@ class Errors extends Component {
5628
return fieldValue !== this.props.fieldValue;
5729
}
5830

59-
render() {
31+
mapErrorMessages(errors) {
32+
const { messages } = this.props;
33+
34+
return compact(map(errors, (error, key) => {
35+
const message = messages[key];
36+
37+
if (error) {
38+
if (message) {
39+
return this.renderError(message, key);
40+
} else if (typeof error === 'string') {
41+
return this.renderError(error, key);
42+
} else if (isPlainObject(error)) {
43+
return this.mapErrorMessages(error);
44+
}
45+
}
46+
47+
return false;
48+
})).reduce((a, b) => a.concat(b), []);
49+
}
50+
51+
renderError(message, key) {
6052
const {
61-
// model,
53+
component,
54+
model,
55+
modelValue,
56+
fieldValue,
57+
} = this.props;
58+
59+
const errorProps = {
60+
key,
61+
model,
6262
modelValue,
6363
fieldValue,
64+
};
65+
66+
const messageString = typeof message === 'function'
67+
? message(modelValue)
68+
: message;
69+
70+
if (!messageString) return null;
71+
72+
return React.createElement(
73+
component,
74+
errorProps,
75+
messageString);
76+
}
77+
78+
render() {
79+
const {
80+
fieldValue,
6481
fieldValue: {
6582
valid,
6683
errors,
6784
},
68-
messages,
6985
show,
7086
wrapper,
71-
component,
7287
} = this.props;
7388

7489
if (!showErrors(fieldValue, show)) {
@@ -77,7 +92,7 @@ class Errors extends Component {
7792

7893
const errorMessages = valid
7994
? null
80-
: mapErrorMessages(errors, messages, modelValue, component);
95+
: this.mapErrorMessages(errors);
8196

8297
return React.createElement(
8398
wrapper,
@@ -87,13 +102,24 @@ class Errors extends Component {
87102
}
88103

89104
Errors.propTypes = {
90-
model: PropTypes.string.isRequired,
105+
// Computed props
91106
modelValue: PropTypes.any,
92107
fieldValue: PropTypes.object,
93-
messages: PropTypes.object,
108+
109+
// Provided props
110+
model: PropTypes.string.isRequired,
111+
messages: PropTypes.objectOf(PropTypes.oneOf([
112+
PropTypes.string,
113+
PropTypes.func,
114+
PropTypes.bool,
115+
])),
94116
show: PropTypes.any,
95117
wrapper: PropTypes.string,
96-
component: PropTypes.string,
118+
component: PropTypes.oneOf([
119+
PropTypes.string,
120+
PropTypes.func,
121+
PropTypes.element,
122+
]),
97123
};
98124

99125
Errors.defaultProps = {

src/index.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import actionTypes from './action-types';
33

44
import Field, { controlPropsMap, createFieldClass } from './components/field-component';
55
import Form from './components/form-component';
6-
// import Errors from './components/errors-component';
6+
import Errors from './components/errors-component';
77

88
import modeled from './enhancers/modeled-enhancer';
99

@@ -34,7 +34,7 @@ export {
3434
createModelReducer,
3535
Field,
3636
Form,
37-
// Errors,
37+
Errors,
3838
getField,
3939
initialFieldState,
4040
modeled,

0 commit comments

Comments
 (0)