From 4f09abf104dc0420c69b8f0c17ee8150b4dc1619 Mon Sep 17 00:00:00 2001 From: miteruzo Date: Fri, 6 Feb 2026 03:31:54 +0900 Subject: [PATCH] #140 --- frontend/src/lib/prefetchers.ts | 30 ++++++++++++++++++---- frontend/src/pages/wiki/WikiDetailPage.tsx | 14 +++++----- 2 files changed, 31 insertions(+), 13 deletions(-) diff --git a/frontend/src/lib/prefetchers.ts b/frontend/src/lib/prefetchers.ts index 6ccb2b9..565b434 100644 --- a/frontend/src/lib/prefetchers.ts +++ b/frontend/src/lib/prefetchers.ts @@ -2,7 +2,8 @@ import { QueryClient } from '@tanstack/react-query' import { match } from 'path-to-regexp' import { fetchPost, fetchPosts, fetchPostChanges } from '@/lib/posts' -import { postsKeys, wikiKeys } from '@/lib/queryKeys' +import { postsKeys, tagsKeys, wikiKeys } from '@/lib/queryKeys' +import { fetchTagByName } from '@/lib/tags' import { fetchWikiPageByTitle, fetchWikiPages } from '@/lib/wiki' type Prefetcher = (qc: QueryClient, url: URL) => Promise @@ -13,6 +14,7 @@ const mWiki = match<{ title: string }> ('/wiki/:title') const prefetchWikiPagesIndex: Prefetcher = async (qc, url) => { const title = url.searchParams.get ('title') ?? '' + await qc.prefetchQuery ({ queryKey: wikiKeys.index ({ title }), queryFn: () => fetchWikiPages ({ title }) }) @@ -24,11 +26,26 @@ const prefetchWikiPageShow: Prefetcher = async (qc, url) => { if (!(m)) return - const version = url.searchParams.get ('version') - const { title } = m.params + const title = decodeURIComponent (m.params.title) + const version = url.searchParams.get ('version') || undefined + + const wikiPage = await qc.fetchQuery ({ + queryKey: wikiKeys.show (title, { version }), + queryFn: () => fetchWikiPageByTitle (title, { version }) }) + + const effectiveTitle = wikiPage.title + await qc.prefetchQuery ({ - queryKey: wikiKeys.show (title, version ? { version } : { }), - queryFn: () => fetchWikiPageByTitle (title, version ? { version } : { }) }) + queryKey: tagsKeys.show (effectiveTitle), + queryFn: () => fetchTagByName (effectiveTitle) }) + + if (version) + return + + const p = { tags: effectiveTitle, match: 'all', page: 1, limit: 8 } as const + await qc.prefetchQuery ({ + queryKey: postsKeys.index (p), + queryFn: () => fetchPosts (p) }) } @@ -37,6 +54,7 @@ const prefetchPostsIndex: Prefetcher = async (qc, url) => { const m = url.searchParams.get ('match') === 'any' ? 'any' : 'all' const page = Number (url.searchParams.get ('page') || 1) const limit = Number (url.searchParams.get ('limit') || 20) + await qc.prefetchQuery ({ queryKey: postsKeys.index ({ tags, match: m, page, limit }), queryFn: () => fetchPosts ({ tags, match: m, page, limit }) }) @@ -49,6 +67,7 @@ const prefetchPostShow: Prefetcher = async (qc, url) => { return const { id } = m.params + await qc.prefetchQuery ({ queryKey: postsKeys.show (id), queryFn: () => fetchPost (id) }) @@ -59,6 +78,7 @@ const prefetchPostChanges: Prefetcher = async (qc, url) => { const id = url.searchParams.get ('id') const page = Number (url.searchParams.get ('page') || 1) const limit = Number (url.searchParams.get ('limit') || 20) + await qc.prefetchQuery ({ queryKey: postsKeys.changes ({ ...(id && { id }), page, limit }), queryFn: () => fetchPostChanges ({ ...(id && { id }), page, limit }) }) diff --git a/frontend/src/pages/wiki/WikiDetailPage.tsx b/frontend/src/pages/wiki/WikiDetailPage.tsx index 08c4a5f..eeb0b87 100644 --- a/frontend/src/pages/wiki/WikiDetailPage.tsx +++ b/frontend/src/pages/wiki/WikiDetailPage.tsx @@ -30,12 +30,12 @@ export default () => { const defaultTag = useMemo (() => ({ name: title, category: 'general' } as Tag), [title]) const query = new URLSearchParams (location.search) - const version = query.get ('version') + const version = query.get ('version') || undefined - const { data: wikiPage } = useQuery ({ + const { data: wikiPage, isLoading: loading } = useQuery ({ enabled: Boolean (title) && !(/^\d+$/.test (title)), - queryKey: wikiKeys.show (title ?? '', version ? { version } : { }), - queryFn: () => fetchWikiPageByTitle (title ?? '', version ? { version } : { }) }) + queryKey: wikiKeys.show (title, { version }), + queryFn: () => fetchWikiPageByTitle (title, { version }) }) const effectiveTitle = wikiPage?.title ?? title @@ -77,7 +77,7 @@ export default () => { ; } }) () - }, [title, version]) + }, [title, navigate]) return ( @@ -109,9 +109,7 @@ export default () => { {...(version && { to: `/wiki/${ encodeURIComponent (title) }` })}/>
- {wikiPage === undefined - ? 'Loading...' - : } + {loading ? 'Loading...' : }
{(!(version) && posts.length > 0) && (