about summary refs log tree commit diff
path: root/src/lib/routes
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/routes')
-rw-r--r--src/lib/routes/router.ts29
-rw-r--r--src/lib/routes/types.ts6
2 files changed, 25 insertions, 10 deletions
diff --git a/src/lib/routes/router.ts b/src/lib/routes/router.ts
index 05e0a63de..00defaeda 100644
--- a/src/lib/routes/router.ts
+++ b/src/lib/routes/router.ts
@@ -32,24 +32,39 @@ export class Router {
 }
 
 function createRoute(pattern: string): Route {
-  let matcherReInternal = pattern.replace(
-    /:([\w]+)/g,
-    (_m, name) => `(?<${name}>[^/]+)`,
-  )
+  const pathParamNames: Set<string> = new Set()
+  let matcherReInternal = pattern.replace(/:([\w]+)/g, (_m, name) => {
+    pathParamNames.add(name)
+    return `(?<${name}>[^/]+)`
+  })
   const matcherRe = new RegExp(`^${matcherReInternal}([?]|$)`, 'i')
   return {
     match(path: string) {
-      const res = matcherRe.exec(path)
+      const {pathname, searchParams} = new URL(path, 'http://throwaway.com')
+      const addedParams = Object.fromEntries(searchParams.entries())
+
+      const res = matcherRe.exec(pathname)
       if (res) {
-        return {params: res.groups || {}}
+        return {params: Object.assign(addedParams, res.groups || {})}
       }
       return undefined
     },
     build(params: Record<string, string>) {
-      return pattern.replace(
+      const str = pattern.replace(
         /:([\w]+)/g,
         (_m, name) => params[name] || 'undefined',
       )
+
+      let hasQp = false
+      const qp = new URLSearchParams()
+      for (const paramName in params) {
+        if (!pathParamNames.has(paramName)) {
+          qp.set(paramName, params[paramName])
+          hasQp = true
+        }
+      }
+
+      return str + (hasQp ? `?${qp.toString()}` : '')
     },
   }
 }
diff --git a/src/lib/routes/types.ts b/src/lib/routes/types.ts
index 9ec623970..cc48e2dbe 100644
--- a/src/lib/routes/types.ts
+++ b/src/lib/routes/types.ts
@@ -23,7 +23,7 @@ export type HomeTabNavigatorParams = CommonNavigatorParams & {
 }
 
 export type SearchTabNavigatorParams = CommonNavigatorParams & {
-  Search: undefined
+  Search: {q?: string}
 }
 
 export type NotificationsTabNavigatorParams = CommonNavigatorParams & {
@@ -32,7 +32,7 @@ export type NotificationsTabNavigatorParams = CommonNavigatorParams & {
 
 export type FlatNavigatorParams = CommonNavigatorParams & {
   Home: undefined
-  Search: undefined
+  Search: {q?: string}
   Notifications: undefined
 }
 
@@ -40,7 +40,7 @@ export type AllNavigatorParams = CommonNavigatorParams & {
   HomeTab: undefined
   Home: undefined
   SearchTab: undefined
-  Search: undefined
+  Search: {q?: string}
   NotificationsTab: undefined
   Notifications: undefined
 }