Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
@skava/forms / src / new-forms / OneForm / OneForm.tsx
Size: Mime:
// tslint:disable:max-classes-per-file

import * as React from 'react'
import { omit } from '@skava/utils'
import { isFunction } from 'exotic'
import { observable, action, computed, observe } from 'xmobx/mobx'
import { ObserverForm } from '../forms'
import { observer } from 'xmobx/mobx-react'
import { ValidationStrategyContext } from '../strategies'
import { InputState } from '../inputs'
import { PluginsContext, PluginsContextValue } from '../plugins/PluginsContext'
import { renderInput } from './renderInput'
import { fromObserverFormPropsToState } from './fromObserverFormPropsToState'
import { OneFormState } from './OneFormState'
import { OldObserverFormAdapter } from './adapters/ObserverForm'
import { OnPreFill } from './typings'
export { OneFormState } from './OneFormState'
export { resetInput } from '../forms/deps'
export { toFormState } from './toFormState'
export { OldObserverFormAdapter } from './adapters/ObserverForm'
export { OldInputConfigAdapter } from './adapters/ObserverInput'
export { renderInput } from './renderInput'

/**
 * this will adapt FormState & FormView for old & new
 * @invariant we won't need OneInput
 *            since previously there is no config for customizing input
 *            and almost all is in Form
 */
@observer
export class OneObserverForm<Props = {}> extends OldObserverFormAdapter<
  Props & { state: OneFormState; onPreFill?: OnPreFill }
> {
  static contextType = PluginsContext
  context: PluginsContextValue
  disposer: () => void

  /**
   * @todo remove this or see example of it
   */
  @computed
  get isToPreFill() {
    return this.props.state.formState.isToPreFill || false
  }

  // @todo @@strict componentDidMount...
  componentWillMount() {
    const { state } = fromObserverFormPropsToState(this.props)
    state.setInputPluginsList(this.context)
    this.makePreFill()
  }

  onPreFill?: OnPreFill
  componentDidMount() {
    // @note could bind... though this is only called ~once
    // @todo @@perf - not sure if we need as a prop...
    // @note - removed forceUpdate because it should not be needed
    this.disposer = observe(this, 'isToPreFill', () => {
      console.debug('[form] updated using preFill')
      this.makePreFill()
    })
  }

  makePreFill() {
    const onPreFill = this.onPreFill || this.props.onPreFill

    if (isFunction(onPreFill)) {
      this.props.state.inputsList.forEach(inputItemState => {
        onPreFill(inputItemState)
      })
    }
  }
  render() {
    const remainingProps = omit(this.props, ['state', 'inputsList'])
    const { state } = fromObserverFormPropsToState(this.props)

    // @todo - should provide only if it's not already provided
    // <ValidationStrategyContext.Provider value={}>
    return (
      <ObserverForm
        {...remainingProps}
        state={state}
        renderInput={renderInput}
      />
    )
  }
}