UNPKG

@modular-forms/react

Version:

The modular and type-safe form library for React

65 lines (64 loc) 2.48 kB
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]); }