Upload 5.3 and 5.4

This commit is contained in:
Andrew Trieu
2023-06-19 15:06:53 +03:00
parent 714cc5d171
commit bef62485da
4 changed files with 113 additions and 39 deletions

View File

@@ -9,10 +9,36 @@ const App = () => {
const [user, setUser] = useState(null); const [user, setUser] = useState(null);
const [username, setUsername] = useState(""); const [username, setUsername] = useState("");
const [password, setPassword] = useState(""); const [password, setPassword] = useState("");
const [title, setTitle] = useState("");
const [author, setAuthor] = useState("");
const [urlAddress, setUrlAddress] = useState("");
const [errorMessage, setErrorMessage] = useState(null); const [errorMessage, setErrorMessage] = useState(null);
const [successMessage, setSuccessMessage] = 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(() => { useEffect(() => {
blogService.getAll().then((blogs) => setBlogs(blogs));
const loggedInUserLocal = window.localStorage.getItem("loggedInUser"); const loggedInUserLocal = window.localStorage.getItem("loggedInUser");
if (loggedInUserLocal) { if (loggedInUserLocal) {
@@ -26,48 +52,57 @@ const App = () => {
event.preventDefault(); event.preventDefault();
try { try {
const user = await loginService.login({ username, password }); const user = await loginService.login({ username, password });
blogService.setToken(user.token);
window.localStorage.setItem("loggedInUser", JSON.stringify(user)); window.localStorage.setItem("loggedInUser", JSON.stringify(user));
setUser(user); setUser(user);
setUsername(""); resetInputFields();
setPassword(""); setNotification("Login successful", "success");
setSuccessMessage("Login successful");
setTimeout(() => {
setSuccessMessage(null);
}, 5000);
} catch (exception) { } catch (exception) {
setErrorMessage("Wrong credentials"); setNotification("Wrong credentials", "error");
setTimeout(() => {
setErrorMessage(null);
}, 5000);
} }
}; };
const handleLogout = async (event) => { const handleLogout = async (event) => {
event.preventDefault() event.preventDefault();
try { try {
setSuccessMessage('Logout successful') setNotification("Logout successful", "success");
setTimeout(() => { window.localStorage.clear();
setSuccessMessage(null); blogService.setToken(null);
}, 5000); setUser(null);
window.localStorage.clear() resetInputFields();
blogService.setToken(null)
setUser(null)
setUsername('')
setPassword('')
} catch (exception) { } catch (exception) {
setErrorMessage('Logout failed. Please try again later.') setNotification("Logout failed", "error");
setTimeout(() => {
setErrorMessage(null);
}, 5000);
} }
};
} 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 = () => ( const loginForm = () => (
<form onSubmit={handleLogin}> <form onSubmit={handleLogin}>
<div> <div>
username Username
<input <input
type="text" type="text"
value={username} value={username}
@@ -76,7 +111,7 @@ const App = () => {
/> />
</div> </div>
<div> <div>
password Password
<input <input
type="password" type="password"
value={password} value={password}
@@ -84,16 +119,54 @@ const App = () => {
onChange={({ target }) => setPassword(target.value)} onChange={({ target }) => setPassword(target.value)}
/> />
</div> </div>
<button type="submit">login</button> <button type="submit">Login</button>
</form> </form>
); );
const blogForm = () => ( const blogForm = () => (
<div> <div>
<h2> Create new blog</h2>
<form onSubmit={handleNewBlog}>
<div>
Title:
<input
type="text"
value={title}
name="Title"
onChange={({ target }) => setTitle(target.value)}
/>
</div>
<div>
Author:
<input
type="text"
value={author}
name="Author"
onChange={({ target }) => setAuthor(target.value)}
/>
</div>
<div>
URL:
<input
type="text"
value={urlAddress}
name="Url"
onChange={({ target }) => setUrlAddress(target.value)}
/>
</div>
<button type="submit">Create</button>
</form>
<h2> All blogs</h2> <h2> All blogs</h2>
<table>
<tr>
<th>Title</th>
<th>Author</th>
<th>URL</th>
</tr>
{blogs.map((blog) => ( {blogs.map((blog) => (
<Blog key={blog.id} blog={blog} /> <Blog key={blog.id} blog={blog} />
))} ))}
</table>
</div> </div>
); );

View File

@@ -1,7 +1,9 @@
const Blog = ({ blog }) => ( const Blog = ({ blog }) => (
<div> <tr>
{blog.title} {blog.author} <td>{blog.title}</td>
</div> <td>{blog.author}</td>
) <td>{blog.url}</td>
</tr>
);
export default Blog export default Blog;

View File

@@ -4,7 +4,7 @@ const baseUrl = "/api/blogs";
let token = null; let token = null;
const setToken = (newToken) => { const setToken = (newToken) => {
token = `bearer ${newToken}`; token = `Bearer ${newToken}`;
}; };
const getAll = async () => { const getAll = async () => {

View File

@@ -3,7 +3,6 @@ const baseUrl = "/api/login";
const login = async (credentials) => { const login = async (credentials) => {
const response = await axios.post(baseUrl, credentials); const response = await axios.post(baseUrl, credentials);
console.log(response.data);
return response.data; return response.data;
}; };