Upload 2.17

This commit is contained in:
AndrewTrieu
2023-03-23 17:21:52 +02:00
parent 19573d026d
commit 4b4ec342b4
7 changed files with 73 additions and 16 deletions

View File

@@ -2,7 +2,7 @@
"persons": [ "persons": [
{ {
"name": "Arto Hellas", "name": "Arto Hellas",
"number": "040-123456", "number": "0402213599",
"id": 1 "id": 1
}, },
{ {

View File

@@ -1,14 +1,16 @@
import { useState, useEffect } from "react"; import { useState, useEffect } from "react";
import personService from "./services/personService.js"; import personService from "./services/personService";
import PersonForm from "./components/PersonForm"; import PersonForm from "./components/PersonForm";
import Filter from "./components/Filter"; import Filter from "./components/Filter";
import ShowPersons from "./components/ShowPersons"; import ShowPersons from "./components/ShowPersons";
import Message from "./components/Message";
const App = () => { const App = () => {
const [persons, setPersons] = useState([]); const [persons, setPersons] = useState([]);
const [newPerson, setNewPerson] = useState({ name: "", number: "" }); const [newPerson, setNewPerson] = useState({ name: "", number: "" });
const [filter, setFilter] = useState(""); const [filter, setFilter] = useState("");
const [showedPersons, setShowedPersons] = useState([]); const [showedPersons, setShowedPersons] = useState([]);
const [message, setMessage] = useState(null);
useEffect(() => { useEffect(() => {
personService.getAll().then((initialPersons) => { personService.getAll().then((initialPersons) => {
@@ -17,39 +19,64 @@ const App = () => {
}); });
}, []); }, []);
useEffect(() => {
setTimeout(() => {
setMessage(null);
}, 5000);
}, [message]);
const addPerson = (event) => { const addPerson = (event) => {
event.preventDefault(); event.preventDefault();
if (persons.find((person) => person.name === newPerson.name)) { const personExists = persons.find(
(person) => person.name === newPerson.name
);
if (personExists) {
if ( if (
window.confirm( window.confirm(
`${newPerson.name} is already added to phonebook, replace the old number with a new one?` `${newPerson.name} is already added to phonebook, replace the old number with a new one?`
) )
) { ) {
const person = persons.find((person) => person.name === newPerson.name); const updatedPerson = { ...personExists, number: newPerson.number };
const changedPerson = { ...person, number: newPerson.number };
personService personService
.update(person.id, changedPerson) .update(updatedPerson.id, updatedPerson)
.then((returnedPerson) => { .then((returnedPerson) => {
setPersons( setPersons(
persons.map((person) => persons.map((person) =>
person.id !== returnedPerson.id ? person : returnedPerson person.id !== updatedPerson.id ? person : returnedPerson
) )
); );
setShowedPersons( setShowedPersons(
persons.map((person) => showedPersons.map((person) =>
person.id !== returnedPerson.id ? person : returnedPerson person.id !== updatedPerson.id ? person : returnedPerson
) )
); );
setNewPerson({ name: "", number: "" }); setMessage(`Updated ${returnedPerson.name}`);
})
.catch((error) => {
setMessage(
`Information of ${updatedPerson.name} has already been removed from server`
);
setPersons(
persons.filter((person) => person.id !== updatedPerson.id)
);
setShowedPersons(
showedPersons.filter((person) => person.id !== updatedPerson.id)
);
}); });
} }
} else { } else {
personService.create(newPerson).then((returnedPerson) => { personService
.create(newPerson)
.then((returnedPerson) => {
setPersons(persons.concat(returnedPerson)); setPersons(persons.concat(returnedPerson));
setShowedPersons(persons.concat(returnedPerson)); setShowedPersons(showedPersons.concat(returnedPerson));
setNewPerson({ name: "", number: "" }); setMessage(`Added ${returnedPerson.name}`);
})
.catch((error) => {
setMessage(error.response.data.error);
}); });
} }
setNewPerson({ name: "", number: "" });
}; };
const deletePerson = (id, name) => { const deletePerson = (id, name) => {
@@ -78,6 +105,7 @@ const App = () => {
return ( return (
<div> <div>
<h2>Phonebook</h2> <h2>Phonebook</h2>
<Message message={message} />
<Filter filter={filter} filterByName={filterByName} /> <Filter filter={filter} filterByName={filterByName} />
<h2>Add a new number</h2> <h2>Add a new number</h2>
<PersonForm <PersonForm

View File

@@ -0,0 +1,11 @@
const Message = ({ message }) => {
if (message === null) {
return null;
} else if (message.includes("Added") || message.includes("Updated")) {
return <div className="success-message">{message}</div>;
} else {
return <div className="error-message">{message}</div>;
}
};
export default Message;

View File

@@ -10,7 +10,7 @@ const PersonForm = ({ addPerson, newPerson, handleChange }) => {
<input name="number" value={newPerson.number} onChange={handleChange} /> <input name="number" value={newPerson.number} onChange={handleChange} />
</div> </div>
<div> <div>
<button type="submit">add</button> <button type="submit">Add</button>
</div> </div>
</form> </form>
); );

View File

@@ -0,0 +1,16 @@
.success-message {
color: green;
}
.error-message {
color: red;
}
.success-message, .error-message {
background: gray;
font-size: 20px;
border-style: solid;
border-radius: 5px;
padding: 10px;
margin-bottom: 10px;
}

View File

@@ -1,6 +1,7 @@
import React from "react"; import React from "react";
import ReactDOM from "react-dom/client"; import ReactDOM from "react-dom/client";
import App from "./App"; import App from "./App";
import "./index.css";
const root = ReactDOM.createRoot(document.getElementById("root")); const root = ReactDOM.createRoot(document.getElementById("root"));
root.render( root.render(

View File

@@ -1,5 +1,6 @@
import axios from "axios"; import axios from "axios";
const baseUrl = "http://localhost:3001/persons"; const baseUrl = "http://localhost:3001/persons";
const getAll = () => { const getAll = () => {
const request = axios.get(baseUrl); const request = axios.get(baseUrl);
return request.then((response) => response.data); return request.then((response) => response.data);