Skip to content
This repository was archived by the owner on Mar 1, 2024. It is now read-only.

Commit

Permalink
feat(withTouchedErrors): Add HOC to help simplify form libs integration
Browse files Browse the repository at this point in the history
  • Loading branch information
jonthomp committed May 27, 2018
1 parent 1615424 commit 40645d7
Showing 1 changed file with 39 additions and 0 deletions.
39 changes: 39 additions & 0 deletions src/helpers/withTouchedErrors.react.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
// @flow

import * as React from "react";

/**
* Returns an object of fields with values set based on the touched and error values
* If a value is both touched and has a non-empty error string it is returned as the fields value
*/
function touchedErrors(
touched: { [string]: boolean } = {},
errors: { [string]: string } = {},
fields: Array<string> = []
): { [string]: string } {
return fields.reduce(
(acc, cur) =>
Object.assign(acc, {
[cur]: touched && touched[cur] && errors ? errors[cur] : "",
}),
{}
);
}

/**
* A HOC that modifies the errors propso that it only returns errors if the the field
* has also been touched
* First takes an array of the field names, followed by the component
*/
function withTouchedErrors(fields: Array<string> = []) {
return function withComponent<A: { +touched?: *, +errors?: * }>(
Component: React.ComponentType<A>
): React.ComponentType<A> {
return function WithTouchedErrors(props: A) {
const errors = touchedErrors(props.touched, props.errors, fields);
return <Component {...props} errors={errors} />;
};
};
}

export default withTouchedErrors;

0 comments on commit 40645d7

Please sign in to comment.