attachFutureElement method

void attachFutureElement(
  1. DOMElement? domParent,
  2. T? parent,
  3. DOMNode domElement,
  4. T? templateElement,
  5. Object? futureElementResolved,
  6. DOMTreeMap<T> treeMap,
  7. DOMContext<T>? context,
)

Implementation

void attachFutureElement(
    DOMElement? domParent,
    T? parent,
    DOMNode domElement,
    T? templateElement,
    Object? futureElementResolved,
    DOMTreeMap<T> treeMap,
    DOMContext<T>? context) {
  futureElementResolved = resolveElements(futureElementResolved);
  if (futureElementResolved == null) return;

  if (futureElementResolved is List<Object?>) {
    var futureElementResolvedListTyped = futureElementResolved
        .expand((e) => e.expandNonNullable())
        .whereType<T>()
        .toList();

    if (futureElementResolvedListTyped.isEmpty) return;

    if (futureElementResolvedListTyped.length == 1) {
      var futureElementResolved = futureElementResolvedListTyped.first;
      treeMap.map(domElement, futureElementResolved, allowOverwrite: true);
      if (parent != null) {
        replaceChildElement(parent, templateElement, [futureElementResolved]);
      }
    } else {
      var wrap = wrapElements(futureElementResolvedListTyped);
      if (wrap != null) {
        treeMap.map(domElement, wrap, allowOverwrite: true);
      }

      if (parent != null) {
        replaceChildElement(
            parent, templateElement, futureElementResolvedListTyped);
      }
    }
  } else if (futureElementResolved is T) {
    treeMap.map(domElement, futureElementResolved, allowOverwrite: true);
    if (parent != null) {
      replaceChildElement(parent, templateElement, [futureElementResolved]);
    }
  } else if (parent != null) {
    var children = addExternalElementToElement(parent, futureElementResolved);

    if (children == null || children.isEmpty) {
      removeChildFromElement(parent, templateElement);
    } else {
      var node = children.first;
      treeMap.map(domElement, node);

      for (var child in children) {
        removeChildFromElement(parent, child);
      }
      replaceChildElement(parent, templateElement, children);
    }
  }
}