Home Reference Source

src/components/widgets/Form/ReduxField.jsx

import React from 'react';
import PropTypes from 'prop-types';
import { Field as ReduxFormField } from 'redux-form';
import StandardField from '../../widgets/Form/fields/StandardField/StandardField';
import withFieldContainer from '../../widgets/Form/fields/withFieldContainer';
import { compose, withProps } from 'recompose';
import { some } from 'lodash';
import withObserveDependency from '../../../core/dependencies/withObserveDependency';

const config = {
  onChange: function({ dependency }, dependencyType) {
    if (!this.controlRef) return;
    const { _fetchData, size, labelFieldId } = this.controlRef.props;
    let haveReRenderDependency = some(dependency, { type: dependencyType });
    if (haveReRenderDependency) {
      _fetchData({
        size,
        [`sorting.${labelFieldId}`]: 'ASC',
      });
    }
  },
};

/**
 * Поле для {@link ReduxForm}
 * @reactProps {number} id
 * @reactProps {node} component - компонент, который оборачивает поле. Дефолт: {@link StandardField}
 * @see https://redux-form.com/6.0.0-alpha.4/docs/api/field.md/
 * @example
 *
 */
class ReduxField extends React.Component {
  /**
   *Базовый рендер
   */
  constructor(props) {
    super(props);

    this.setRef = this.setRef.bind(this);
    this.Field = compose(
      withProps(() => ({
        setReRenderRef: props.setReRenderRef,
      })),
      withFieldContainer
    )(props.component);
  }

  setRef(el) {
    this.controlRef = el;
  }

  render() {
    return (
      <ReduxFormField
        name={this.props.id}
        {...this.props}
        component={this.Field}
        setRef={this.setRef}
      />
    );
  }
}

ReduxField.contextTypes = {
  store: PropTypes.object,
};

ReduxField.defaultProps = {
  component: StandardField,
};

ReduxField.propTypes = {
  id: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
  component: PropTypes.oneOfType([
    PropTypes.string,
    PropTypes.func,
    PropTypes.node,
  ]),
};

export default withObserveDependency(config)(ReduxField);