import {Field} from "react-final-form"; import React, {ReactChildren, ReactNode, SFC} from "react"; import {OnChange} from 'react-final-form-listeners' import _ from 'lodash' import {NonIdealState} from "@blueprintjs/core"; import {Namespace} from "react-namespaces"; export const WhenFieldChanges = ({field, becomes, set, to}) => ( {( // No subscription. We only use EntityField to get to the change function {input: {onChange}} ) => ( {value => { if (value === becomes) { onChange(to) } }} )} ) export const Inject = ({name, value}: { name: string, value: Object }) => { return {( {input: {onChange, value: oldValue}} ) => { if (!_.isEqual(oldValue, value)) { // console.log('Injected', JSON.stringify(oldValue), JSON.stringify(value)); setTimeout(() => onChange(value)) } return null }} } export const FieldValue = ({name, nullable = false, children}: { name: string, nullable?: boolean, children: (value: Object) => JSX.Element }) => { return {({input: {value}}) => { if(!nullable && (value == "" || value == null)) return // console.log('reading field', name, JSON.stringify(value)); return children(value) }} } const LocalFieldFactory = ({fieldComponent: FieldComponent = Field}) => ({children, name}) => { return {(namespace) => { return {(field) => { return children(field) }} }} } export const LocalField = LocalFieldFactory({fieldComponent: Field}) export const LocalFieldValue = LocalFieldFactory({fieldComponent: FieldValue}) // export const TwoFields = ({children}) => { // let extract2 = ({f1, f2}) => // {(f3) => { // return children({f1, f2, f3}) // }} // ; // let extract = ({f1}) => // {(f2) => { // return extract2({f1, f2}) // }} // ; // return // {(f1) => { // return extract({f1}) // }} // // } // export const ThreeFields = ({children}) => { // let extract2 = (fields) => // {(f3) => { // return children({...fields, f3}) // }} // ; // let extract = (fields) => // {(f2) => { // return extract2({...fields, f2}) // }} // ; // return // {(f1) => { // return extract({f1}) // }} // // } // export const Fields = ({names, children}: { names: string[], children: (props) => (fields) => Element }) => { // const Composed = names.reduce((pv, name, i, iv) => // ({children, ...rest}) => // {(field) => { // return children({[name]: field, ...rest}) // }} // , children) // return Composed // }