You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

101 lines
3.3 KiB

4 years ago
import { Box, Button, chakra, Divider, Flex, Heading, HStack, Image, Radio, RadioGroup, Stack, Text} from "@chakra-ui/react"
4 years ago
import Comments from "components/comments/comments"
4 years ago
import { MarkdownRender } from "components/markdown-editor/render"
4 years ago
import { StoryAuthor } from "components/story/story-author"
import TagTextCard from "components/story/tag-text-card"
4 years ago
import SEO from "components/seo"
import siteConfig from "configs/site-config"
4 years ago
import PostNav from "layouts/nav/post-nav"
4 years ago
import PageContainer from "layouts/page-container"
import { useRouter } from "next/router"
4 years ago
import React, { useEffect, useState } from "react"
4 years ago
import { Story } from "src/types/story"
4 years ago
import { requestApi } from "utils/axios/request"
4 years ago
import StorySidebar from "components/story/story-sidebar"
4 years ago
import Series from "components/story/series"
import Card from "components/card"
4 years ago
import { FaFlag, FaRegFlag } from "react-icons/fa"
import Head from "next/head"
import { getSvgIcon } from "components/svg-icon"
import Report from "components/report"
4 years ago
4 years ago
const PostPage = () => {
4 years ago
const router = useRouter()
4 years ago
const id = router.query.post_id
4 years ago
const [post, setPost]: [Story, any] = useState(null)
4 years ago
const [series,setSeries] = useState([])
4 years ago
const [report,setReport] = useState(false)
4 years ago
useEffect(() => {
4 years ago
if (id) {
getData()
4 years ago
getSeries()
4 years ago
}
4 years ago
}, [id])
4 years ago
useEffect(() => {
if (router && router.asPath.indexOf("#comments") > -1) {
setTimeout(() => {
location.href = "#comments"
4 years ago
}, 100)
4 years ago
}
4 years ago
}, [router])
4 years ago
4 years ago
const getData = async () => {
4 years ago
const res = await requestApi.get(`/story/post/${id}`)
4 years ago
setPost(res.data)
}
4 years ago
4 years ago
const getSeries = async () => {
const res = await requestApi.get(`/story/series/byPostID/${id}`)
setSeries(res.data)
}
4 years ago
4 years ago
return (
4 years ago
<>
<SEO
title={siteConfig.seo.title}
description={siteConfig.seo.description}
/>
4 years ago
{post && <PageContainer nav={<PostNav post={post} />} mt="2rem">
<>
<HStack alignItems="top" spacing={[0, 0, 14, 14]}>
<Box width={["100%", "100%", "75%", "75%"]} height="fit-content" pl={[0, 0, "0%", "10%"]}>
<Image src={post.cover} />
<Box px="2">
4 years ago
<Heading size="lg" my="6" lineHeight="1.5">{post.title}</Heading>
4 years ago
4 years ago
<Divider my="4" />
4 years ago
<Flex width="100%" justifyContent="space-between" display="flex" alignItems="start" layerStyle="textSecondary" cursor="pointer" onClick={() => setReport(true)}>
<StoryAuthor story={post} />
<HStack>
<FaRegFlag />
<Text>Report</Text>
</HStack>
</Flex>
4 years ago
<Divider my="4" />
4 years ago
4 years ago
{report && <Report targetID={post.id} onClose={() => setReport(false)}/>}
4 years ago
<MarkdownRender md={post.md} py="2" mt="6" />
4 years ago
</Box>
4 years ago
<HStack ml="2" spacing="3" mt="4">{post.rawTags.map(tag => <TagTextCard key={tag.id} tag={tag} />)}</HStack>
4 years ago
{series.length > 0 && <Card p="0" mt="4"><Series postID={post.id} series={series}/></Card>}
<Box mt="6" p="2"><Comments storyID={post.id} /></Box>
4 years ago
</Box>
<Box pt="16">
4 years ago
<StorySidebar story={post} />
4 years ago
</Box>
</HStack>
4 years ago
4 years ago
</>
4 years ago
</PageContainer>
4 years ago
}
4 years ago
</>
)
}
export default PostPage
4 years ago
4 years ago