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    
styleh-components / src / deps / deepForceUpdate.ts
Size: Mime:
/**
 * Constant to identify a React Component. It's been extracted from ReactTypeOfWork
 *
 * @see https://github.com/facebook/react/blob/master/src/shared/ReactTypeOfWork.js#L20
 * @author https://github.com/gaearon/react-deep-force-update
 */
const ReactClassComponent = 2

function traverseRenderedChildren(internalInstance, callback, argument) {
  callback(internalInstance, argument)

  if (internalInstance._renderedComponent) {
    traverseRenderedChildren(
      internalInstance._renderedComponent,
      callback,
      argument
    )
  } else {
    for (const key in internalInstance._renderedChildren) {
      if (internalInstance._renderedChildren.hasOwnProperty(key)) {
        traverseRenderedChildren(
          internalInstance._renderedChildren[key],
          callback,
          argument
        )
      }
    }
  }
}

function setPendingForceUpdate(internalInstance, shouldUpdate) {
  if (
    internalInstance._pendingForceUpdate === false &&
    shouldUpdate(internalInstance)
  ) {
    internalInstance._pendingForceUpdate = true
  }
}

function forceUpdateIfPending(internalInstance, onUpdate) {
  if (internalInstance._pendingForceUpdate === true) {
    const publicInstance = internalInstance._instance
    const { updater } = publicInstance

    if (typeof publicInstance.forceUpdate === 'function') {
      publicInstance.forceUpdate()
    } else if (updater && typeof updater.enqueueForceUpdate === 'function') {
      updater.enqueueForceUpdate(publicInstance)
    }
    onUpdate(internalInstance)
  }
}

function deepForceUpdateStack(instance, shouldUpdate, onUpdate) {
  const internalInstance = instance._reactInternalInstance
  traverseRenderedChildren(
    internalInstance,
    setPendingForceUpdate,
    shouldUpdate
  )
  traverseRenderedChildren(internalInstance, forceUpdateIfPending, onUpdate)
}

// eslint-disable-next-line
function deepForceUpdate(
  instance,
  shouldUpdate = () => true,
  onUpdate = () => {}
) {
  const _root = instance._reactInternalFiber || instance._reactInternalInstance
  if (typeof _root.tag !== 'number') {
    // Traverse stack-based React tree.
    return deepForceUpdateStack(instance, shouldUpdate, onUpdate)
  }

  let node = _root
  while (true) {
    if (node.tag === ReactClassComponent && shouldUpdate(node)) {
      const publicInstance = node.stateNode
      const { updater } = publicInstance
      if (typeof publicInstance.forceUpdate === 'function') {
        publicInstance.forceUpdate()
      } else if (updater && typeof updater.enqueueForceUpdate === 'function') {
        updater.enqueueForceUpdate(publicInstance)
      }
      onUpdate(node)
    }
    if (node.child) {
      node.child.return = node
      node = node.child
      continue
    }
    if (node === _root) {
      return undefined
    }
    while (!node.sibling) {
      if (!node.return || node.return === _root) {
        return undefined
      }
      node = node.return
    }
    node.sibling.return = node.return
    node = node.sibling
  }
}

// process.env.NODE_ENV === 'development'
// if (typeof window === 'object') {
//   window.deepForceUpdate = deepForceUpdate
// }

export { deepForceUpdate }
export default deepForceUpdate