UNPKG

@ionic/core

Version:
68 lines (67 loc) 1.99 kB
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; }