Stoopy
Install
yarn add stoopy
Usage
Check the samples.
API
fields
Ex:
;[
'field1',
{ name: 'field2', label: 'Second Field', type: 'field' },
]
Here is where you define your form itself.
It must be an Array
, as the order of the inputs is the order in which fields steps will be shown.
If the element is a string, it will become a text field, using the string as field
name and label (Capitalized).
Most commonly, you will use the field object. It uses react-use-form-state under the hood, so bellow are all the available
options:
field object
This are all available options:
{ name: 'name',
label: 'label',
type: 'fieldType',
optional: true,
choices: ['choice1', { value: 'choice2', label: 'differentName' }],
Component: ({ value, setValue, color }) => (
<input
value={value}
onChange={setValue}
color={color}
/>
),
onChange: func,
onBlur: func,
validate: func,
validateOnBlur: boolean,
touchOnChange: boolean,
other: 'props'
}
type
Those are all the currently available types, some are custom types, some have extra config on top of
react-use-form-state
field types. Besides them, you can always use the ones listed here and provide a custom component to work with them.
initialState
Ex: { field1: 'value'}
With this prop you can provide a initialState to your form.
This is useful, for instance, if you want to save each step on your backend and allow your user to continue from where he stopped on a different session.
Those values will still be considered in step/progress counting.
onNext
Ex: ({ value, values }) => doSomething(value) // or doSomething(values)
Function to be called every time a step is submited. It receives an object with two parameters,
value
and values
. value
is the current step's input value, while values
includes the values of all steps so far.
onEnd
Ex: values => doSomething(values)
A function to be called after the last step is submited. It receives an object
with the values from all fields of the form.
saving
Ex: true|false
When true, Stoopy will display a loading animation instead of the form. For instance, if your onNext/onEnd functions perform http requests to save the data somewhere else, you should set saving
to true when the request begins, and back to false when its done.
onProgress
Ex: ({ currentStep, totalSteps }) => showProgress(currentStep, totalSteps)
A function to be called everytime progress changes. You can also directly provide an custom progress tracker to layout (see bellow),
but if you need to take this info somewhere else, you use onProgress
prop.
layout
Ex: { ProgressTracker: CustomProgressTracker, NextButton: CustomNextButton}
or
Ex: ({ CurrentField, nextProps, BackProps, progress, saving }) => // your layout goes here
This prop works in two diferent ways:
- If you provide it an object, you can override the default components with your own. Check here for the full list.
- If you need, however, more customization, you can provide it with a component (a render prop) that
receives four props:
CurrentField
: Where the current input will be shown. You can optionally provide it with an customInputs
prop, an object override the defaults
inputs. Ex: <CurrentField customInputs={{ radioInput: CustomRadioInput, ...}}
/>nextProps
: An object containing necessary props for your next button to work properly.backProps
: An object containing necessary props for your back button to work properly.progress
: Same progress object received by onProgress, with currentStep
and totalSteps
.saving
: Loading state provided in saving
Bellow you can check which are all the default components you can override within your layout object
layout object
FormHeader
: Component that stays on top of the form, receives same progress
object received by onProgress.ProgressTracker
: Self explaining, also receives the same progress
object.Loading
: Component to show when saving is set to true
.NextButton
: Component for submitting the current step. Receives a nextProps
object with props needed (actually, for now just a type=submit
).BackButton
: Component for submitting the current step. Receives a backProps
object with props needed (onClick).customInputs
: An object where you can override all default inputs. See the full list bellow
default inputs
Those are the currently available defaults:
TextInput
SelectInput
RadioInput
CheckboxInput
title
Ex: "Complete this great form!"
A string to be used as title on top of the form.
Children
Ex: () => <h1>Congrats, you just finished this form!</h1>
When there are no more fields, stoopy will render the children. If none is provided, it renders nothing (null
).
License
MIT © Seasoned