diff --git a/package.json b/package.json index f7ea645..5fcabc2 100644 --- a/package.json +++ b/package.json @@ -76,6 +76,7 @@ "react": "19.2.0", "react-dom": "19.2.0", "react-error-boundary": "6.0.0", + "react-helmet-async": "^2.0.5", "react-markdown": "10.1.0", "react-syntax-highlighter": "15.6.6", "remark-gfm": "4.0.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index da4905b..b08fc9f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -116,6 +116,9 @@ importers: react-error-boundary: specifier: 6.0.0 version: 6.0.0(react@19.2.0) + react-helmet-async: + specifier: ^2.0.5 + version: 2.0.5(react@19.2.0) react-markdown: specifier: 10.1.0 version: 10.1.0(@types/react@19.2.2)(react@19.2.0) @@ -2922,6 +2925,9 @@ packages: '@types/node': optional: true + invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + ip-address@10.0.1: resolution: {integrity: sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==} engines: {node: '>= 12'} @@ -3239,6 +3245,10 @@ packages: longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + lowlight@1.20.0: resolution: {integrity: sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==} @@ -3775,6 +3785,14 @@ packages: peerDependencies: react: '>=16.13.1' + react-fast-compare@3.2.2: + resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==} + + react-helmet-async@2.0.5: + resolution: {integrity: sha512-rYUYHeus+i27MvFE+Jaa4WsyBKGkL6qVgbJvSBoX8mbsWoABJXdEO0bZyi0F6i+4f0NuIb8AvqPMj3iXFHkMwg==} + peerDependencies: + react: ^16.6.0 || ^17.0.0 || ^18.0.0 + react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} @@ -3954,6 +3972,9 @@ packages: resolution: {integrity: sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ==} engines: {node: '>=10'} + shallowequal@1.1.0: + resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -7193,6 +7214,10 @@ snapshots: optionalDependencies: '@types/node': 24.9.1 + invariant@2.2.4: + dependencies: + loose-envify: 1.4.0 + ip-address@10.0.1: {} is-alphabetical@1.0.4: {} @@ -7421,6 +7446,10 @@ snapshots: longest-streak@3.1.0: {} + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + lowlight@1.20.0: dependencies: fault: 1.0.4 @@ -8183,6 +8212,15 @@ snapshots: '@babel/runtime': 7.28.4 react: 19.2.0 + react-fast-compare@3.2.2: {} + + react-helmet-async@2.0.5(react@19.2.0): + dependencies: + invariant: 2.2.4 + react: 19.2.0 + react-fast-compare: 3.2.2 + shallowequal: 1.1.0 + react-is@18.3.1: {} react-markdown@10.1.0(@types/react@19.2.2)(react@19.2.0): @@ -8438,6 +8476,8 @@ snapshots: seroval@1.3.2: {} + shallowequal@1.1.0: {} + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 diff --git a/src/routes/__root.tsx b/src/routes/__root.tsx index f49bfec..40e4fc7 100644 --- a/src/routes/__root.tsx +++ b/src/routes/__root.tsx @@ -1,4 +1,5 @@ import { createRootRoute, Outlet } from "@tanstack/react-router"; +import { HelmetProvider } from "react-helmet-async"; import { RootErrorBoundary } from "../app/components/RootErrorBoundary"; import { SSEEventListeners } from "../app/components/SSEEventListeners"; import { SyncSessionProcess } from "../app/components/SyncSessionProcess"; @@ -10,17 +11,19 @@ import { SSEProvider } from "../lib/sse/components/SSEProvider"; export const Route = createRootRoute({ component: () => ( - - - - - - - - - - - + + + + + + + + + + + + + ), diff --git a/src/routes/projects/$projectId/sessions/$sessionId/index.tsx b/src/routes/projects/$projectId/sessions/$sessionId/index.tsx index 0093974..51353dc 100644 --- a/src/routes/projects/$projectId/sessions/$sessionId/index.tsx +++ b/src/routes/projects/$projectId/sessions/$sessionId/index.tsx @@ -1,5 +1,7 @@ import { Trans } from "@lingui/react"; import { createFileRoute } from "@tanstack/react-router"; +import { Helmet } from "react-helmet-async"; +import { useProject } from "../../../../../app/projects/[projectId]/hooks/useProject"; import { SessionPageContent } from "../../../../../app/projects/[projectId]/sessions/[sessionId]/components/SessionPageContent"; import { NotFound } from "../../../../../components/NotFound"; @@ -24,10 +26,22 @@ export const Route = createFileRoute( function RouteComponent() { const params = Route.useParams(); + const { data } = useProject(params.projectId); + const projectName = data.pages[0]?.project.meta.projectName; + + const title = projectName + ? `${projectName} - Claude Code Viewer` + : "Claude Code Viewer"; + return ( - + <> + + {title} + + + ); }