useForm

Full form management hook with validation, error tracking, and submit handling.

import { useForm, required, email } from "@allem-sdk/forms";

Config

Pass an object where each key is a field name. Each field takes:

PropertyTypeDescription
initialValueTInitial value for the field
rulesValidationRule[]Array of validation rules

Return value

PropertyTypeDescription
valuesTCurrent form values
errorsPartial<Record<keyof T, string>>Validation errors per field
touchedPartial<Record<keyof T, boolean>>Which fields have been blurred
isValidbooleanTrue when no errors
isSubmittingbooleanTrue during async submit
setValue(field, value) => voidSet a field value
setTouched(field) => voidMark field as touched
validate() => booleanValidate all fields
handleSubmit(onSubmit) => handlerReturns form submit handler
reset() => voidReset to initial values
getFieldProps(field) => propsReturns value, onChange, onBlur, name

Usage

const form = useForm({
  name: { initialValue: "", rules: [required()] },
  email: { initialValue: "", rules: [required(), email()] },
  age: { initialValue: 0, rules: [min(18, "Must be 18+")] },
});

const onSubmit = async (values) => {
  await fetch("/api/contact", {
    method: "POST",
    body: JSON.stringify(values),
  });
};

<form onSubmit={form.handleSubmit(onSubmit)}>
  <input {...form.getFieldProps("name")} />
  {form.touched.name && form.errors.name && (
    <span>{form.errors.name}</span>
  )}

  <input {...form.getFieldProps("email")} />
  <input type="number" {...form.getFieldProps("age")} />

  <button type="submit" disabled={form.isSubmitting}>
    Send
  </button>
  <button type="button" onClick={form.reset}>Reset</button>
</form>