about summary refs log tree commit diff
path: root/src/lib/routes/helpers.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/routes/helpers.ts')
-rw-r--r--src/lib/routes/helpers.ts77
1 files changed, 77 insertions, 0 deletions
diff --git a/src/lib/routes/helpers.ts b/src/lib/routes/helpers.ts
new file mode 100644
index 000000000..be76b9669
--- /dev/null
+++ b/src/lib/routes/helpers.ts
@@ -0,0 +1,77 @@
+import {State, RouteParams} from './types'
+
+export function getCurrentRoute(state: State) {
+  let node = state.routes[state.index || 0]
+  while (node.state?.routes && typeof node.state?.index === 'number') {
+    node = node.state?.routes[node.state?.index]
+  }
+  return node
+}
+
+export function isStateAtTabRoot(state: State | undefined) {
+  if (!state) {
+    // NOTE
+    // if state is not defined it's because init is occuring
+    // and therefore we can safely assume we're at root
+    // -prf
+    return true
+  }
+  const currentRoute = getCurrentRoute(state)
+  return (
+    isTab(currentRoute.name, 'Home') ||
+    isTab(currentRoute.name, 'Search') ||
+    isTab(currentRoute.name, 'Notifications')
+  )
+}
+
+export function isTab(current: string, route: string) {
+  // NOTE
+  // our tab routes can be variously referenced by 3 different names
+  // this helper deals with that weirdness
+  // -prf
+  return (
+    current === route ||
+    current === `${route}Tab` ||
+    current === `${route}Inner`
+  )
+}
+
+export enum TabState {
+  InsideAtRoot,
+  Inside,
+  Outside,
+}
+export function getTabState(state: State | undefined, tab: string): TabState {
+  if (!state) {
+    return TabState.Outside
+  }
+  const currentRoute = getCurrentRoute(state)
+  if (isTab(currentRoute.name, tab)) {
+    return TabState.InsideAtRoot
+  } else if (isTab(state.routes[state.index || 0].name, tab)) {
+    return TabState.Inside
+  }
+  return TabState.Outside
+}
+
+export function buildStateObject(
+  stack: string,
+  route: string,
+  params: RouteParams,
+) {
+  if (stack === 'Flat') {
+    return {
+      routes: [{name: route, params}],
+    }
+  }
+  return {
+    routes: [
+      {
+        name: stack,
+        state: {
+          routes: [{name: route, params}],
+        },
+      },
+    ],
+  }
+}