Upload 2.17
This commit is contained in:
@@ -2,7 +2,7 @@
|
|||||||
"persons": [
|
"persons": [
|
||||||
{
|
{
|
||||||
"name": "Arto Hellas",
|
"name": "Arto Hellas",
|
||||||
"number": "040-123456",
|
"number": "0402213599",
|
||||||
"id": 1
|
"id": 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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
|
||||||
setPersons(persons.concat(returnedPerson));
|
.create(newPerson)
|
||||||
setShowedPersons(persons.concat(returnedPerson));
|
.then((returnedPerson) => {
|
||||||
setNewPerson({ name: "", number: "" });
|
setPersons(persons.concat(returnedPerson));
|
||||||
});
|
setShowedPersons(showedPersons.concat(returnedPerson));
|
||||||
|
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
|
||||||
|
|||||||
11
part2/phonebook/src/components/Message.js
Normal file
11
part2/phonebook/src/components/Message.js
Normal 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;
|
||||||
@@ -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>
|
||||||
);
|
);
|
||||||
|
|||||||
16
part2/phonebook/src/index.css
Normal file
16
part2/phonebook/src/index.css
Normal 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;
|
||||||
|
}
|
||||||
@@ -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(
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user