From 950910fa17939823e01710df71711a22cd361f38 Mon Sep 17 00:00:00 2001 From: Baoshuo Date: Tue, 21 Apr 2026 22:30:26 +0800 Subject: [PATCH] ui-next: url builder --- packages/ui-next/package.json | 1 + packages/ui-next/src/hooks/useRouteMap.ts | 6 +++++ packages/ui-next/src/hooks/useUrl.ts | 27 +++++++++++++++++++++++ 3 files changed, 34 insertions(+) create mode 100644 packages/ui-next/src/hooks/useRouteMap.ts create mode 100644 packages/ui-next/src/hooks/useUrl.ts diff --git a/packages/ui-next/package.json b/packages/ui-next/package.json index 179b82a56..834cc6715 100644 --- a/packages/ui-next/package.json +++ b/packages/ui-next/package.json @@ -11,6 +11,7 @@ }, "dependencies": { "koa2-connect": "^1.0.2", + "path-to-regexp": "^8.4.2", "react": "^19.2.5", "react-dom": "^19.2.5" }, diff --git a/packages/ui-next/src/hooks/useRouteMap.ts b/packages/ui-next/src/hooks/useRouteMap.ts new file mode 100644 index 000000000..7e935bc80 --- /dev/null +++ b/packages/ui-next/src/hooks/useRouteMap.ts @@ -0,0 +1,6 @@ +import { usePageData } from '../context/pageData'; + +export function useRouteMap(): Record { + const data = usePageData(); + return data.routeMap; +} diff --git a/packages/ui-next/src/hooks/useUrl.ts b/packages/ui-next/src/hooks/useUrl.ts new file mode 100644 index 000000000..e86cd4ff0 --- /dev/null +++ b/packages/ui-next/src/hooks/useUrl.ts @@ -0,0 +1,27 @@ +import { compile } from 'path-to-regexp'; +import { useCallback } from 'react'; +import { useRouteMap } from './useRouteMap'; + +function buildUrl(pattern: string, params: Record = {}): string { + try { + return compile(pattern)(params); + } catch (err) { + console.warn(`[Hydro] Failed to build URL for pattern "${pattern}":`, err); + return '#'; + } +} + +export function useUrl() { + const routeMap = useRouteMap(); + + const url = useCallback((name: string, params: Record = {}): string => { + const pattern = routeMap[name]; + if (!pattern) { + console.warn(`[Hydro] Unknown route: ${name}`); + return '#'; + } + return buildUrl(pattern, params); + }, [routeMap]); + + return url; +}