From 8cc2a88e7cdf7a6facb7f931b82ffb01fbeb79d8 Mon Sep 17 00:00:00 2001 From: miteruzo Date: Sun, 1 Feb 2026 03:59:39 +0900 Subject: [PATCH] #140 --- frontend/src/components/PrefetchLink.tsx | 30 +++--- frontend/src/components/TopNav.tsx | 83 ++++++++-------- frontend/src/components/common/Pagination.tsx | 10 +- frontend/src/lib/api.ts | 65 ++++++++++++ frontend/src/lib/posts.ts | 40 ++------ frontend/src/lib/prefetchers.ts | 14 ++- frontend/src/lib/queryKeys.ts | 10 ++ frontend/src/lib/tags.ts | 7 ++ frontend/src/lib/wiki.ts | 14 +++ frontend/src/pages/posts/PostDetailPage.tsx | 42 ++++---- frontend/src/pages/posts/PostListPage.tsx | 98 ++++--------------- frontend/src/pages/wiki/WikiDetailPage.tsx | 37 +++---- 12 files changed, 235 insertions(+), 215 deletions(-) create mode 100644 frontend/src/lib/api.ts create mode 100644 frontend/src/lib/queryKeys.ts create mode 100644 frontend/src/lib/tags.ts create mode 100644 frontend/src/lib/wiki.ts diff --git a/frontend/src/components/PrefetchLink.tsx b/frontend/src/components/PrefetchLink.tsx index b968c8e..f983b0d 100644 --- a/frontend/src/components/PrefetchLink.tsx +++ b/frontend/src/components/PrefetchLink.tsx @@ -1,12 +1,12 @@ import { useQueryClient } from '@tanstack/react-query' -import { useMemo } from 'react' +import { forwardRef, useMemo } from 'react' import { createPath, useNavigate } from 'react-router-dom' import { useOverlayStore } from '@/components/RouteBlockerOverlay' import { prefetchForURL } from '@/lib/prefetchers' import { cn } from '@/lib/utils' -import type { AnchorHTMLAttributes, FC, MouseEvent, TouchEvent } from 'react' +import type { AnchorHTMLAttributes, MouseEvent, TouchEvent } from 'react' import type { To } from 'react-router-dom' type Props = AnchorHTMLAttributes & { @@ -16,14 +16,15 @@ type Props = AnchorHTMLAttributes & { cancelOnError?: boolean } -export default (({ to, - replace, - className, - onMouseEnter, - onTouchStart, - onClick, - cancelOnError = false, - ...rest }: Props) => { +export default forwardRef (({ + to, + replace, + className, + onMouseEnter, + onTouchStart, + onClick, + cancelOnError = false, + ...rest }, ref) => { const navigate = useNavigate () const qc = useQueryClient () const url = useMemo (() => { @@ -47,12 +48,12 @@ export default (({ to, const handleMouseEnter = async (ev: MouseEvent) => { onMouseEnter?.(ev) - doPrefetch () + await doPrefetch () } const handleTouchStart = async (ev: TouchEvent) => { onTouchStart?.(ev) - doPrefetch () + await doPrefetch () } const handleClick = async (ev: MouseEvent) => { @@ -78,10 +79,11 @@ export default (({ to, } return ( - ) -}) satisfies FC +}) diff --git a/frontend/src/components/TopNav.tsx b/frontend/src/components/TopNav.tsx index 9762a3d..8256759 100644 --- a/frontend/src/components/TopNav.tsx +++ b/frontend/src/components/TopNav.tsx @@ -1,18 +1,18 @@ -import axios from 'axios' -import toCamel from 'camelcase-keys' import { AnimatePresence, motion } from 'framer-motion' import { Fragment, useEffect, useLayoutEffect, useRef, useState } from 'react' -import { Link, useLocation } from 'react-router-dom' +import { useLocation } from 'react-router-dom' import Separator from '@/components/MenuSeparator' +import PrefetchLink from '@/components/PrefetchLink' import TopNavUser from '@/components/TopNavUser' -import { API_BASE_URL } from '@/config' import { WikiIdBus } from '@/lib/eventBus/WikiIdBus' +import { fetchTagByName } from '@/lib/tags' import { cn } from '@/lib/utils' +import { fetchWikiPage } from '@/lib/wiki' -import type { FC } from 'react' +import type { FC, MouseEvent } from 'react' -import type { Menu, Tag, User, WikiPage } from '@/types' +import type { Menu, User } from '@/types' type Props = { user: User | null } @@ -120,11 +120,8 @@ export default (({ user }: Props) => { const fetchPostCount = async () => { try { - const pageRes = await axios.get (`${ API_BASE_URL }/wiki/${ wikiId }`) - const wikiPage = toCamel (pageRes.data as any, { deep: true }) as WikiPage - - const tagRes = await axios.get (`${ API_BASE_URL }/tags/name/${ wikiPage.title }`) - const tag = toCamel (tagRes.data as any, { deep: true }) as Tag + const wikiPage = await fetchWikiPage (String (wikiId ?? '')) + const tag = await fetchTagByName (wikiPage.title) setPostCount (tag.postCount) } @@ -141,11 +138,11 @@ export default (({ user }: Props) => {