import { NextPage } from "next"; import { NextSeo } from "next-seo"; import { useRouter } from "next/router"; import { FormEvent, useCallback, useState } from "react"; import axios from "axios"; import { User } from "@prisma/client"; import { Post } from "@models/post"; import { Response } from "@models/response"; import { parseUserInputError } from "@utils/errors"; import { parseAxiosError, parseAxiosResponse } from "@utils/fetch"; import { withSessionSsr } from "@utils/session"; import EmptyPage from "@components/EmptyPage"; import Layout from "@components/Layout"; const NewPostPage: NextPage<{ user: User }> = ({ user }) => { const [title, setTitle] = useState(""); const [tags, setTags] = useState(""); const [content, setContent] = useState(""); const [publish, setPublish] = useState(false); const [error, setError] = useState(null); const router = useRouter(); const createPost = useCallback( async (e: FormEvent) => { e.preventDefault(); const parseUserInputResult = Post.safeParse({ title, tags, content, publish }); if (!parseUserInputResult.success) { setError(parseUserInputError(parseUserInputResult.error.message)); return; } const response: Response = await axios .post("/api/blog/new", parseUserInputResult.data) .then(parseAxiosResponse) .catch(parseAxiosError); if (response.ok) { router.push("/blog"); } else { setError(JSON.stringify(response.error)); } }, [title, tags, content, publish, router] ); return (

Create new post

Logged in as {user.name}
setTitle(e.target.value)} required className="form-input" name="title" type="text" id="title" placeholder="Title" /> setTags(e.target.value)} required className="form-input" name="tags" type="text" id="tags" placeholder="A space seperated list of tags" />