@ionic/core
Version:
Base components for Ionic
68 lines (67 loc) • 1.99 kB
JavaScript
import { ROUTER_INTENT_NONE } from './constants';
export async function writeNavState(root, chain, direction, index, changed = false) {
try {
const outlet = searchNavNode(root);
if (index >= chain.length || !outlet) {
return changed;
}
await outlet.componentOnReady();
const route = chain[index];
const result = await outlet.setRouteId(route.id, route.params, direction);
if (result.changed) {
direction = ROUTER_INTENT_NONE;
changed = true;
}
changed = await writeNavState(result.element, chain, direction, index + 1, changed);
if (result.markVisible) {
await result.markVisible();
}
return changed;
}
catch (e) {
console.error(e);
return false;
}
}
export async function readNavState(root) {
const ids = [];
let outlet;
let node = root;
while (true) {
outlet = searchNavNode(node);
if (outlet) {
const id = await outlet.getRouteId();
if (id) {
node = id.element;
id.element = undefined;
ids.push(id);
}
else {
break;
}
}
else {
break;
}
}
return { ids, outlet };
}
export function waitUntilNavNode(win) {
if (searchNavNode(win.document.body)) {
return Promise.resolve();
}
return new Promise(resolve => {
win.addEventListener('ionNavWillLoad', resolve, { once: true });
});
}
const QUERY = ':not([no-router]) ion-nav, :not([no-router]) ion-tabs, :not([no-router]) ion-router-outlet';
function searchNavNode(root) {
if (!root) {
return undefined;
}
if (root.matches(QUERY)) {
return root;
}
const outlet = root.querySelector(QUERY);
return outlet ? outlet : undefined;
}