diff --git a/packages/genui/a2ui-playground/rsbuild.config.ts b/packages/genui/a2ui-playground/rsbuild.config.ts index dc6f5be165..5d5e27f68e 100644 --- a/packages/genui/a2ui-playground/rsbuild.config.ts +++ b/packages/genui/a2ui-playground/rsbuild.config.ts @@ -160,7 +160,7 @@ function findLocalIp(): string { function buildRspeedyBundleUrl(port: number): string { const ip = findLocalIp(); - return `http://${ip}:${port}/main.lynx.js`; + return `http://${ip}:${port}/a2ui.lynx.js`; } export default defineConfig({ diff --git a/packages/genui/a2ui-playground/src/pages/DemosPage.tsx b/packages/genui/a2ui-playground/src/pages/DemosPage.tsx index 9f7d6f84ba..d28e182bf6 100644 --- a/packages/genui/a2ui-playground/src/pages/DemosPage.tsx +++ b/packages/genui/a2ui-playground/src/pages/DemosPage.tsx @@ -36,8 +36,18 @@ function formatUrlForDisplay(url: string): string { return `${head}…${tail}`; } +function getDeployedLynxBundleUrl(): string { + try { + return new URL('a2ui.lynx.js', window.location.href).toString(); + } catch { + return ''; + } +} + function useRspeedyDevUrl(): string { - const [url, setUrl] = useState(''); + // Default to the deployed bundle next to the current page so that the + // "Native Preview" QR is available in production (no rspeedy dev server). + const [url, setUrl] = useState(() => getDeployedLynxBundleUrl()); useEffect(() => { let cancelled = false; void (async () => { @@ -47,7 +57,7 @@ function useRspeedyDevUrl(): string { }); if (!res.ok) return; const data = (await res.json()) as { url?: string }; - if (!cancelled && typeof data.url === 'string') { + if (!cancelled && typeof data.url === 'string' && data.url) { setUrl(data.url); } } catch { diff --git a/packages/genui/a2ui-playground/src/pages/OpenUIDemosPage.tsx b/packages/genui/a2ui-playground/src/pages/OpenUIDemosPage.tsx index b7fbbcf8ac..c2425ba4fc 100644 --- a/packages/genui/a2ui-playground/src/pages/OpenUIDemosPage.tsx +++ b/packages/genui/a2ui-playground/src/pages/OpenUIDemosPage.tsx @@ -18,8 +18,18 @@ const COMPACT_CODE_MIN_HEIGHT = 220; const COMPACT_PREVIEW_MIN_HEIGHT = 320; const RESIZE_BREAKPOINT = 980; +function getDeployedLynxBundleUrl(): string { + try { + return new URL('a2ui.lynx.js', window.location.href).toString(); + } catch { + return ''; + } +} + function useRspeedyDevUrl(): string { - const [url, setUrl] = useState(''); + // Default to the deployed bundle next to the current page so that the + // "Native Preview" QR is available in production (no rspeedy dev server). + const [url, setUrl] = useState(() => getDeployedLynxBundleUrl()); useEffect(() => { let cancelled = false; void (async () => { @@ -29,7 +39,7 @@ function useRspeedyDevUrl(): string { }); if (!res.ok) return; const data = (await res.json()) as { url?: string }; - if (!cancelled && typeof data.url === 'string') { + if (!cancelled && typeof data.url === 'string' && data.url) { setUrl(data.url); } } catch {