diff --git a/index.html b/index.html index 9acd6ed..c003e3a 100644 --- a/index.html +++ b/index.html @@ -26,7 +26,7 @@ - snrld — Tightly-knit social coding for cats + snrld
diff --git a/src/hooks/useDocumentTitle.ts b/src/hooks/useDocumentTitle.ts new file mode 100644 index 0000000..e36606e --- /dev/null +++ b/src/hooks/useDocumentTitle.ts @@ -0,0 +1,9 @@ +import { useEffect } from 'react' + +const APP_NAME = 'snrld' + +export function useDocumentTitle(label?: string): void { + useEffect(() => { + document.title = label ? `${label} · ${APP_NAME}` : APP_NAME + }, [label]) +} diff --git a/src/pages/HomePage.tsx b/src/pages/HomePage.tsx index 0e041da..e033954 100644 --- a/src/pages/HomePage.tsx +++ b/src/pages/HomePage.tsx @@ -1,7 +1,10 @@ import { RepoSearch } from '../components/repo/RepoSearch' import { PageContainer } from '../components/layout/PageContainer' +import { useDocumentTitle } from '../hooks/useDocumentTitle' export function HomePage() { + useDocumentTitle() + return (
diff --git a/src/pages/IssuePage.tsx b/src/pages/IssuePage.tsx index 526e777..0a54dc0 100644 --- a/src/pages/IssuePage.tsx +++ b/src/pages/IssuePage.tsx @@ -6,6 +6,7 @@ import { ErrorPage } from '../components/shared/ErrorPage' import { RepoRecordView } from '../components/repo/RepoRecordView' import { RepoPageSkeleton } from '../components/shared/PageSkeletons' import { useRepoRecordPage } from '../hooks/useRepoRecordPage' +import { useDocumentTitle } from '../hooks/useDocumentTitle' import { loadIssuePage } from '../lib/issuePage' import { parseHandle } from '../lib/routes' import { getRepoName, getRepoRkey } from '../lib/tangled/repo' @@ -26,6 +27,9 @@ export function IssuePage() { repoKey, repoOwnerHandle, }) + useDocumentTitle( + pageData ? `${pageData.record.value.title} · ${getRepoName(pageData.repo)}` : undefined, + ) if ( repoOwnerHandle === null || diff --git a/src/pages/ProfilePage.tsx b/src/pages/ProfilePage.tsx index d1cc480..6330ec9 100644 --- a/src/pages/ProfilePage.tsx +++ b/src/pages/ProfilePage.tsx @@ -16,6 +16,7 @@ import { LoadMoreButton } from '../components/shared/LoadMoreButton' import { StringListItem } from '../components/string/StringListItem' import { VouchList } from '../components/vouch/VouchList' import { useProfilePage } from '../hooks/useProfilePage' +import { useDocumentTitle } from '../hooks/useDocumentTitle' import { usePinnedRepos, useProfileRepos, @@ -32,6 +33,7 @@ export function ProfilePage() { const { handle: routeHandle } = useParams() const [searchParams] = useSearchParams() const handle = parseHandle(routeHandle) + useDocumentTitle(handle ?? undefined) const { pageData, error } = useProfilePage(handle) if (handle === null) { diff --git a/src/pages/PullPage.tsx b/src/pages/PullPage.tsx index 5b9c9e7..7bb8967 100644 --- a/src/pages/PullPage.tsx +++ b/src/pages/PullPage.tsx @@ -9,6 +9,7 @@ import { ErrorPage } from '../components/shared/ErrorPage' import { RepoPageSkeleton } from '../components/shared/PageSkeletons' import { Tabs } from '../components/shared/Tabs' import { useRepoRecordPage } from '../hooks/useRepoRecordPage' +import { useDocumentTitle } from '../hooks/useDocumentTitle' import { loadPullPage, type PullPageData } from '../lib/pullPage' import { parseHandle } from '../lib/routes' import { getRepoName, getRepoRkey } from '../lib/tangled/repo' @@ -30,6 +31,9 @@ export function PullPage() { repoKey, repoOwnerHandle, }) + useDocumentTitle( + pageData ? `${pageData.record.value.title} · ${getRepoName(pageData.repo)}` : undefined, + ) if ( repoOwnerHandle === null || diff --git a/src/pages/RepoPage.tsx b/src/pages/RepoPage.tsx index c498c99..6e07e8d 100644 --- a/src/pages/RepoPage.tsx +++ b/src/pages/RepoPage.tsx @@ -14,6 +14,7 @@ import { LoadingPanel } from '../components/shared/LoadingPanel' import { RepoPageSkeleton } from '../components/shared/PageSkeletons' import { useRepoPage } from '../hooks/useRepoPage' import { useRepoRootTree } from '../hooks/useRepoRootTree' +import { useDocumentTitle } from '../hooks/useDocumentTitle' import { parseHandle } from '../lib/routes' import { getRepoName, getRepoRkey } from '../lib/tangled/repo' @@ -27,6 +28,9 @@ export function RepoPage() { requestedSection !== 'pulls' && requestedSection !== 'pipelines' const { pageData, error } = useRepoPage(handle, routeRepo) + useDocumentTitle( + pageData ? `${pageData.actor.miniDoc.handle}/${getRepoName(pageData.repo)}` : undefined, + ) const { rootTree, error: rootTreeError } = useRepoRootTree(pageData?.repo ?? null, shouldLoadTree) if (handle === null || routeRepo === undefined) { diff --git a/src/pages/SearchPage.tsx b/src/pages/SearchPage.tsx index bc9a11d..468dad1 100644 --- a/src/pages/SearchPage.tsx +++ b/src/pages/SearchPage.tsx @@ -5,12 +5,15 @@ import { RepoSearch } from '../components/repo/RepoSearch' import { RepoSearchResult } from '../components/repo/RepoSearchResult' import { PageContainer } from '../components/layout/PageContainer' import { useRepoSearch } from '../hooks/useRepoSearch' +import { useDocumentTitle } from '../hooks/useDocumentTitle' import { useVisibleActor } from '../hooks/useVisibleActor' import type { Repo } from '../lib/tangled' const RESULTS_LIMIT = 50 export function SearchPage() { + useDocumentTitle('Search') + const [searchParams] = useSearchParams() const query = searchParams.get('q')?.trim() ?? '' const { results, isSearching, error } = useRepoSearch(query, { diff --git a/src/pages/StringPage.tsx b/src/pages/StringPage.tsx index 9e0d519..410497c 100644 --- a/src/pages/StringPage.tsx +++ b/src/pages/StringPage.tsx @@ -4,12 +4,14 @@ import { ProfilePageSkeleton } from '../components/shared/PageSkeletons' import { ErrorPage } from '../components/shared/ErrorPage' import { StringView } from '../components/string/StringView' import { useStringPage } from '../hooks/useStringPage' +import { useDocumentTitle } from '../hooks/useDocumentTitle' import { parseHandle } from '../lib/routes' export function StringPage() { const { handle: routeHandle, string: routeString } = useParams() const handle = parseHandle(routeHandle) const { pageData, error } = useStringPage(handle, routeString) + useDocumentTitle(pageData?.stringRecord.value.filename) if (handle === null || routeString === undefined) { return