Skip to content

Commit f7c832f

Browse files
committed
feat(manager): integrate manager with DDF
1 parent e210175 commit f7c832f

27 files changed

+113
-348
lines changed

packages/form-state-manager/package.json

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,16 @@
22
"name": "@data-driven-forms/form-state-manager",
33
"version": "0.0.1-beta.0",
44
"description": "Form state management library for data driven forms",
5-
"main": "index.js",
5+
"main": "dist/cjs/index.js",
6+
"module": "dist/esm/index.js",
67
"author": "Martin Marosi",
78
"typings": "dist/cjs/index.d.ts",
8-
"private": true,
9+
"repository": "[email protected]:data-driven-forms/react-forms.git",
10+
"keywords": [
11+
"react",
12+
"forms",
13+
"javascript"
14+
],
915
"devDependencies": {
1016
"@babel/core": "^7.2.2",
1117
"@babel/plugin-proposal-class-properties": "^7.1.0",

packages/form-state-manager/src/files/form-manager-context.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ const FormManagerContext = createContext<ManagerContextValue>({
1919
}),
2020
formOptions: createManagerApi({
2121
onSubmit: noop
22-
}),
22+
})(),
2323
getFieldValue: noop,
2424
getFieldState: () => undefined,
2525
blur: noop,

packages/form-state-manager/src/files/form-spy.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ import FormManagerContext from './form-manager-context';
33
import generateId from '../utils/generate-id';
44
import FormSpyProps from '../types/form-spy';
55

