Skip to content

Commit 4ce9b00

Browse files
committed
fix: remove options from fields
1 parent a72981b commit 4ce9b00

2 files changed

Lines changed: 32 additions & 1 deletion

File tree

core/vibes/soul/form/dynamic-form/index.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import { Textarea } from '@/vibes/soul/form/textarea';
3737
import { Button, ButtonProps } from '@/vibes/soul/primitives/button';
3838

3939
import { Field, FieldGroup, PasswordComplexitySettings, schema } from './schema';
40+
import { removeOptionsFromFields } from './utils';
4041

4142
type Action<F extends Field, S, P> = (
4243
fields: Array<F | FieldGroup<F>>,
@@ -79,7 +80,11 @@ export function DynamicForm<F extends Field>({
7980
onSuccess,
8081
passwordComplexity: defaultPasswordComplexity,
8182
}: DynamicFormProps<F>) {
82-
const actionWithFields = action.bind(null, fields);
83+
// Remove options from fields before passing to action to reduce payload size
84+
// Options are only needed for rendering, not for processing form submissions
85+
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
86+
const fieldsWithoutOptions = removeOptionsFromFields(fields) as Array<F | FieldGroup<F>>;
87+
const actionWithFields = action.bind(null, fieldsWithoutOptions);
8388

8489
const [{ lastResult, successMessage, passwordComplexity }, formAction] = useActionState(
8590
actionWithFields,
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import { Field, FieldGroup } from './schema';
2+
3+
function removeOptionsFromField<T extends Field>(field: T) {
4+
// Only remove the options property if it exists on the field
5+
if ('options' in field) {
6+
// Type assertion is used because not all Field types have 'options'
7+
// and to satisfy TypeScript that we are only spreading valid props
8+
const { options, ...fieldWithoutOptions } = field;
9+
10+
return fieldWithoutOptions;
11+
}
12+
13+
return field;
14+
}
15+
16+
export function removeOptionsFromFields<F extends Field>(fields: Array<F | FieldGroup<F>>) {
17+
return fields.map((field) => {
18+
if (Array.isArray(field)) {
19+
// Handle field groups (arrays of fields)
20+
return field.map(removeOptionsFromField);
21+
}
22+
23+
// Handle individual fields
24+
return removeOptionsFromField(field);
25+
});
26+
}

0 commit comments

Comments
 (0)