From 2bc1f5842e1bb6bd8590f207e0b64dc83cc4c883 Mon Sep 17 00:00:00 2001 From: Baoshuo Date: Tue, 21 Apr 2026 22:22:33 +0800 Subject: [PATCH] ui-next: better page data context --- packages/ui-next/src/context/pageData.tsx | 23 ++++++++++++++--------- packages/ui-next/src/main.tsx | 16 +++++++++++++--- 2 files changed, 27 insertions(+), 12 deletions(-) diff --git a/packages/ui-next/src/context/pageData.tsx b/packages/ui-next/src/context/pageData.tsx index 4c775f91f..34fc42435 100644 --- a/packages/ui-next/src/context/pageData.tsx +++ b/packages/ui-next/src/context/pageData.tsx @@ -1,6 +1,7 @@ -import { createContext, type ReactNode, useContext, useState } from 'react'; +import { createContext, type ReactNode, useContext, useMemo, useState } from 'react'; export interface PageData { + HYDRO_INJECTED?: boolean; name: string; args: Record; url: string; @@ -8,20 +9,24 @@ export interface PageData { [key: string]: any; } +type PageDataSetter = (data: PageData) => void; + interface PageDataContextValue { data: PageData; - setData: (data: PageData) => void; + setData: PageDataSetter; } - const PageDataContext = createContext(null); -export function PageDataProvider({ initial, children }: { initial: PageData, children: ReactNode }) { +interface PageDataProviderProps { + initial: PageData; + children: ReactNode; +} + +export function PageDataProvider({ initial, children }: PageDataProviderProps) { const [data, setData] = useState(initial); - return ( - - {children} - - ); + const value = useMemo(() => ({ data, setData }), [data]); + + return {children}; } // eslint-disable-next-line react-refresh/only-export-components diff --git a/packages/ui-next/src/main.tsx b/packages/ui-next/src/main.tsx index aa194a3f1..36857e167 100644 --- a/packages/ui-next/src/main.tsx +++ b/packages/ui-next/src/main.tsx @@ -11,9 +11,19 @@ for (const plugin of plugins) { } const injectionEl = document.getElementById('__HYDRO_INJECTION__'); -const initialData: PageData = injectionEl - ? JSON.parse(injectionEl.textContent!) - : { name: 'invalid_init', args: {}, url: window.location.pathname }; +let initialData: PageData = { + name: '', + args: {}, + url: window.location.pathname, + routeMap: {}, +}; +if (injectionEl) { + try { + initialData = JSON.parse(injectionEl.textContent!); + } catch (e) { + console.error('[Hydro] Failed to parse injection data:', e); + } +} createRoot(document.getElementById('root')!).render(