import { Menu, MenuButton, MenuList, MenuItem, Text, Box, Heading, Image, HStack, Center, Button, Flex, Modal, ModalOverlay, ModalContent, ModalHeader, ModalBody, ModalFooter, FormControl, FormLabel, FormHelperText, Input, FormErrorMessage, VStack, Textarea, Divider, useColorModeValue, useToast } from "@chakra-ui/react" import Card from "components/card" import Sidebar from "layouts/sidebar/sidebar" import React, { useEffect, useState } from "react" import { editorLinks } from "src/data/links" import { requestApi } from "utils/axios/request" import { useDisclosure } from "@chakra-ui/react" import { Field, Form, Formik } from "formik" import { config } from "configs/config" import TextStoryCard from "components/story/text-story-card" import { Story } from "src/types/story" import { FaExternalLinkAlt, FaRegEdit } from "react-icons/fa" import { useRouter } from "next/router" import { ReserveUrls } from "src/data/reserve-urls" import Link from "next/link" import PageContainer1 from "layouts/page-container1" import Empty from "components/empty" import { IDType } from "src/types/id" var validator = require('validator'); const newSeries: Story = { title: '', brief: '', cover: '', type: IDType.Series } const PostsPage = () => { const [currentSeries, setCurrentSeries] = useState(null) const [posts, setPosts] = useState([]) const router = useRouter() const toast = useToast() const getPosts = () => { requestApi.get(`/story/posts/editor?type=${IDType.Series}`).then((res) => setPosts(res.data)).catch(_ => setPosts([])) } useEffect(() => { getPosts() }, []) function validateTitle(value) { let error if (!value?.trim()) { error = "标题不能为空" } if (value?.length > config.posts.titleMaxLen) { error = "标题长度不能超过128" } return error } function validateUrl(value) { let error if (value && !validator.isURL(value)) { error = "URL格式不合法" } return error } function validateBrief(value) { let error if (value && value.length > config.posts.briefMaxLen) { error = `文本长度不能超过${config.posts.briefMaxLen}` } return error } const submitPost = async (values, _) => { await requestApi.post(`/story`, values) toast({ description: "提交成功", status: "success", duration: 2000, isClosable: true, }) setCurrentSeries(null) getPosts() } const editPost = (post: Story) => { console.log(post) setCurrentSeries(post) } const onDeletePost = async (id) => { await requestApi.delete(`/story/post/${id}`) getPosts() toast({ description: "删除成功", status: "success", duration: 2000, isClosable: true, }) } return ( <> {currentSeries ? <> {(props) => (
{({ field, form }) => ( 标题 {form.errors.title} )} {({ field, form }) => ( 封面图片 {form.errors.cover} )} {({ field, form }) => ( 简介 {form.errors.brief} )} {({ field, form }) => ( 关联文章 )}
)}
: <> 系列({posts.length}) { posts.length === 0 ? : <> {posts.map(post => editPost(post)} onDelete={() => onDeletePost(post.id)} showSource={false} /> )}
没有更多文章了
} }
) } export default PostsPage