Repository URL to install this package:
|
Version:
1.2.20 ▾
|
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