UNPKG

lynx-form-x

Version:

LynxFormX is a lightweight and intuitive form library built for the Lynx framework for mobile development. It streamlines form management by automatically binding fields, handling validation, and providing easy-to-use hooks for custom field manipulation—a

247 lines (187 loc) 6.74 kB
# LynxFormX LynxFormX is a lightweight and intuitive form library built for the Lynx framework for mobile development. It streamlines form management by automatically binding fields, handling validation, and providing easy-to-use hooks for custom field manipulation—all with strong TypeScript support. --- ## Features - **Declarative API:** Define forms with `<Form>`, bind inputs with `<Field>`, show errors with `<Error>`, and submit with `<SubmitButton>`. - **Validation Options:** - **Zod Schema:** Use a Zod schema for validation by providing the `schema` prop (only accepts Zod). - **Custom Validation:** Alternatively, pass a `validation` function that returns an object with field names as keys and error messages as values. - **Flexible Submission:** The `onSubmit` function receives form values as the first parameter, and a helpers object with `setValue` and `setError` functions as the second parameter, enabling you to update values and set errors for any field. - **Type-Safe Forms:** Form structure is inferred from `initialValues` (optional) or provided via generics (e.g., `<Form<FormValues>>`). Unlike Formik, you do not need to supply `initialValues` to define the form structure—the structure is formed by the `<Field>` components. - **Custom Field Manipulation:** For more advanced use cases, use the `useField` hook to access a field's `value`, `error`, `touched` status, and helper functions `setValue` and `setError` for granular control. - **Smart Submit Button:** `<SubmitButton>` optionally accepts `disableOnSubmit` and `disabledClassName` props. It automatically performs validation and triggers `onSubmit` upon successful validation. - **Standard Attribute Forwarding:** All components pass standard attributes to their underlying tags: - **Form** forwards props to `<view>` - **SubmitButton** forwards props to `<view>` - **Error** forwards props to `<text>` - **Field** forwards props to `<input>` --- ## Installation Install LynxFormX via npm: ```bash npm install lynx-form-x ``` --- ## Usage ### Basic Form Example Below is a basic example using a Zod schema for validation: ```tsx import { z } from 'zod'; import { Form, Field, Error, SubmitButton } from 'lynx-form-x'; interface FormValues { login: string; password: string; } const schema = z.object({ login: z.string().nonempty('Enter login'), password: z.string().nonempty('Enter password'), })); export function App() { return ( <Form<FormValues> schema={schema} onSubmit={async (values, { setValue, setError }) => { console.log(values); // Perform submission logic here await new Promise((resolve) => setTimeout(resolve, 1000)); }} > <Field name="login" /> <Error name="login" /> <Field name="password" /> <Error name="password" /> <SubmitButton className="button" disableOnSubmit disabledClassName="disabled" > Submit </SubmitButton> </Form> ); } ``` ### Using Custom Validation Function If you prefer a custom validation function, simply pass it as the `validation` prop: ```tsx import {Form, Field, Error, SubmitButton, Errors} from 'lynx-form-x' interface FormValues { email: string username: string } const customValidation = (values: FormValues) => { const errors: Errors<FormValues> = {} if (!values.email.includes('@')) { errors.email = 'Invalid email address' } if (values.username.length < 3) { errors.username = 'Username must be at least 3 characters' } return errors } export function App() { return ( <Form<FormValues> validation={customValidation} onSubmit={(values, {setValue, setError}) => { console.log(values) }} > <Field name='email' /> <Error name='email' /> <Field name='username' /> <Error name='username' /> <SubmitButton className='button' disableOnSubmit disabledClassName='disabled' > Submit </SubmitButton> </Form> ) } ``` ### Advanced Usage with `useField` For more granular control over individual fields, use the `useField` hook: ```tsx import {useField} from 'lynx-form-x' interface FormValues { firstName: string lastName: string } export function CustomInput({name}: {name: keyof FormValues}) { const {value, error, touched, setValue, setError} = useField(name) // some custom logic return ( <view> <Field name={name} /> {error && touched && <text>{error}</text>} /* some custom layout */ </view> ) } export function App() { return ( <Form<FormValues> onSubmit={(values) => { console.log(values) }} > <CustomInput name='firstName' /> <CustomInput name='lastName' /> <SubmitButton>Submit</SubmitButton> </Form> ) } ``` --- ## API Reference ### `<Form>` - **Props:** - `initialValues?`: _(optional)_ Object with initial form values. - `schema?`: _(optional)_ A Zod schema used for validation. - `validation?`: _(optional)_ A custom validation function. Should return an object where keys are field names and values are error messages. - `onSubmit`: Function called on form submission. Receives two arguments: 1. `values`: The current form values. 2. `helpers`: An object containing `setValue` and `setError` functions to update any field. ### `<Field>` - **Props:** - `name`: The field name. The library binds the input to this name in the form state. ### `<Error>` - **Props:** - `name`: The field name to display an error for. ### `<SubmitButton>` - **Props:** - `disableOnSubmit?`: _(optional)_ If true, disables the button during form submission. - `disabledClassName?`: _(optional)_ CSS class applied when the button is disabled. - **Behavior:** - Automatically validates the form and triggers `onSubmit` upon successful validation. ### `useField` Hook - **Usage:** - Accepts a field name. - Returns an object with: - `value`: Current field value. - `error`: Current field error. - `touched`: Whether the field has been touched. - `setValue`: Function to update the field value. - `setError`: Function to update the field error. --- ## Contributing Contributions, issues, and feature requests are welcome! Feel free to check [issues page](https://github.com/linqeee/lynx-form-x/issues). --- ## License MIT --- Enjoy building forms with **LynxFormX**! If you have any questions or feedback, please open an issue or contact the maintainer. --- _This README is a starting point—feel free to customize and enhance the examples and documentation to better fit your project needs!_