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/modules / ___dist / observable-utils / deps / multiContainerFactory.tsx
Size: Mime:
import { observer } from 'xmobx/mobx-react'
import { hasOwnProp } from 'chain-able-boost'
import { isFunction } from 'exotic'
import decorateComponentStatics from './decorateComponentStatics'
import injectContextWith from './injectContextWith'
import { getInstance } from './registryWeakMap'

/**
 * @type {ClassDecorator}
 *
 * @param {Class} Klass klass to build
 * @param {React.ClassComponent} [Target=undefined] ComponentClass if undefined, returns curried factoruy
 * @return {React.ClassComponent}
 */
function multiContainerFactory(Klass, Target) {
  /**
   * @description if only 1 arg, returns @curried factoruy
   */
  if (arguments.length === 1) {
    return function curriedMultiContainerFactory(CurriedTarget) {
      return multiContainerFactory(Klass, CurriedTarget)
    }
  }

  /**
   * @description check if Target already has a container
   * @note we do not want to call the function, so we check if it has a property
   */
  // if (hasOwnProp(Target.prototype, 'container')) {
  //   console.warn('already has a container!', {Klass, Target})
  //   return Target
  // }

  class _ViewInsideContainer extends Target {
    /**
     * @private
     * @description a container instance unique for each container with no garbage collector impact
     * @example constructor(props) { super(props); this.container = getInstance(this); }
     * @return {DropdownStore}
     */
    get container() {
      return getInstance(Klass, this)
    }
  }

  let ViewInsideContainer = _ViewInsideContainer

  // use the mapper
  if (isFunction(ViewInsideContainer.injectionMap)) {
    const injectMap = injectContextWith(ViewInsideContainer.injectionMap)
    ViewInsideContainer = injectMap(_ViewInsideContainer)
  }

  /**
   * @description inject static props
   */
  decorateComponentStatics(ViewInsideContainer, Target)

  /**
   * @description check if it's already observable
   */
  const ObservableView =
    ViewInsideContainer.isMobXReactObserver === true
      ? ViewInsideContainer
      : observer(ViewInsideContainer)

  return ObservableView
}

export { multiContainerFactory }
export default multiContainerFactory