fullstackopen-notes/parts/2/phoneBook/src/App.jsx

75 lines
1.7 KiB
React
Raw Normal View History

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;