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
// }