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.

118 lines
5.5 KiB

4 years ago
import React, { useState } from "react"
import { Avatar, Divider, Flex, Heading, HStack, IconButton, Text, VStack, chakra, Menu, MenuButton, MenuList, MenuItem, Box } from "@chakra-ui/react"
import { Comment } from "src/types/comments"
import Card from "components/card"
import { getUserName } from "utils/user"
import moment from 'moment'
import { MarkdownRender } from "components/markdown-editor/render"
import HeartLike from "components/posts/heart-like"
import { FaRegEdit, FaRegFlag, FaRegTrashAlt, FaReply, FaTrash } from "react-icons/fa"
import { User } from "src/types/session"
import CommentEditor from "./editor"
import { requestApi } from "utils/axios/request"
interface Props {
user: User
comment: Comment
4 years ago
parent: Comment
4 years ago
onChange: any
}
export const Reply = (props: Props) => {
4 years ago
const { comment, user,onChange,parent} = props
4 years ago
const [editorVisible, setEditorVisible] = useState(false)
const [replyVisible,setReplyVisible] = useState(false)
const [reply,setReply] = useState('')
const submitReply = async (md) => {
4 years ago
await requestApi.post('/story/comment',{targetID: parent.id, md: md})
4 years ago
setReplyVisible(false);
4 years ago
onChange()
4 years ago
}
const changeReply = async (md) => {
await requestApi.post('/story/comment',{...comment, md})
setEditorVisible(false)
onChange()
}
const deleteReply = async id => {
await requestApi.delete(`/comment/${id}`)
onChange()
}
const likeReply = async (id) => {
await requestApi.post(`/story/like/${id}`)
onChange()
}
4 years ago
const replyToReply = () => {
if (comment.creator.nickname === "") {
setReply(`@${comment.creator.username}`)
} else {
setReply(`[@${comment.creator.nickname}](/${comment.creator.username})`)
}
setReplyVisible(!replyVisible)
}
4 years ago
return (
<>{
4 years ago
editorVisible ? (user && <CommentEditor user={user} md={comment.md} onSubmit={md => {setEditorVisible(false);changeReply(md)}} onCancel={() => setEditorVisible(false)} menu={false} />) :
4 years ago
<VStack alignItems="left">
<Flex width="100%" alignItems="center" justifyContent="space-between">
<HStack spacing="4">
<Avatar src={comment.creator.avatar} width="40px" height="40px"></Avatar>
<VStack alignItems="left">
<Heading size="sm" fontSize="1.1rem">{getUserName(comment.creator)}</Heading>
</VStack>
</HStack>
<Text layerStyle="textSecondary" ml="2" fontSize=".9rem">{moment(comment.created).fromNow()}</Text>
</Flex>
<MarkdownRender md={comment.md} pl="16" pr="2" mt="3" />
<Flex justifyContent="space-between" pl="16" pr="2">
<HeartLike liked={comment.liked} count={comment.likes} onClick={() => likeReply(comment.id)} />
<HStack>
{user && <IconButton
aria-label="go to github"
variant="ghost"
_focus={null}
color="gray.500"
icon={<FaReply />}
4 years ago
onClick={replyToReply}
4 years ago
fontSize="18px"
/>}
<Menu>
<IconButton
as={MenuButton}
aria-label="go to github"
variant="ghost"
_focus={null}
color="gray.500"
icon={<chakra.svg fill='gray.500' height="21px" viewBox="0 0 512 512"><path d="M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm216 248c0 118.7-96.1 216-216 216-118.7 0-216-96.1-216-216 0-118.7 96.1-216 216-216 118.7 0 216 96.1 216 216zm-207.5 86.6l115-115.1c4.7-4.7 4.7-12.3 0-17l-7.1-7.1c-4.7-4.7-12.3-4.7-17 0L256 303l-99.5-99.5c-4.7-4.7-12.3-4.7-17 0l-7.1 7.1c-4.7 4.7-4.7 12.3 0 17l115 115.1c4.8 4.6 12.4 4.6 17.1-.1z"></path></chakra.svg>}
_hover={null}
_active={null}
/>
<MenuList>
{user && <MenuItem onClick={() => setEditorVisible(true)}><FaRegEdit /><chakra.span ml="2">Edit</chakra.span></MenuItem>}
{user && <MenuItem onClick={() => deleteReply(comment.id)}><FaRegTrashAlt /><chakra.span ml="2">Delete</chakra.span></MenuItem>}
<MenuItem><FaRegFlag /><chakra.span ml="2">Report</chakra.span></MenuItem>
</MenuList>
</Menu>
</HStack>
</Flex>
{replyVisible &&
<Box pl="16" pr="2">
4 years ago
<CommentEditor user={user} md={reply} onSubmit={md => {submitReply(md)}} onCancel={() => setReplyVisible(false)} menu={false}/>
4 years ago
</Box>}
</VStack>}
</>
)
}
export default Reply