UNPKG

pagamio-frontend-commons-lib

Version:

Pagamio library for Frontend reusable components like the form engine and table container

86 lines (85 loc) 3.54 kB
import { jsx as _jsx } from "react/jsx-runtime"; import { Controller } from 'react-hook-form'; import { useMemo } from 'react'; import { getInputComponent } from '../registry'; const FieldWrapper = ({ field, control, errors, layout, onFieldUpdate, setValue, clearErrors, updateFieldOptions, updataFieldLabel, setFieldHidden, addField, }) => { const InputComponent = getInputComponent(field.type); const wrapperClass = useMemo(() => { if (layout === 'horizontal') { return 'w-1/2 px-4'; } return `col-span-${field?.gridSpan ?? '12'}`; }, [layout, field?.gridSpan]); if (!InputComponent) { console.error(`No component registered for type: ${field.type}`); return null; } const handleFieldChange = async (value, onChange, onChangeField) => { onChange(value); if (onChangeField) { onChangeField(value); } if (onFieldUpdate?.[field.name]) { try { const updates = onFieldUpdate[field.name]; await processFieldUpdates(updates, value); } catch (error) { console.error(`Error updating dependent fields for ${field.name}:`, error); } } }; const processFieldUpdates = async (updates, value) => { for (const update of updates) { const result = await update.action(value); if (result) { handleUpdateResult(result); } } }; const handleUpdateResult = (result) => { // Update options if provided if (result.options && updateFieldOptions) { updateFieldOptions(result.field, result.options); } // Update value if provided if (result.value !== undefined && setValue) { setValue(result.field, result.value); } // Update lable if provided if (result.label !== undefined && updataFieldLabel) { updataFieldLabel(result.field, result.label); } // Update hidden state based on hideField value if (result.hideField !== undefined && setFieldHidden) { setFieldHidden(result.field, result.hideField); // Clear field value if it's being hidden if (result.hideField && setValue) { setValue(result.field, undefined); } } // Re-add field if provided if (result.fieldInnitialData && addField) { addField(result.fieldInnitialData); } // Clear validation errors for dependent fields if (clearErrors) { clearErrors(result.field); } }; if (field.name === 'email') { field.validation = { ...field.validation, pattern: { value: /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/, message: 'Please enter a valid email address', }, }; } // Skip rendering if field is hidden if (field.isHidden) { return null; } return (_jsx("div", { className: `${wrapperClass} mb-2`, children: _jsx(Controller, { name: field.name, control: control, rules: field.validation, render: ({ field: inputProps }) => (_jsx("div", { className: "flex flex-col", children: _jsx(InputComponent, { ...inputProps, field: field, error: errors[field.name], onChange: (value) => handleFieldChange(value, inputProps.onChange, field?.onChange), options: field.options ?? [] }) })) }) })); }; export default FieldWrapper;