diff --git a/part5/bloglist-frontend/src/App.js b/part5/bloglist-frontend/src/App.js index adfeab8..49ae691 100644 --- a/part5/bloglist-frontend/src/App.js +++ b/part5/bloglist-frontend/src/App.js @@ -9,10 +9,36 @@ const App = () => { const [user, setUser] = useState(null); const [username, setUsername] = useState(""); const [password, setPassword] = useState(""); + const [title, setTitle] = useState(""); + const [author, setAuthor] = useState(""); + const [urlAddress, setUrlAddress] = useState(""); const [errorMessage, setErrorMessage] = useState(null); const [successMessage, setSuccessMessage] = useState(null); + const resetInputFields = () => { + setUsername(""); + setPassword(""); + setTitle(""); + setAuthor(""); + setUrlAddress(""); + }; + + const setNotification = (message, type) => { + if (type === "success") { + setSuccessMessage(message); + setTimeout(() => { + setSuccessMessage(null); + }, 5000); + } else if (type === "error") { + setErrorMessage(message); + setTimeout(() => { + setErrorMessage(null); + }, 5000); + } + }; + useEffect(() => { + blogService.getAll().then((blogs) => setBlogs(blogs)); const loggedInUserLocal = window.localStorage.getItem("loggedInUser"); if (loggedInUserLocal) { @@ -26,48 +52,57 @@ const App = () => { event.preventDefault(); try { const user = await loginService.login({ username, password }); + blogService.setToken(user.token); window.localStorage.setItem("loggedInUser", JSON.stringify(user)); setUser(user); - setUsername(""); - setPassword(""); - setSuccessMessage("Login successful"); - setTimeout(() => { - setSuccessMessage(null); - }, 5000); + resetInputFields(); + setNotification("Login successful", "success"); } catch (exception) { - setErrorMessage("Wrong credentials"); - setTimeout(() => { - setErrorMessage(null); - }, 5000); + setNotification("Wrong credentials", "error"); } }; const handleLogout = async (event) => { - event.preventDefault() + event.preventDefault(); try { - setSuccessMessage('Logout successful') - setTimeout(() => { - setSuccessMessage(null); - }, 5000); - window.localStorage.clear() - blogService.setToken(null) - setUser(null) - setUsername('') - setPassword('') + setNotification("Logout successful", "success"); + window.localStorage.clear(); + blogService.setToken(null); + setUser(null); + resetInputFields(); } catch (exception) { - setErrorMessage('Logout failed. Please try again later.') - setTimeout(() => { - setErrorMessage(null); - }, 5000); + setNotification("Logout failed", "error"); } + }; - } + const handleNewBlog = async (event) => { + event.preventDefault(); + const newBlog = { + title: title, + author: author, + url: urlAddress, + }; + + blogService + .create(newBlog) + .then((returnedBlog) => { + setBlogs(blogs.concat(returnedBlog)); + resetInputFields(); + setNotification( + `A new blog ${title} by ${author} at ${urlAddress} added`, + "success" + ); + }) + .catch((error) => { + setNotification("Failed to add new blog: " + error, "error"); + }); + }; const loginForm = () => (
- username + Username { />
- password + Password { onChange={({ target }) => setPassword(target.value)} />
- +
); const blogForm = () => (
+

Create new blog

+
+
+ Title: + setTitle(target.value)} + /> +
+
+ Author: + setAuthor(target.value)} + /> +
+
+ URL: + setUrlAddress(target.value)} + /> +
+ +

All blogs

- {blogs.map((blog) => ( - - ))} + + + + + + + {blogs.map((blog) => ( + + ))} +
TitleAuthorURL
); diff --git a/part5/bloglist-frontend/src/components/Blog.js b/part5/bloglist-frontend/src/components/Blog.js index b423beb..1b61a44 100644 --- a/part5/bloglist-frontend/src/components/Blog.js +++ b/part5/bloglist-frontend/src/components/Blog.js @@ -1,7 +1,9 @@ -const Blog = ({blog}) => ( -
- {blog.title} {blog.author} -
-) +const Blog = ({ blog }) => ( + + {blog.title} + {blog.author} + {blog.url} + +); -export default Blog \ No newline at end of file +export default Blog; diff --git a/part5/bloglist-frontend/src/services/blogs.js b/part5/bloglist-frontend/src/services/blogs.js index 6e83398..1f70e29 100644 --- a/part5/bloglist-frontend/src/services/blogs.js +++ b/part5/bloglist-frontend/src/services/blogs.js @@ -4,7 +4,7 @@ const baseUrl = "/api/blogs"; let token = null; const setToken = (newToken) => { - token = `bearer ${newToken}`; + token = `Bearer ${newToken}`; }; const getAll = async () => { diff --git a/part5/bloglist-frontend/src/services/login.js b/part5/bloglist-frontend/src/services/login.js index ff0d8fa..7543395 100644 --- a/part5/bloglist-frontend/src/services/login.js +++ b/part5/bloglist-frontend/src/services/login.js @@ -3,7 +3,6 @@ const baseUrl = "/api/login"; const login = async (credentials) => { const response = await axios.post(baseUrl, credentials); - console.log(response.data); return response.data; };