|
|
@@ -1,5 +1,5 @@ |
|
|
import { useQuery } from '@tanstack/react-query' |
|
|
import { useQuery } from '@tanstack/react-query' |
|
|
import { useEffect, useState } from 'react' |
|
|
|
|
|
|
|
|
import { useEffect, useMemo } from 'react' |
|
|
import { Helmet } from 'react-helmet-async' |
|
|
import { Helmet } from 'react-helmet-async' |
|
|
import { useLocation, useNavigate, useParams } from 'react-router-dom' |
|
|
import { useLocation, useNavigate, useParams } from 'react-router-dom' |
|
|
|
|
|
|
|
|
@@ -13,11 +13,11 @@ import MainArea from '@/components/layout/MainArea' |
|
|
import { SITE_TITLE } from '@/config' |
|
|
import { SITE_TITLE } from '@/config' |
|
|
import { WikiIdBus } from '@/lib/eventBus/WikiIdBus' |
|
|
import { WikiIdBus } from '@/lib/eventBus/WikiIdBus' |
|
|
import { fetchPosts } from '@/lib/posts' |
|
|
import { fetchPosts } from '@/lib/posts' |
|
|
import { wikiKeys } from '@/lib/queryKeys' |
|
|
|
|
|
|
|
|
import { postsKeys, tagsKeys, wikiKeys } from '@/lib/queryKeys' |
|
|
import { fetchTagByName } from '@/lib/tags' |
|
|
import { fetchTagByName } from '@/lib/tags' |
|
|
import { fetchWikiPage, fetchWikiPageByTitle } from '@/lib/wiki' |
|
|
import { fetchWikiPage, fetchWikiPageByTitle } from '@/lib/wiki' |
|
|
|
|
|
|
|
|
import type { Post, Tag } from '@/types' |
|
|
|
|
|
|
|
|
import type { Tag } from '@/types' |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
export default () => { |
|
|
export default () => { |
|
|
@@ -27,10 +27,7 @@ export default () => { |
|
|
const location = useLocation () |
|
|
const location = useLocation () |
|
|
const navigate = useNavigate () |
|
|
const navigate = useNavigate () |
|
|
|
|
|
|
|
|
const defaultTag = { name: title, category: 'general' } as Tag |
|
|
|
|
|
|
|
|
|
|
|
const [posts, setPosts] = useState<Post[]> ([]) |
|
|
|
|
|
const [tag, setTag] = useState (defaultTag) |
|
|
|
|
|
|
|
|
const defaultTag = useMemo (() => ({ name: title, category: 'general' } as Tag), [title]) |
|
|
|
|
|
|
|
|
const query = new URLSearchParams (location.search) |
|
|
const query = new URLSearchParams (location.search) |
|
|
const version = query.get ('version') |
|
|
const version = query.get ('version') |
|
|
@@ -40,6 +37,19 @@ export default () => { |
|
|
queryKey: wikiKeys.show (title ?? '', version ? { version } : { }), |
|
|
queryKey: wikiKeys.show (title ?? '', version ? { version } : { }), |
|
|
queryFn: () => fetchWikiPageByTitle (title ?? '', version ? { version } : { }) }) |
|
|
queryFn: () => fetchWikiPageByTitle (title ?? '', version ? { version } : { }) }) |
|
|
|
|
|
|
|
|
|
|
|
const effectiveTitle = wikiPage?.title ?? title |
|
|
|
|
|
|
|
|
|
|
|
const { data: tag } = useQuery ({ |
|
|
|
|
|
enabled: Boolean (effectiveTitle), |
|
|
|
|
|
queryKey: tagsKeys.show (effectiveTitle), |
|
|
|
|
|
queryFn: () => fetchTagByName (effectiveTitle) }) |
|
|
|
|
|
|
|
|
|
|
|
const { data } = useQuery ({ |
|
|
|
|
|
enabled: Boolean (effectiveTitle) && !(version), |
|
|
|
|
|
queryKey: postsKeys.index ({ tags: effectiveTitle, match: 'all', page: 1, limit: 8 }), |
|
|
|
|
|
queryFn: () => fetchPosts ({ tags: effectiveTitle, match: 'all', page: 1, limit: 8 }) }) |
|
|
|
|
|
const posts = data?.posts || [] |
|
|
|
|
|
|
|
|
useEffect (() => { |
|
|
useEffect (() => { |
|
|
if (!(wikiPage)) |
|
|
if (!(wikiPage)) |
|
|
return |
|
|
return |
|
|
@@ -53,48 +63,20 @@ export default () => { |
|
|
}, [wikiPage, title, navigate]) |
|
|
}, [wikiPage, title, navigate]) |
|
|
|
|
|
|
|
|
useEffect (() => { |
|
|
useEffect (() => { |
|
|
if (/^\d+$/.test (title)) |
|
|
|
|
|
{ |
|
|
|
|
|
void (async () => { |
|
|
|
|
|
try |
|
|
|
|
|
{ |
|
|
|
|
|
const data = await fetchWikiPage (title, { }) |
|
|
|
|
|
navigate (`/wiki/${ encodeURIComponent(data.title) }`, { replace: true }) |
|
|
|
|
|
} |
|
|
|
|
|
catch |
|
|
|
|
|
{ |
|
|
|
|
|
; |
|
|
|
|
|
} |
|
|
|
|
|
}) () |
|
|
|
|
|
|
|
|
|
|
|
return |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
if (!(/^\d+$/.test (title))) |
|
|
|
|
|
return |
|
|
|
|
|
|
|
|
setPosts ([]) |
|
|
|
|
|
void (async () => { |
|
|
void (async () => { |
|
|
try |
|
|
try |
|
|
{ |
|
|
{ |
|
|
const data = await fetchPosts ({ tags: title, match: 'all', limit: 8 }) |
|
|
|
|
|
setPosts (data.posts) |
|
|
|
|
|
|
|
|
const data = await fetchWikiPage (title, { }) |
|
|
|
|
|
navigate (`/wiki/${ encodeURIComponent(data.title) }`, { replace: true }) |
|
|
} |
|
|
} |
|
|
catch |
|
|
catch |
|
|
{ |
|
|
{ |
|
|
; |
|
|
; |
|
|
} |
|
|
} |
|
|
}) () |
|
|
}) () |
|
|
|
|
|
|
|
|
void (async () => { |
|
|
|
|
|
try |
|
|
|
|
|
{ |
|
|
|
|
|
setTag (await fetchTagByName (title)) |
|
|
|
|
|
} |
|
|
|
|
|
catch |
|
|
|
|
|
{ |
|
|
|
|
|
setTag (defaultTag) |
|
|
|
|
|
} |
|
|
|
|
|
}) () |
|
|
|
|
|
|
|
|
|
|
|
return () => WikiIdBus.set (null) |
|
|
|
|
|
}, [title, version]) |
|
|
}, [title, version]) |
|
|
|
|
|
|
|
|
return ( |
|
|
return ( |
|
|
@@ -105,7 +87,8 @@ export default () => { |
|
|
</Helmet> |
|
|
</Helmet> |
|
|
|
|
|
|
|
|
{(wikiPage && version) && ( |
|
|
{(wikiPage && version) && ( |
|
|
<div className="text-sm flex gap-3 items-center justify-center border border-gray-700 rounded px-2 py-1 mb-4"> |
|
|
|
|
|
|
|
|
<div className="text-sm flex gap-3 items-center justify-center |
|
|
|
|
|
border border-gray-700 rounded px-2 py-1 mb-4"> |
|
|
{wikiPage.pred ? ( |
|
|
{wikiPage.pred ? ( |
|
|
<PrefetchLink to={`/wiki/${ encodeURIComponent (title) }?version=${ wikiPage.pred }`}> |
|
|
<PrefetchLink to={`/wiki/${ encodeURIComponent (title) }?version=${ wikiPage.pred }`}> |
|
|
< 古 |
|
|
< 古 |
|
|
@@ -120,7 +103,7 @@ export default () => { |
|
|
</div>)} |
|
|
</div>)} |
|
|
|
|
|
|
|
|
<PageTitle> |
|
|
<PageTitle> |
|
|
<TagLink tag={tag} |
|
|
|
|
|
|
|
|
<TagLink tag={tag ?? defaultTag} |
|
|
withWiki={false} |
|
|
withWiki={false} |
|
|
withCount={false} |
|
|
withCount={false} |
|
|
{...(version && { to: `/wiki/${ encodeURIComponent (title) }` })}/> |
|
|
{...(version && { to: `/wiki/${ encodeURIComponent (title) }` })}/> |
|
|
|