chore: optimize getDatabByPath and getSiblingData

This commit is contained in:
Dan Ribbens
2022-03-30 17:04:26 -04:00
parent dade960615
commit 42baf2e27e
4 changed files with 20 additions and 32 deletions

View File

@@ -47,7 +47,7 @@ const buildStateFromSchema = async (args: Args): Promise<Fields> => {
if (fieldSchema) {
const validationPromises = [];
const structureFieldState = (field, passesCondition, data = {}, siblingData = {}) => {
const structureFieldState = (field, passesCondition, data = {}) => {
const value = typeof data?.[field.name] !== 'undefined' ? data[field.name] : field.defaultValue;
const fieldState = {
@@ -61,9 +61,9 @@ const buildStateFromSchema = async (args: Args): Promise<Fields> => {
validationPromises.push(buildValidationPromise(fieldState, {
...field,
data: fullData,
fullData,
user,
siblingData,
siblingData: data,
id,
operation,
}));
@@ -154,7 +154,7 @@ const buildStateFromSchema = async (args: Args): Promise<Fields> => {
return {
...state,
[`${path}${field.name}`]: structureFieldState(field, passesCondition, fullData, data),
[`${path}${field.name}`]: structureFieldState(field, passesCondition, data),
};
}
@@ -171,7 +171,7 @@ const buildStateFromSchema = async (args: Args): Promise<Fields> => {
// Handle normal fields
return {
...state,
[`${path}${namedField.name}`]: structureFieldState(field, passesCondition, fullData, data),
[`${path}${namedField.name}`]: structureFieldState(field, passesCondition, data),
};
}

View File

@@ -1,24 +1,18 @@
import { unflatten } from 'flatley';
import reduceFieldsToValues from './reduceFieldsToValues';
import { Fields } from './types';
const getDataByPath = <T = unknown>(fields: Fields, path: string): T => {
const pathPrefixToRemove = path.substring(0, path.lastIndexOf('.') + 1);
const name = path.split('.').pop();
const data = Object.keys(fields).reduce((matchedData, key) => {
if (key.indexOf(`${path}.`) === 0 || key === path) {
return {
...matchedData,
[key.replace(pathPrefixToRemove, '')]: fields[key],
};
const data = {};
Object.keys(fields).forEach((key) => {
if (!fields[key].disableFormData && (key.indexOf(`${path}.`) === 0 || key === path)) {
data[key.replace(pathPrefixToRemove, '')] = fields[key].value;
}
});
return matchedData;
}, {});
const values = reduceFieldsToValues(data, true);
const unflattenedData = unflatten(values);
const unflattenedData = unflatten(data);
return unflattenedData?.[name];
};

View File

@@ -1,26 +1,21 @@
import reduceFieldsToValues from './reduceFieldsToValues';
import { unflatten } from 'flatley';
import { Fields, Data } from './types';
const getSiblingData = (fields: Fields, path: string): Data => {
let siblingFields = fields;
const siblingFields = {};
// If this field is nested
// We can provide a list of sibling fields
if (path.indexOf('.') > 0) {
const parentFieldPath = path.substring(0, path.lastIndexOf('.') + 1);
siblingFields = Object.keys(fields).reduce((siblings, fieldKey) => {
if (fieldKey.indexOf(parentFieldPath) === 0) {
return {
...siblings,
[fieldKey.replace(parentFieldPath, '')]: fields[fieldKey],
};
Object.keys(fields).forEach((fieldKey) => {
if (!fields[fieldKey].disableFormData && fieldKey.indexOf(parentFieldPath) === 0) {
siblingFields[fieldKey.replace(parentFieldPath, '')] = fields[fieldKey].value;
}
return siblings;
}, {});
});
}
return reduceFieldsToValues(siblingFields, true);
return unflatten(siblingFields, { safe: true });
};
export default getSiblingData;

View File

@@ -1,5 +1,5 @@
import { unflatten as flatleyUnflatten } from 'flatley';
import { Fields, Data } from './types';
import { Data, Fields } from './types';
const reduceFieldsToValues = (fields: Fields, unflatten?: boolean): Data => {
const data = {};
@@ -11,8 +11,7 @@ const reduceFieldsToValues = (fields: Fields, unflatten?: boolean): Data => {
});
if (unflatten) {
const unflattened = flatleyUnflatten(data, { safe: true });
return unflattened;
return flatleyUnflatten(data, { safe: true });
}
return data;