From 90f60a4d53eb486cf6a03cfa30785a6d57ce9313 Mon Sep 17 00:00:00 2001 From: RemoStain Date: Sun, 3 Aug 2025 16:11:28 -0600 Subject: [PATCH] Implement /posts/new form --- src/App.js | 15 +++++++++ src/components/NewPost.js | 64 +++++++++++++++++++++++++++++++++++++++ src/index.js | 6 ++++ 3 files changed, 85 insertions(+) create mode 100644 src/App.js create mode 100644 src/components/NewPost.js create mode 100644 src/index.js diff --git a/src/App.js b/src/App.js new file mode 100644 index 0000000..8957043 --- /dev/null +++ b/src/App.js @@ -0,0 +1,15 @@ +import React from 'react'; +import { BrowserRouter as Router, Routes, Route } from 'react-router-dom'; +import NewPost from './components/NewPost'; + +function App() { + return ( + + + } /> + + + ); +} + +export default App; \ No newline at end of file diff --git a/src/components/NewPost.js b/src/components/NewPost.js new file mode 100644 index 0000000..22035a9 --- /dev/null +++ b/src/components/NewPost.js @@ -0,0 +1,64 @@ +import React, { useState } from 'react'; +import axios from 'axios'; +import { useNavigate } from 'react-router-dom'; + +function NewPost() { + const [title, setTitle] = useState(''); + const [description, setDescription] = useState(''); + const [errors, setErrors] = useState([]); + const navigate = useNavigate(); + + const handleSubmit = async (e) => { + e.preventDefault(); + setErrors([]); + + try { + const response = await axios.post('http://localhost:8000/posts/', { + title, + description, + }); + + const { title: newTitle } = response.data.post; + navigate(`/posts/${encodeURIComponent(newTitle)}`); + } catch (error) { + if (error.response?.data?.errors) { + setErrors(error.response.data.errors); + } else { + setErrors(['Unexpected error occurred']); + } + } + }; + + return ( +
+

Create a New Post

+ {errors.length > 0 && ( + + )} +
+
+ + setTitle(e.target.value)} + required + /> +
+
+ +