6-
const FormSpy: React.FunctionComponent<FormSpyProps> = ({ children, subscription }) => {
7-
const { subscribe, unsubscribe, getState } = useContext(FormManagerContext);
6+
const FormSpy: React.FunctionComponent<FormSpyProps> = ({ children, subscription = { all: true } }) => {
7+
const { subscribe, unsubscribe, getState, formOptions } = useContext(FormManagerContext);
88
const [, rerender] = useReducer((prev) => prev + 1, 0);
99

1010
const [id] = useState(() => {
@@ -23,7 +23,7 @@ const FormSpy: React.FunctionComponent<FormSpyProps> = ({ children, subscription
2323
[]
2424
);
2525

26-
return children({ ...getState() });
26+
return children({ ...getState(), form: formOptions });
2727
};
2828

2929
export default FormSpy;

packages/form-state-manager/src/files/form-state-manager.tsx

Lines changed: 38 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
import React, { useRef } from 'react';
1+
import React, { useEffect, useReducer, useRef, useState } from 'react';
22

33
import FormManagerContext from './form-manager-context';
44
import createManagerApi from '../utils/manager-api';
55

66
import FormStateManagerProps from '../types/form-state-manager';
77
import useFieldArrayApi from './use-field-array-api';
8+
import generateId from '../utils/generate-id';
89

910
const FormStateManager: React.ComponentType<FormStateManagerProps> = ({
1011
children,
@@ -15,50 +16,50 @@ const FormStateManager: React.ComponentType<FormStateManagerProps> = ({
1516
initialValues,
1617
initializeOnMount,
1718
validate,
18-
debug
19+
debug,
20+
render
1921
}) => {
2022
const { current: managerApi } = useRef(
2123
createManagerApi({ onSubmit, clearOnUnmount, validate, subscription, initialValues, initializeOnMount, debug })
2224
);
2325

24-
const {
25-
batch,
26-
change,
27-
handleSubmit,
28-
registerField,
29-
unregisterField,
30-
getState,
31-
getFieldValue,
32-
getFieldState,
33-
blur,
34-
focus,
35-
subscribe,
36-
unsubscribe
37-
} = managerApi();
26+
const { change, getFieldValue, subscribe, unsubscribe, pauseValidation, resumeValidation } = managerApi();
27+
28+
const [, rerender] = useReducer((prev) => prev + 1, 0);
29+
30+
const [id] = useState(() => {
31+
const internalId = generateId();
32+
33+
pauseValidation();
34+
35+
subscribe({ name: internalId, render: rerender, subscription });
36+
37+
return internalId;
38+
});
39+
40+
useEffect(
41+
() => {
42+
resumeValidation();
43+
return () => {
44+
unsubscribe({ name: id });
45+
};
46+
},
47+
// eslint-disable-next-line react-hooks/exhaustive-deps
48+
[]
49+
);
3850

3951
const { current: fieldArrayApi } = useRef(useFieldArrayApi(change, getFieldValue));
52+
53+
const managerState = {
54+
formOptions: managerApi(),
55+
clearedValue,
56+
...managerApi().getState(),
57+
...fieldArrayApi
58+
};
59+
4060
return (
41-
<FormManagerContext.Provider
42-
value={{
43-
batch,
44-
blur,
45-
focus,
46-
getFieldState,
47-
getFieldValue,
48-
change,
49-
getState,
50-
handleSubmit,
51-
registerField,
52-
unregisterField,
53-
formOptions: managerApi,
54-
clearedValue,
55-
initialValues,
56-
subscribe,
57-
unsubscribe,
58-
...fieldArrayApi
59-
}}
60-
>
61-
<FormManagerContext.Consumer>{(managerState) => children(managerState)}</FormManagerContext.Consumer>
61+
<FormManagerContext.Provider value={managerState}>
62+
<FormManagerContext.Consumer>{() => (render ? render(managerState) : children(managerState))}</FormManagerContext.Consumer>
6263
</FormManagerContext.Provider>
6364
);
6465
};

packages/form-state-manager/src/files/use-field.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ const useField = ({
9696

9797
return internalId;
9898
});
99-
const state = formOptions().getFieldState(name);
99+
const state = formOptions.getFieldState(name);
100100

101101
const finalClearedValue = Object.prototype.hasOwnProperty.call(props, 'clearedValue') ? props.clearedValue : rest.clearedValue;
102102

@@ -128,15 +128,15 @@ const useField = ({
128128

129129
useEffect(
130130
() => {
131-
formOptions().afterSilentRegistration({ name, internalId: id });
131+
formOptions.afterSilentRegistration({ name, internalId: id });
132132

133133
if (type === 'file') {
134-
formOptions().registerInputFile(name);
134+
formOptions.registerInputFile(name);
135135
}
136136

137137
return () => {
138138
if (type === 'file') {
139-
formOptions().unregisterInputFile(name);
139+
formOptions.unregisterInputFile(name);
140140
}
141141

142142
unregisterField({ name, clearOnUnmount, internalId: id, value: finalClearedValue });
@@ -154,7 +154,7 @@ const useField = ({
154154
}
155155
};
156156

157-
let valueToReturn = formOptions().getFieldValue(name);
157+
let valueToReturn = formOptions.getFieldValue(name);
158158
let checked;
159159

160160
if (type === 'checkbox') {

packages/form-state-manager/src/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,5 @@ export * from './files/form-state-manager';
22
export { default as FormStateManager } from './files/form-state-manager';
33
export { default as useField } from './files/use-field';
44
export { default as FormManagerContext } from './files/form-manager-context';
5+
export { default as FormSpy } from './files/form-spy';
6+
export { default as FieldArray } from './files/field-array';

packages/form-state-manager/src/tests/performance/field-render-cycle.test.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,9 +81,9 @@ describe('useField rendering cycle', () => {
8181

8282
return (
8383
<Fragment>
84-
<button id="initialize" onClick={() => formOptions().initialize({ one: 'changed' })} />
85-
<button id="reset" onClick={() => formOptions().reset()} />
86-
<button id="resetfieldstate" onClick={() => formOptions().resetFieldState('one')} />
84+
<button id="initialize" onClick={() => formOptions.initialize({ one: 'changed' })} />
85+
<button id="reset" onClick={() => formOptions.reset()} />
86+
<button id="resetfieldstate" onClick={() => formOptions.resetFieldState('one')} />
8787
<button id="submit" type="submit" />
8888
</Fragment>
8989
);

packages/form-state-manager/src/types/form-manager-context.d.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { FormEvent } from 'react';
22
import AnyObject from './any-object';
3-
import { Batch, Change, ManagerApi, GetState, Blur, Focus, Unsubscribe, Subscribe } from './manager-api';
3+
import { Batch, Change, ManagerState, GetState, Blur, Focus, Unsubscribe, Subscribe } from './manager-api';
44
import FieldConfig from './field-config';
55
import FieldArrayApi from './use-field-array-api';
66

@@ -15,7 +15,7 @@ export interface ManagerContextValue extends FieldArrayApi {
1515
unregisterField: (fieldState: Omit<FieldConfig, 'render'>) => void;
1616
change: Change;
1717
getState: GetState;
18-
formOptions: ManagerApi;
18+
formOptions: ManagerState;
1919
getFieldValue: (name: string) => any;
2020
getFieldState: (name: string) => AnyObject | undefined;
2121
blur: Blur;

packages/form-state-manager/src/types/form-spy.d.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
import { Subscription } from './use-field';
22
import { ManagerState } from './manager-api';
33

4-
type Children = (props: ManagerState) => React.ReactElement;
4+
interface ChildrenFormSpyProps extends ManagerState {
5+
form: ManagerState;
6+
}
7+
8+
type Children = (props: ChildrenFormSpyProps) => React.ReactElement;
59

610
export interface FormSpyProps {
711
children: Children;

packages/form-state-manager/src/types/form-state-manager.d.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
import AnyObject from './any-object';
2-
import { Subscription } from './use-subscription';
2+
import { Subscription } from './use-field';
33
import { FormValidator } from './validate';
44
import { Debug } from './manager-api';
55

66
export interface FormStateManagerProps {
77
onSubmit: (values: AnyObject) => void;
88
children: (props: AnyObject) => React.ReactNode;
9+
render: (props: AnyObject) => React.ReactNode;
910
clearOnUnmount?: boolean;
1011
subscription?: Subscription;
1112
clearedValue?: any;

0 commit comments

Comments
 (0)