Skip to content

Commit e8529c1

Browse files
authored
refactor: make toFlat as utility (#152)
1 parent 0af2e20 commit e8529c1

File tree

2 files changed

+30
-16
lines changed

2 files changed

+30
-16
lines changed

src/extension/useExportControlToExtension.ts

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { useEffect, useState } from 'react';
44
import { Control, useFormState, useWatch } from 'react-hook-form';
55
import useDeepCompareEffect from 'use-deep-compare-effect';
66
import { MessageData, UpdatePayload } from './types';
7-
import { proxyToObject } from './utils';
7+
import { nestToFlat, proxyToObject } from './utils';
88

99
const id = nanoid();
1010

@@ -33,14 +33,6 @@ export function useExportControlToExtension(control: Control<any>) {
3333
return () => window.removeEventListener('message', handleInitMessage);
3434
}, []);
3535

36-
const toFlat = <V>(obj: object, defaultValue?: V) => {
37-
return [...control._names.mount].reduce((perv, name) => {
38-
// nested field may be `undefined`
39-
perv[name] = _.get(obj, name) || defaultValue;
40-
return perv;
41-
}, {} as Record<string, V>);
42-
};
43-
4436
useDeepCompareEffect(() => {
4537
if (!isExtensionEnabled) {
4638
return;
@@ -53,21 +45,29 @@ export function useExportControlToExtension(control: Control<any>) {
5345
...formStatus
5446
} = proxyToObject(formState);
5547

56-
const formValues = toFlat(nestedFormValues, '');
57-
const dirtyFields = toFlat(nestedDirtyFields, false);
58-
const touchedFields = toFlat(nestedTouchedFields, false);
48+
const flatFieldNames = [...control._names.mount];
49+
50+
const formValues = nestToFlat(flatFieldNames, nestedFormValues, '');
51+
const dirtyFields = nestToFlat(flatFieldNames, nestedDirtyFields, false);
52+
const touchedFields = nestToFlat(
53+
flatFieldNames,
54+
nestedTouchedFields,
55+
false,
56+
);
57+
const flatErrors = nestToFlat<{ type?: string; message?: string }>(
58+
flatFieldNames,
59+
nestedErrors,
60+
);
5961

60-
const errors = Object.entries(
61-
toFlat<{ type: string; message: string }>(nestedErrors),
62-
).reduce((perv, [key, value]) => {
62+
const errors = Object.entries(flatErrors).reduce((perv, [key, value]) => {
6363
perv[key] = {
6464
type: value?.type as string,
6565
message: value?.message as string,
6666
};
6767
return perv;
6868
}, {} as Record<string, { type?: string; message?: string }>);
6969

70-
const nativeFields = [...control._names.mount].reduce((perv, name) => {
70+
const nativeFields = flatFieldNames.reduce((perv, name) => {
7171
perv[name] = !!_.get(control._fields, name)?._f?.ref?.type;
7272
return perv;
7373
}, {} as Record<string, boolean>);

src/extension/utils.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,20 @@
1+
import _ from 'lodash';
2+
13
export function proxyToObject<T extends Record<string, any>>(proxy: T) {
24
return Reflect.ownKeys(proxy).reduce((perv, key) => {
35
perv[key as keyof T] = proxy[key as keyof T];
46
return perv;
57
}, {} as T);
68
}
9+
10+
export function nestToFlat<V>(
11+
flatKeys: string[],
12+
obj: object,
13+
defaultValue?: V,
14+
) {
15+
return flatKeys.reduce((perv, name) => {
16+
// nested field may be `undefined`
17+
perv[name] = _.get(obj, name) || defaultValue;
18+
return perv;
19+
}, {} as Record<string, V>);
20+
}

0 commit comments

Comments
 (0)