import { createSelector } from 'reselect';
import {connect} from "react-redux"
import * as React from 'react';
import {isValid,isPristine,isSubmitting,hasSubmitSucceeded,InjectedFormProps, submit, reset} from "redux-form"
export let FormButton = (props:any)=>{
return
};
export type ButtonProps = {
disabled:boolean,
type:"submit"|"button",
onClick?:any,
children:any
}
export const submittable = (disableResubmit:boolean)=>(formState:Partial)=>{
const {valid,pristine,submitting,submitSucceeded} = formState
return valid && !pristine && !submitting && !(disableResubmit && submitSucceeded);
}
export function setButton(button: React.StatelessComponent){
FormButton = button;
}
interface InjectSubmittableOptions {
formName:string,
type:"submit"|"reset",
/**
* @deprecated disableResubmit, use submittable instead
*/
disableResubmit?:boolean
submittable?:(valid:boolean,pristine:boolean,submitting:boolean,submitSucceeded:boolean)=>boolean
}
export const injectSubmittable = (options:InjectSubmittableOptions)=>{
return (Button:React.StatelessComponent|React.ComponentClass)=>(connect as any)(
(_:any,p:any)=>{
return (createSelector as any)(
[
isValid(p.formName || options.formName),
isPristine(p.formName || options.formName),
isSubmitting(p.formName || options.formName),
hasSubmitSucceeded(p.formName || options.formName)
],
(valid:boolean,pristine:boolean,submitting:boolean,submitSucceeded:boolean)=>{
const disabled = options.submittable ?
!options.submittable(valid,pristine,submitting,submitSucceeded) :
!submittable(options.disableResubmit)({valid,pristine,submitting,submitSucceeded})
return {
formName:options.formName||p.formName,
disabled
}
}
)
}
)(class ConnectedButton extends React.PureComponent{
onClick=()=>{
this.props.dispatch(options.type==='submit'?submit(this.props.formName):reset(this.props.formName))
}
render(){
const {dispatch,formName,...rest} = this.props;
return
}
})
}