remix-validated-form
Version:
Form component and utils for easy form validation in remix
77 lines (76 loc) • 3.18 kB
JavaScript
import { useMemo } from "react";
import { useInternalFormContext, useClearError, useSetTouched, useDefaultValuesForForm, useFieldErrorsForForm, useInternalIsSubmitting, useInternalHasBeenSubmitted, useTouchedFields, useInternalIsValid, useFieldErrors, useValidateField, useValidate, useSetFieldErrors, useResetFormElement, useSyncedDefaultValues, useFormActionProp, useFormSubactionProp, useSubmitForm, useFormValues, } from "../internal/hooks";
/**
* Returns information about the form.
*
* @param formId the id of the form. Only necessary if being used outside a ValidatedForm.
*/
export const useFormState = (formId) => {
const formContext = useInternalFormContext(formId, "useFormState");
const isSubmitting = useInternalIsSubmitting(formContext.formId);
const hasBeenSubmitted = useInternalHasBeenSubmitted(formContext.formId);
const touchedFields = useTouchedFields(formContext.formId);
const isValid = useInternalIsValid(formContext.formId);
const action = useFormActionProp(formContext.formId);
const subaction = useFormSubactionProp(formContext.formId);
const syncedDefaultValues = useSyncedDefaultValues(formContext.formId);
const defaultValuesToUse = useDefaultValuesForForm(formContext);
const hydratedDefaultValues = defaultValuesToUse.hydrateTo(syncedDefaultValues);
const fieldErrorsFromState = useFieldErrors(formContext.formId);
const fieldErrorsToUse = useFieldErrorsForForm(formContext);
const hydratedFieldErrors = fieldErrorsToUse.hydrateTo(fieldErrorsFromState);
return useMemo(() => ({
action,
subaction,
defaultValues: hydratedDefaultValues,
fieldErrors: hydratedFieldErrors !== null && hydratedFieldErrors !== void 0 ? hydratedFieldErrors : {},
hasBeenSubmitted,
isSubmitting,
touchedFields,
isValid,
}), [
action,
hasBeenSubmitted,
hydratedDefaultValues,
hydratedFieldErrors,
isSubmitting,
isValid,
subaction,
touchedFields,
]);
};
/**
* Returns helpers that can be used to update the form state.
*
* @param formId the id of the form. Only necessary if being used outside a ValidatedForm.
*/
export const useFormHelpers = (formId) => {
const formContext = useInternalFormContext(formId, "useFormHelpers");
const setTouched = useSetTouched(formContext);
const validateField = useValidateField(formContext.formId);
const validate = useValidate(formContext.formId);
const clearError = useClearError(formContext);
const setFieldErrors = useSetFieldErrors(formContext.formId);
const reset = useResetFormElement(formContext.formId);
const submit = useSubmitForm(formContext.formId);
const getValues = useFormValues(formContext.formId);
return useMemo(() => ({
setTouched,
validateField,
clearError,
validate,
clearAllErrors: () => setFieldErrors({}),
reset,
submit,
getValues,
}), [
clearError,
reset,
setFieldErrors,
setTouched,
submit,
validate,
validateField,
getValues,
]);
};