:atom: Very opinionated reusable components (some binded to final-form exclusively) https://www.npmjs.com/package/@inovando/react-components
Very opinionated reusable components (some binded to final-form exclusively)
@inovando/react-components"">
npm install --save @inovando/react-components# oryarn add @inovando/react-components
<Upload ></Upload>
import React, { Component } from "react";import { Upload } from "@inovando/react-components";import "@inovando/react-components/dist/index.css";const App = () => {const [files, setFiles] = useState([]);return (<UploadonChange={(files) => {setFiles(files);}}value={files}// This overrides "locale" proplabel="Arraste arquivos ou clique aqui para fazer upload"// Only "pt" or "en" yet, defaults to "pt"locale="pt"// Accept file type range (Optional)// https://react-dropzone.js.org/#section-accepting-specific-file-typesaccept="image/*"// in mb (Optional)maxSize={3}// custom style for containerstyle={{ margin: '0 auto', maxWidth: 400 }}/>);};
npm install --save final-form react-final-form# oryarn add final-form react-final-form
<UploadField ></UploadField> (based on React Dropzone)
import React from 'react';import { Form, Field } from 'react-final-form';import { UploadField } from '@inovando/react-components';import '@inovando/react-components/dist/index.css';function ExampleForm() {const onSubmit = values => {console.log('values:', values)}return (<FormonSubmit={onSubmit}initialValues={{files: [],}}render={({ handleSubmit, submitting }) => (<form onSubmit={handleSubmit} noValidate><Fieldname="files"component={UploadField}label="Arraste arquivos ou clique aqui para fazer upload"validate={(value) =>value.length ? undefined : 'Campo obrigatório'}/><button disabled={submitting} type="submit">submit</button></form>)}/>);}
<MoneyField ></MoneyField> (based on React Number Format)
import React from 'react';import { Form, Field } from 'react-final-form';import { MoneyField } from '@inovando/react-components';import '@inovando/react-components/dist/index.css';function ExampleForm() {const onSubmit = values => {console.log('values:', values)}return (<FormonSubmit={onSubmit}initialValues={{money: 0.5,}}render={({ handleSubmit, submitting }) => (<form onSubmit={handleSubmit} noValidate><Fieldname="money"component={MoneyField}fullWidthmargin="normal"variant="outlined"label="Valor (R$)"validate={(value) => (value ? undefined : 'Campo obrigatório')}/><button disabled={submitting} type="submit">submit</button></form>)}/>);}
<AutocompleteField ></AutocompleteField> (based on Material-UI Autocomplete)
import React from 'react';import { Form, Field } from 'react-final-form';import { AutocompleteField } from '@inovando/react-components';import '@inovando/react-components/dist/index.css';const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));function ExampleForm() {const [loading, setLoading] = useState(false);const onSubmit = values => {console.log('values:', values)}return (<FormonSubmit={onSubmit}render={({ handleSubmit, submitting }) => (<form onSubmit={handleSubmit} noValidate><Fieldname="state"component={AutocompleteField}fullWidthmargin="normal"variant="outlined"label="Estado"options={[{ label: 'Paraná', value: 'PR'},// ...]}handleChange={(value) => {console.log('value:', value);}}onSearch={async (text) => {setLoading(true);await sleep(1000);setLoading(false);}}kind="value" // expects "initialValue" as anything but an object, defaults to "object"delay={500} // "onSearch" debounce delay in ms, defaults to 250loading={loading}validate={(value) => (value ? undefined : 'Campo obrigatório')}/><button disabled={submitting} type="submit">submit</button></form>)}/>);}
<DateField ></DateField> (based on Material-UI Pickers)
import React from 'react';import { Form, Field } from 'react-final-form';import { DateField } from '@inovando/react-components';import '@inovando/react-components/dist/index.css';// Material-UI Pickers Dependenciesimport { MuiPickersUtilsProvider } from '@material-ui/pickers';import DateFnsUtils from '@date-io/date-fns';import ptLocale from 'date-fns/locale/pt';const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));function ExampleForm() {const [loading, setLoading] = useState(false);const onSubmit = values => {console.log('values:', values)}return (// this tag can be at your global scope, such as "App.js"<MuiPickersUtilsProvider utils={DateFnsUtils} locale={ptLocale}><FormonSubmit={onSubmit}render={({ handleSubmit, submitting }) => (<form onSubmit={handleSubmit} noValidate><Fieldname="dataInicio"component={DateField}minDate={new Date()} // final-form validation logic must be at "validate" propfullWidthmargin="normal"variant="outlined"label="Data de início"validate={(value) =>value && isBefore(subDays(new Date(), 1), parseISO(value))? undefined: 'Campo inválido'}/><button disabled={submitting} type="submit">submit</button></form>)}/></MuiPickersUtilsProvider>);}
MIT © inovando