An open API service indexing awesome lists of open source software.

https://github.com/keajs/kea-forms


https://github.com/keajs/kea-forms

Last synced: about 1 month ago
JSON representation

Awesome Lists containing this project

README

        

[![NPM Version](https://img.shields.io/npm/v/kea-forms.svg)](https://www.npmjs.com/package/kea-forms)
[![minified](https://badgen.net/bundlephobia/min/kea-forms)](https://bundlephobia.com/result?p=kea-forms)
[![minified + gzipped](https://badgen.net/bundlephobia/minzip/kea-forms)](https://bundlephobia.com/result?p=kea-forms)
[![Backers on Open Collective](https://opencollective.com/kea/backers/badge.svg)](#backers)
[![Sponsors on Open Collective](https://opencollective.com/kea/sponsors/badge.svg)](#sponsors)

# kea-forms

This is an **experimental** plugin adding support for `forms` inside kea logic, with full TypeScript/TypeGen support.

## Installation

`kea-forms` requires kea-typegen `1.1.5+` and kea `2.4.5+`.

```bash
yarn add kea-forms
```

Set it up like all other kea plugins:

```ts
import { Provider, resetContext } from 'kea'
import { formsPlugin } from 'kea-forms'

resetContext({
plugins: [formsPlugin],
})
```

## Usage

Code like this:

```ts
import { kea } from 'kea-forms'
import { forms } from 'kea-forms'

export interface UserFormType {
name: string
email: string
}

export const formsLogic = kea>([
// ... actions, reducers, ...

forms({
userForm: {
defaults: {
name: '',
email: '',
} as UserFormType,
errors: (values) => ({
name: !values.name && 'Please enter a name',
email: !values.email
? 'Please enter an email'
: !validateEmail(values.email)
? 'Please enter a valid email'
: null,
}),
submit: (formValues) => {
console.log('submitting!', formValues)
},
showErrorsOnTouch: true,
alwaysShowErrors: false,
},
}),

// ... other listeners, etc
])
```

Produces the following actions and values:

```ts
interface formsLogicType {
actions: {
setUserFormValue: (key: string, value: any) => void
setUserFormValues: (values: Partial) => void
touchUserFormField: (key: string) => void
resetUserForm: (values?: UserFormType) => void
submitUserForm: () => void
submitUserFormRequest: (userForm: UserFormType) => void
submitUserFormSuccess: (userForm: UserFormType) => void
submitUserFormFailure: (error: Error) => void
}
values: {
userForm: UserFormType
userFormChanges: DeepPartial
userFormTouches: DeepPartialMap
isUserFormSubmitting: boolean
showUserFormErrors: boolean
userFormChanged: boolean
userFormTouched: boolean
userFormValidationErrors: DeepPartialMap
userFormHasErrors: boolean
userFormErrors: DeepPartialMap
isUserFormValid: boolean
}
}
```

Then use the provided `Form` and `Field` helpers inside your component:

```tsx
import { formsLogic } from './formsLogic'
import { useActions, useValues } from 'kea'
import { Form, Field } from 'kea-forms'

function MyForm() {
const { isUserFormSubmitting } = useValues(formsLogic)
const { setUserFormValue } = useActions(formsLogic)

return (


Demonstrating a simple form below




{/* "value" and "onChange" added automatically */}

setUserFormValue('guest', '')}>
No Guest

setUserFormValue('guest', 'Other Name')}>
Other Guest


{({ onChange, value }) => (

onChange(e.target.checked)} value={value} /> Subscribe to our
newsletter!!

)}






)
}
```

See the code in the `demo` folder for more.

## Coming next on the roadmap

- Async validation of fields
- Nested fields (e.g. arrays of objects in the form)