@modular-forms/react
Version:
The modular and type-safe form library for React
65 lines (64 loc) • 2.48 kB
JavaScript
import { batch } from '@preact/signals-react';
import { useEffect } from 'react';
import { reset } from '../methods';
import { getUniqueId, updateFormState } from '../utils';
export function useLifecycle({ of: form, name, store, validate, validateOn, revalidateOn, transform, keepActive = false, keepState = true, }) {
useEffect(() => {
// Add validation functions
store.validate = validate
? Array.isArray(validate)
? validate
: [validate]
: [];
// Set validation mode overrides
store.validateOn = validateOn;
store.revalidateOn = revalidateOn;
// Add transformation functions
if ('transform' in store) {
store.transform = transform
? Array.isArray(transform)
? transform
: [transform]
: [];
}
}, [store, transform, validate, validateOn, revalidateOn]);
useEffect(() => {
// Create unique consumer ID
const consumer = getUniqueId();
// Add consumer to field
store.consumers.add(consumer);
// Mark field as active and update form state if necessary
if (!store.active.peek()) {
batch(() => {
store.active.value = true;
updateFormState(form);
});
}
// On cleanup, remove consumer from field
return () => {
setTimeout(() => {
store.consumers.delete(consumer);
// Mark field as inactive if there is no other consumer
batch(() => {
if (!keepActive && !store.consumers.size) {
store.active.value = false;
// Reset state if it is not to be kept
if (!keepState) {
reset(form, name);
// Otherwise just update form state
}
else {
updateFormState(form);
}
}
});
// Remove unmounted elements
if ('elements' in store) {
store.elements.value = store.elements
.peek()
.filter((element) => element.isConnected);
}
});
};
}, [form, name, store, keepActive, keepState]);
}