2025-05-24 23:43:23 +02:00
|
|
|
import { useState } from "react";
|
2025-05-25 00:00:13 +02:00
|
|
|
import PersonList from "./components/PersonList";
|
2025-05-24 23:43:23 +02:00
|
|
|
|
2025-05-25 12:08:25 +02:00
|
|
|
const SearchArea = ({ onChangeHandler }) => {
|
|
|
|
|
return (
|
|
|
|
|
<div>
|
|
|
|
|
search name: <input onChange={onChangeHandler} />
|
|
|
|
|
</div>
|
|
|
|
|
);
|
|
|
|
|
};
|
|
|
|
|
|
2025-05-24 23:43:23 +02:00
|
|
|
const App = () => {
|
2025-05-25 11:55:15 +02:00
|
|
|
const [persons, setPersons] = useState([
|
|
|
|
|
{ name: "Arto Hellas", number: 123 },
|
|
|
|
|
]);
|
2025-05-25 12:04:02 +02:00
|
|
|
const [searchString, setSearchString] = useState("");
|
2025-05-24 23:43:23 +02:00
|
|
|
const [newName, setNewName] = useState("");
|
2025-05-25 11:55:15 +02:00
|
|
|
const [newNumber, setNewNumber] = useState("");
|
2025-05-24 23:43:23 +02:00
|
|
|
|
2025-05-25 00:00:13 +02:00
|
|
|
const handleOnSubmit = (event) => {
|
|
|
|
|
event.preventDefault();
|
2025-05-25 00:10:10 +02:00
|
|
|
if (
|
|
|
|
|
persons.some((person) => {
|
|
|
|
|
return person.name === newName;
|
|
|
|
|
})
|
|
|
|
|
) {
|
|
|
|
|
alert(`${newName} is already in the phonebook.`);
|
|
|
|
|
return;
|
|
|
|
|
}
|
2025-05-25 11:55:15 +02:00
|
|
|
setPersons(persons.concat({ name: newName, number: newNumber }));
|
2025-05-25 12:04:02 +02:00
|
|
|
|
|
|
|
|
setNewName("");
|
|
|
|
|
setNewNumber("");
|
2025-05-25 00:00:13 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const handleNameChange = (event) => {
|
|
|
|
|
setNewName(event.target.value);
|
|
|
|
|
};
|
|
|
|
|
|
2025-05-25 11:55:15 +02:00
|
|
|
const handleNumberChange = (event) => {
|
|
|
|
|
setNewNumber(event.target.value);
|
|
|
|
|
};
|
|
|
|
|
|
2025-05-25 12:04:02 +02:00
|
|
|
const handleSearchChange = (event) => {
|
|
|
|
|
setSearchString(event.target.value);
|
|
|
|
|
};
|
|
|
|
|
|
2025-05-24 23:43:23 +02:00
|
|
|
return (
|
|
|
|
|
<div>
|
|
|
|
|
<h2>Phonebook</h2>
|
2025-05-25 12:08:25 +02:00
|
|
|
<SearchArea onChangeHandler={handleSearchChange} />
|
2025-05-25 12:04:02 +02:00
|
|
|
<h3>Add new</h3>
|
2025-05-25 00:00:13 +02:00
|
|
|
<form onSubmit={handleOnSubmit}>
|
2025-05-24 23:43:23 +02:00
|
|
|
<div>
|
2025-05-25 12:04:02 +02:00
|
|
|
name: <input value={newName} onChange={handleNameChange} />
|
2025-05-24 23:43:23 +02:00
|
|
|
</div>
|
2025-05-25 11:55:15 +02:00
|
|
|
<div>
|
2025-05-25 12:04:02 +02:00
|
|
|
number: <input value={newNumber} onChange={handleNumberChange} />
|
2025-05-25 11:55:15 +02:00
|
|
|
</div>
|
2025-05-24 23:43:23 +02:00
|
|
|
<div>
|
|
|
|
|
<button type="submit">add</button>
|
|
|
|
|
</div>
|
|
|
|
|
</form>
|
2025-05-25 12:04:02 +02:00
|
|
|
<h3>Numbers</h3>
|
|
|
|
|
<PersonList
|
|
|
|
|
persons={persons.filter((person) =>
|
|
|
|
|
person.name.toUpperCase().includes(searchString.toUpperCase())
|
|
|
|
|
)}
|
|
|
|
|
/>
|
2025-05-24 23:43:23 +02:00
|
|
|
</div>
|
|
|
|
|
);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export default App;
|