import axios from 'axios' import toCamel from 'camelcase-keys' import { useEffect, useState } from 'react' import { Helmet } from 'react-helmet-async' import { useParams } from 'react-router-dom' import PostList from '@/components/PostList' import TagDetailSidebar from '@/components/TagDetailSidebar' import PostEditForm from '@/components/PostEditForm' import PostEmbed from '@/components/PostEmbed' import TabGroup, { Tab } from '@/components/common/TabGroup' import MainArea from '@/components/layout/MainArea' import { Button } from '@/components/ui/button' import { toast } from '@/components/ui/use-toast' import { API_BASE_URL, SITE_TITLE } from '@/config' import { cn } from '@/lib/utils' import NotFound from '@/pages/NotFound' import ServiceUnavailable from '@/pages/ServiceUnavailable' import type { FC } from 'react' import type { Post, User } from '@/types' type Props = { user: User | null } export default (({ user }: Props) => { const { id } = useParams () const [post, setPost] = useState (null) const [status, setStatus] = useState (200) const changeViewedFlg = async () => { const url = `${ API_BASE_URL }/posts/${ id }/viewed` const opt = { headers: { 'X-Transfer-Code': localStorage.getItem ('user_code') || '' } } try { if (post!.viewed) await axios.delete (url, opt) else await axios.post (url, { }, opt) // 通信に成功したら “閲覧済” をトグル setPost (post => ({ ...post!, viewed: !(post!.viewed) })) } catch { toast ({ title: '失敗……', description: '通信に失敗しました……' }) } } useEffect (() => { setPost (null) if (!(id)) return const fetchPost = async () => { try { const res = await axios.get (`${ API_BASE_URL }/posts/${ id }`, { headers: { 'X-Transfer-Code': localStorage.getItem ('user_code') ?? '' } }) setPost (toCamel (res.data as any, { deep: true }) as Post) } catch (err) { if (axios.isAxiosError (err)) setStatus (err.status ?? 200) } } fetchPost () }, [id]) switch (status) { case 404: return case 503: return } const viewedClass = (post?.viewed ? 'bg-blue-600 hover:bg-blue-700' : 'bg-gray-500 hover:bg-gray-600') return (
{(post?.thumbnail || post?.thumbnailBase) && ( )} {post && {`${ post.title || post.url } | ${ SITE_TITLE }`}}
{post ? ( <> {post.related.length > 0 ? : 'まだないよ(笑)'} {['admin', 'member'].some (r => user?.role === r) && ( { setPost (newPost) toast ({ description: '更新しました.' }) }}/> )} ) : 'Loading...'}
) }) satisfies FC