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