Skip to content

Instantly share code, notes, and snippets.

View erikras's full-sized avatar

Erik Rasmussen erikras

View GitHub Profile
@erikras
erikras / arrays.js
Last active December 3, 2017 16:21
🏁 Final Form Arrays
import { createForm } from 'final-form'
import arrayMutators from 'final-form-arrays'
// Create Form
const form = createForm({
mutators: {
// potentially other mutators here
...arrayMutators
},
onSubmit
@erikras
erikras / final-form-calculate-usage.js
Created December 11, 2017 10:52
Usage example of final-form-calculate
import { createForm } from 'final-form'
import createDecorator from 'final-form-calculate'
// Create Form
const form = createForm({ onSubmit })
// Create Decorator
const decorator = createDecorator(
// Calculations:
{
@erikras
erikras / final-form-set-field-data-usage.js
Created December 11, 2017 11:00
Usage example for final-form-set-field-data.
import { createForm } from 'final-form'
import setFieldData from 'final-form-set-field-data'
// Create Form
const form = createForm({
mutators: { setFieldData },
onSubmit
})
form.mutators.setFieldData('firstName', { awesome: true })
@erikras
erikras / warning-engine.js
Created December 11, 2017 11:17
A warning engine implemented in 🏁 React Final Form
const WarningEngine = ({ mutators: { setFieldData } }) => (
// FormSpy lets you listen to any part of the form state you want.
// If you provide an onChange prop, FormSpy will not render to the DOM.
<FormSpy
subscription={{ values: true }}
onChange={({ values }) => {
setFieldData('firstName', {
warning: values.firstName ? undefined : 'Recommended'
})
setFieldData('lastName', {
@erikras
erikras / finalFormFocus.jsx
Last active March 19, 2018 19:31
🏁 Final Form Focus 🧐
import React from 'react'
import { Form, Field } from 'react-final-form
import createDecorator from 'final-form-focus'
const focusOnErrors = createDecorator()
...
<Form
onSubmit={submit}
decorators={[ focusOnErrors ]} // <--------- 😎
validate={validate}
@erikras
erikras / WhenFieldChanges.js
Created March 22, 2018 15:35
Example of how to use Redux Final Form Listener OnChange
const WhenFieldChanges = ({ field, becomes, set, to }) => (
<Field name={set} subscription={{}}>
{(
// No subscription. We only use Field to get to the change function
{ input: { onChange } }
) => (
<OnChange name={field}>
{value => {
if (value === becomes) {
onChange(to)
<MakeAsyncFunction
listener={promiseListener}
start="START_ACTION_TYPE" // the type of action to dispatch when this function is called
resolve="RESOLVE_ACTION_TYPE" // the type of action that will resolve the promise
reject="REJECT_ACTION_TYPE" // the type of action that will reject the promise
>{asyncFunc => (
<SomeFormLibrary onSubmit={asyncFunc}>
...
@erikras
erikras / focusOnFirstError.js
Created March 18, 2018 11:15
A function to call focus() on the first form input that has an error
function focusOnFirstError(formName, hasError) {
const form = document.forms[formName]
for (let i = 0; i < form.length; i++) {
if (hasError(form[i].name)) {
form[i].focus()
break
}
}
}
@erikras
erikras / example.js
Created August 29, 2016 16:13
Redux Form v5 -> v6 Migration Hint
/*
* As I have been migrating a project from redux-form v5 to v6, I have come across this useful pattern.
*
* I have many such "custom inputs and errors beside them" structures around my app.
*/
// v5 code
<div>
<MyCustomInputThing
{...myField}
@erikras
erikras / redux-dead-drop-example.js
Last active April 25, 2019 20:34
Redux Dead Drop Example
componentWillReceiveProps(nextProps) {
if(!this.props.deadDrop && nextProps.deadDrop) {
// dispatch an action to clear the value
this.props.clearDeadDrop()
// do what your case officer has instructed, Agent
this.performOperation(nextProps.deadDrop)
}
}