74 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			74 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
'use strict';
 | 
						|
 | 
						|
Object.defineProperty(exports, '__esModule', { value: true });
 | 
						|
 | 
						|
var vue = require('vue');
 | 
						|
var vnode = require('../../utils/vue/vnode.js');
 | 
						|
 | 
						|
const getOrderedChildren = (vm, childComponentName, children) => {
 | 
						|
  const nodes = vnode.flattedChildren(vm.subTree).filter((n) => {
 | 
						|
    var _a;
 | 
						|
    return vue.isVNode(n) && ((_a = n.type) == null ? void 0 : _a.name) === childComponentName && !!n.component;
 | 
						|
  });
 | 
						|
  const uids = nodes.map((n) => n.component.uid);
 | 
						|
  return uids.map((uid) => children[uid]).filter((p) => !!p);
 | 
						|
};
 | 
						|
const useOrderedChildren = (vm, childComponentName) => {
 | 
						|
  const children = vue.shallowRef({});
 | 
						|
  const orderedChildren = vue.shallowRef([]);
 | 
						|
  const nodesMap = /* @__PURE__ */ new WeakMap();
 | 
						|
  const addChild = (child) => {
 | 
						|
    children.value[child.uid] = child;
 | 
						|
    vue.triggerRef(children);
 | 
						|
    vue.onMounted(() => {
 | 
						|
      const childNode = child.getVnode().el;
 | 
						|
      const parentNode = childNode.parentNode;
 | 
						|
      if (!nodesMap.has(parentNode)) {
 | 
						|
        nodesMap.set(parentNode, []);
 | 
						|
        const originalFn = parentNode.insertBefore.bind(parentNode);
 | 
						|
        parentNode.insertBefore = (node, anchor) => {
 | 
						|
          const shouldSortChildren = nodesMap.get(parentNode).some((el) => node === el || anchor === el);
 | 
						|
          if (shouldSortChildren)
 | 
						|
            vue.triggerRef(children);
 | 
						|
          return originalFn(node, anchor);
 | 
						|
        };
 | 
						|
      }
 | 
						|
      nodesMap.get(parentNode).push(childNode);
 | 
						|
    });
 | 
						|
  };
 | 
						|
  const removeChild = (child) => {
 | 
						|
    delete children.value[child.uid];
 | 
						|
    vue.triggerRef(children);
 | 
						|
    const childNode = child.getVnode().el;
 | 
						|
    const parentNode = childNode.parentNode;
 | 
						|
    const childNodes = nodesMap.get(parentNode);
 | 
						|
    const index = childNodes.indexOf(childNode);
 | 
						|
    childNodes.splice(index, 1);
 | 
						|
  };
 | 
						|
  const sortChildren = () => {
 | 
						|
    orderedChildren.value = getOrderedChildren(vm, childComponentName, children.value);
 | 
						|
  };
 | 
						|
  const IsolatedRenderer = (props) => {
 | 
						|
    return props.render();
 | 
						|
  };
 | 
						|
  const ChildrenSorter = vue.defineComponent({
 | 
						|
    setup(_, { slots }) {
 | 
						|
      return () => {
 | 
						|
        sortChildren();
 | 
						|
        return slots.default ? vue.h(IsolatedRenderer, {
 | 
						|
          render: slots.default
 | 
						|
        }) : null;
 | 
						|
      };
 | 
						|
    }
 | 
						|
  });
 | 
						|
  return {
 | 
						|
    children: orderedChildren,
 | 
						|
    addChild,
 | 
						|
    removeChild,
 | 
						|
    ChildrenSorter
 | 
						|
  };
 | 
						|
};
 | 
						|
 | 
						|
exports.useOrderedChildren = useOrderedChildren;
 | 
						|
//# sourceMappingURL=index.js.map
 |