Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(manager): introduce setConfig #735

Merged
merged 1 commit into from
Aug 18, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions packages/form-state-manager/src/tests/utils/manager-api.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -1287,4 +1287,27 @@ describe('managerApi', () => {
expect(fieldValidateNoRun).not.toHaveBeenCalled();
});
});

describe('setConfig', () => {
it('change config attribute', () => {
const debug = jest.fn();

const managerApi = createManagerApi({ debug });

expect(debug.mock.calls.length).toEqual(0);

managerApi().rerender();

expect(debug.mock.calls.length).toEqual(1);

const debugNew = jest.fn();

managerApi().setConfig('debug', debugNew);

managerApi().rerender();

expect(debug.mock.calls.length).toEqual(1);
expect(debugNew.mock.calls.length).toEqual(1);
});
});
});
5 changes: 4 additions & 1 deletion packages/form-state-manager/src/types/manager-api.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ export type Initilize = (initialValues: AnyObject | InitilizeInputFunction) => v
export type IsValidationPaused = () => boolean;
export type PauseValidation = () => void;
export type ResumeValidation = () => void;
export type SetConfig = (attribute: keyof CreateManagerApiConfig, value: any) => void;

export interface AsyncWatcherRecord {
[key: number]: Promise<unknown>;
Expand Down Expand Up @@ -104,7 +105,8 @@ export type ManagerApiFunctions =
| 'submit'
| 'isValidationPaused'
| 'pauseValidation'
| 'resumeValidation';
| 'resumeValidation'
| 'setConfig';

export interface ManagerState {
values: AnyObject;
Expand Down Expand Up @@ -135,6 +137,7 @@ export interface ManagerState {
isValidationPaused: IsValidationPaused;
pauseValidation: PauseValidation;
resumeValidation: ResumeValidation;
setConfig: SetConfig;
registeredFields: Array<string>;
fieldListeners: FieldListeners;
active: string | undefined;
Expand Down
45 changes: 31 additions & 14 deletions packages/form-state-manager/src/utils/manager-api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@ import CreateManagerApi, {
SubscriberConfig,
ManagerApiFunctions,
ExtendedFieldState,
InitilizeInputFunction
InitilizeInputFunction,
CreateManagerApiConfig
} from '../types/manager-api';
import AnyObject from '../types/any-object';
import FieldConfig from '../types/field-config';
Expand Down Expand Up @@ -185,6 +186,17 @@ const createManagerApi: CreateManagerApi = ({
keepDirtyOnReinitialize,
destroyOnUnregister
}) => {
const config: CreateManagerApiConfig = {
onSubmit,
clearOnUnmount,
initializeOnMount,
validate,
subscription,
debug,
keepDirtyOnReinitialize,
destroyOnUnregister
};

let state: ManagerState = {
change,
focus,
Expand All @@ -211,6 +223,7 @@ const createManagerApi: CreateManagerApi = ({
isValidationPaused,
pauseValidation,
resumeValidation,
setConfig,
destroyOnUnregister,
...initialFormState(initialValues)
};
Expand All @@ -225,6 +238,10 @@ const createManagerApi: CreateManagerApi = ({

const managerApi: ManagerApi = () => state;

function setConfig(attribute: keyof CreateManagerApiConfig, value: any) {
config[attribute] = value;
}

function isValidationPaused() {
return validationPaused;
}
Expand All @@ -241,8 +258,8 @@ const createManagerApi: CreateManagerApi = ({
revalidatedFields = [];
}

if (runFormValidation && validate) {
validateForm(validate);
if (runFormValidation && config.validate) {
validateForm(config.validate);
}

runFormValidation = false;
Expand Down Expand Up @@ -305,9 +322,9 @@ const createManagerApi: CreateManagerApi = ({

const convertedValues = typeof initialValues === 'function' ? initialValues(state.values) : initialValues;
let clonedValues = cloneDeep(convertedValues);
let dirtyFields = keepDirtyOnReinitialize ? cloneDeep(state.values) : {};
let dirtyFields = config.keepDirtyOnReinitialize ? cloneDeep(state.values) : {};

if (keepDirtyOnReinitialize) {
if (config.keepDirtyOnReinitialize) {
traverseObject(flatObject(dirtyFields), (value, name) => {
if (!state.dirtyFields[name]) {
dirtyFields = omit(dirtyFields, name);
Expand All @@ -319,7 +336,7 @@ const createManagerApi: CreateManagerApi = ({
const fieldState = state.fieldListeners[key]?.state;

if (fieldState) {
if (keepDirtyOnReinitialize) {
if (config.keepDirtyOnReinitialize) {
if (!state.dirtyFields[key]) {
fieldState.meta.pristine = true;
fieldState.meta.dirty = false;
Expand Down Expand Up @@ -421,8 +438,8 @@ const createManagerApi: CreateManagerApi = ({
state.dirty = true;
validateField(name, value);

if (validate) {
validateForm(validate);
if (config.validate) {
validateForm(config.validate);
}
});
}
Expand All @@ -439,7 +456,7 @@ const createManagerApi: CreateManagerApi = ({

function handleSubmit(event: FormEvent): void {
event.preventDefault();
onSubmit(state.values);
config.onSubmit(state.values);
}

function isInitialized(name: string): boolean {
Expand All @@ -449,7 +466,7 @@ const createManagerApi: CreateManagerApi = ({
function registerField(field: FieldConfig): void {
addIfUnique(state.registeredFields, field.name);

if (shouldExecute(initializeOnMount, field.initializeOnMount) || (!isInitialized(field.name) && typeof field.value !== 'undefined')) {
if (shouldExecute(config.initializeOnMount, field.initializeOnMount) || (!isInitialized(field.name) && typeof field.value !== 'undefined')) {
set(state.values, field.name, field.value || get(state.initialValues, field.name));
}

Expand All @@ -470,7 +487,7 @@ const createManagerApi: CreateManagerApi = ({

if (isLast(state.fieldListeners, field.name)) {
state.registeredFields = state.registeredFields.filter((fieldName: string) => fieldName !== field.name);
if (shouldExecute(clearOnUnmount || destroyOnUnregister, field.clearOnUnmount)) {
if (shouldExecute(config.clearOnUnmount || config.destroyOnUnregister, field.clearOnUnmount)) {
set(state.values, field.name, field.value);
}
}
Expand Down Expand Up @@ -547,9 +564,9 @@ const createManagerApi: CreateManagerApi = ({
traverseObject(fieldListener.fields, (field) => {
let shouldRender: boolean | undefined = false;

const mergedSubscription = { ...subscription, ...field.subscription };
const mergedSubscription = { ...config.subscription, ...field.subscription };

if (!subscription && !field.subscription) {
if (!config.subscription && !field.subscription) {
shouldRender = true;
} else {
traverseObject(mergedSubscription, (subscribed, key) => {
Expand All @@ -564,7 +581,7 @@ const createManagerApi: CreateManagerApi = ({
});
}

debug && debug(state);
config.debug && config.debug(state);
}

function batch(callback: Callback): void {
Expand Down