Skip to content

Commit 79d5fb5

Browse files
committed
feat(renderer): add function for preparing single field props
1 parent c21b71f commit 79d5fb5

File tree

5 files changed

+79
-51
lines changed

5 files changed

+79
-51
lines changed

packages/react-form-renderer/src/form-renderer/render-form.js

Lines changed: 2 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { Field } from 'react-final-form';
55
import RendererContext from '../renderer-context';
66
import Condition from '../condition';
77
import getConditionTriggers from '../get-condition-triggers';
8+
import prepareComponentProps from '../prepare-component-props';
89

910
const FormFieldHideWrapper = ({ hideField, children }) => (hideField ? <div hidden>{children}</div> : children);
1011

@@ -87,57 +88,7 @@ FormConditionWrapper.propTypes = {
8788
const SingleField = ({ component, condition, hideField, ...rest }) => {
8889
const { actionMapper, componentMapper } = useContext(RendererContext);
8990

90-
let componentProps = {
91-
component,
92-
...rest
93-
};
94-
95-
const componentBinding = componentMapper[component];
96-
let Component;
97-
if (typeof componentBinding === 'object' && Object.prototype.hasOwnProperty.call(componentBinding, 'component')) {
98-
const { component, ...mapperProps } = componentBinding;
99-
Component = component;
100-
componentProps = {
101-
...mapperProps,
102-
...componentProps,
103-
// merge mapper and field actions
104-
...(mapperProps.actions && rest.actions ? { actions: { ...mapperProps.actions, ...rest.actions } } : {}),
105-
// merge mapper and field resolveProps
106-
...(mapperProps.resolveProps && rest.resolveProps
107-
? {
108-
resolveProps: (...args) => ({
109-
...mapperProps.resolveProps(...args),
110-
...rest.resolveProps(...args)
111-
})
112-
}
113-
: {})
114-
};
115-
} else {
116-
Component = componentBinding;
117-
}
118-
119-
/**
120-
* Map actions to props
121-
*/
122-
let overrideProps = {};
123-
let mergedResolveProps; // new object has to be created because of references
124-
if (componentProps.actions) {
125-
Object.keys(componentProps.actions).forEach((prop) => {
126-
const [action, ...args] = componentProps.actions[prop];
127-
overrideProps[prop] = actionMapper[action](...args);
128-
});
129-
130-
// Merge componentProps resolve props and actions resolve props
131-
if (componentProps.resolveProps && overrideProps.resolveProps) {
132-
mergedResolveProps = (...args) => ({
133-
...componentProps.resolveProps(...args),
134-
...overrideProps.resolveProps(...args)
135-
});
136-
}
137-
138-
// do not pass actions object to components
139-
delete componentProps.actions;
140-
}
91+
const { componentProps, Component, overrideProps, mergedResolveProps } = prepareComponentProps({ component, rest, componentMapper, actionMapper });
14192

14293
return (
14394
<FormConditionWrapper condition={condition} field={componentProps}>
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { default } from './prepare-component-props';
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { default } from './prepare-component-props';
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { AnyObject, ComponentMapper } from "../common-types";
2+
import { ActionMapper } from "../form-renderer";
3+
4+
export interface PrepareComponentPropsOptions {
5+
component: string;
6+
rest: AnyObject;
7+
componentMapper: ComponentMapper;
8+
actionMapper: ActionMapper;
9+
}
10+
11+
declare function prepareComponentProps(PrepareComponentPropsOptions: AnyObject): AnyObject;
12+
13+
export default prepareComponentProps;
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
const prepareComponentProps = ({ component, rest, componentMapper, actionMapper }) => {
2+
let componentProps = {
3+
component,
4+
...rest
5+
};
6+
7+
const componentBinding = componentMapper[component];
8+
let Component;
9+
if (typeof componentBinding === 'object' && Object.prototype.hasOwnProperty.call(componentBinding, 'component')) {
10+
const { component, ...mapperProps } = componentBinding;
11+
Component = component;
12+
componentProps = {
13+
...mapperProps,
14+
...componentProps,
15+
// merge mapper and field actions
16+
...(mapperProps.actions && rest.actions ? { actions: { ...mapperProps.actions, ...rest.actions } } : {}),
17+
// merge mapper and field resolveProps
18+
...(mapperProps.resolveProps && rest.resolveProps
19+
? {
20+
resolveProps: (...args) => ({
21+
...mapperProps.resolveProps(...args),
22+
...rest.resolveProps(...args)
23+
})
24+
}
25+
: {})
26+
};
27+
} else {
28+
Component = componentBinding;
29+
}
30+
31+
/**
32+
* Map actions to props
33+
*/
34+
let overrideProps = {};
35+
let mergedResolveProps; // new object has to be created because of references
36+
if (componentProps.actions) {
37+
Object.keys(componentProps.actions).forEach((prop) => {
38+
const [action, ...args] = componentProps.actions[prop];
39+
overrideProps[prop] = actionMapper[action](...args);
40+
});
41+
42+
// Merge componentProps resolve props and actions resolve props
43+
if (componentProps.resolveProps && overrideProps.resolveProps) {
44+
mergedResolveProps = (...args) => ({
45+
...componentProps.resolveProps(...args),
46+
...overrideProps.resolveProps(...args)
47+
});
48+
}
49+
50+
// do not pass actions object to components
51+
delete componentProps.actions;
52+
}
53+
54+
return {
55+
componentProps,
56+
overrideProps,
57+
mergedResolveProps,
58+
Component
59+
};
60+
};
61+
62+
export default prepareComponentProps;

0 commit comments

Comments
 (0)