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/framework / src / bootstrapper / containers / Loadable / LoadableContext.ts
Size: Mime:
import React from 'react'
import { toComponentName } from '@skava/modules/___dist/identifier'
import { isObj, isPromise } from 'exotic'
import { ALL_INITIALIZERS, toExport } from './deps'
import { AsyncRequire } from './typings'

class LoadableContext<ResolvedType = typeof React.Component> {
  asyncRequire: AsyncRequire<ResolvedType>
  resolved: ResolvedType
  isLoaded: boolean
  error?: Error

  constructor(asyncRequire: AsyncRequire<ResolvedType>) {
    this.asyncRequire = asyncRequire
    this.isLoaded = this.existing !== undefined
  }

  get componentName(): string {
    return toComponentName(this.resolved)
  }
  get existing(): boolean | undefined {
    return ALL_INITIALIZERS.has(this.asyncRequire)
      ? ALL_INITIALIZERS.get(this.asyncRequire)
      : undefined
  }

  init(): any | Promise<any> {
    if (this.resolved === undefined && isPromise(this.asyncRequire) === true) {
      return new Promise(resolve =>
        this.asyncRequire
          .then(resolved => {
            this.resolved = toExport(resolved)
            this.isLoaded = true
            ALL_INITIALIZERS.set(this.asyncRequire, this.resolved)
            resolve(this.resolved)
          })
          .catch(asyncError => {
            throw asyncError
          })
      )
    } else {
      return this.resolved
    }
  }
  async wait() {
    return new Promise(resolve => {
      const resolved = this.init()
      isPromise(resolved) ? resolve(resolved) : resolve(this.resolved)
    })
  }
}

export { LoadableContext }
export default LoadableContext