import React from "react"; import { render } from "react-dom"; import debounce from "./debounce"; import { Form, InputGroup } from "Form"; const XHR_TIMEOUT = 1000, MONTHS = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ]; async function onSubmit( form ) { try { let rsp = await fetch( `server-response.json` ).then( rsp => rsp.json() ); if ( !rsp.ok ) { form.setError( rsp.exception.message ); } } catch( e ) { form.setError( "Server error" ); } }; // Debounce for 50ms const onInput = debounce(( e, inputGroup, form ) => { // Update state only of input group in focus inputGroup.checkValidityAndUpdate(); // Update "valid" property of the form form.checkValidityAndUpdate(); }, 50 ); const onShowErrors = ( e, form ) => { e.preventDefault(); form.checkValidityAndUpdateInputGroups(); }; const validateDateTime = ( input ) => { if ( input.current.value === "Choose..." ) { input.setCustomValidity( `Please select ${input.current.title}` ); return false; } return true; }; const MyForm = props => (
{({ error, valid, pristine, submitting, submitted, form }) => (

Demo Form

Form validity:   { valid ? valid : at least one input in invalid state

{ error && (
Oh snap! {error}
) } { submitted && !error && (
Thanks for submitting!
) }
{({ error, valid }) => (
{ error && (
{error}
) } Group validates on submit event
)}
{({ error, valid, inputGroup }) => (
onInput( e, inputGroup, form ) } placeholder="Enter first name"/> { error && (
{error}
) } Group validates as you are typing
)}
{ if ( !input.current.value.startsWith( "DE" ) ) { input.setCustomValidity( "Code must start with DE." ); return false; } return true; } }}> {({ error, valid }) => (
{ error && (
{error}
) } Group validates on submit event
)}
{({ errors, valid }) => (
{ errors.map( ( error, key ) => (
{error}
)) } Group validates on submit event
)}
{({ error, valid }) => (
{ error && (
{error}
) }
{ error && (
{error}
) }
)}
{({ error, valid }) => (
{ error && (
{error}
) }
)}
)}
); render( , document.getElementById( "app" ) );