diff --git a/src/App.jsx b/src/App.jsx index c5da47b..8a9e60f 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -3,44 +3,18 @@ import { BrowserRouter as Router, Routes, Route } from "react-router-dom"; import UserList from "./components/UserList"; import UserDetails from "./components/UserDetails"; import EditUser from "./components/EditUser"; -import './styles.css'; - -const RouteWithProps = ({ Component, props }) => { - return ; -}; - +import "./styles.css"; + const App = () => { - const [users, setUsers] = useState([]); - - useEffect(() => { - const storedUsers = JSON.parse(localStorage.getItem("users")) || []; - setUsers(storedUsers); - }, []); - - useEffect(() => { - localStorage.setItem("users", JSON.stringify(users)); - }, [users]); - - const sharedProps = { users, setUsers }; - return ( - } - /> - } - /> - } - /> + } /> + } /> + } /> ); }; - -export default App; \ No newline at end of file + +export default App; diff --git a/src/components/EditUser.jsx b/src/components/EditUser.jsx index 985b26e..1943dd9 100644 --- a/src/components/EditUser.jsx +++ b/src/components/EditUser.jsx @@ -1,11 +1,18 @@ -import React, { useEffect } from "react"; +import React, { useState, useEffect } from "react"; import { useParams, useNavigate } from "react-router-dom"; import { useForm, Controller } from "react-hook-form"; -const EditUser = ({ users, setUsers }) => { +const EditUser = () => { const { id } = useParams(); const navigate = useNavigate(); + const [users, setUsers] = useState([]); + + useEffect(() => { + const storedUsers = JSON.parse(localStorage.getItem("users")) || []; + setUsers(storedUsers); + }, []); + const { control, handleSubmit, @@ -21,32 +28,35 @@ const EditUser = ({ users, setUsers }) => { }); useEffect(() => { - if (id !== "new") { + if (id && id !== "new") { const existingUser = users.find((user) => user.id === parseInt(id)); if (existingUser) { - reset(existingUser); // Populate form with the existing user data + reset(existingUser); } } }, [id, users, reset]); const onSubmit = (data) => { + let updatedUsers; if (id === "new") { - const newUser = { ...data, id: users.length + 1 }; // Generate a new ID - setUsers([...users, newUser]); + const newUser = { ...data, id: users.length + 1 }; + updatedUsers = [...users, newUser]; alert("User added successfully!"); } else { - setUsers( - users.map((user) => - user.id === parseInt(id) ? { ...data, id: user.id } : user - ) + updatedUsers = users.map((user) => + user.id === parseInt(id) ? { ...data, id: user.id } : user ); alert("User updated successfully!"); } + setUsers(updatedUsers); + localStorage.setItem("users", JSON.stringify(updatedUsers)); navigate("/"); }; const handleDelete = () => { - setUsers(users.filter((user) => user.id !== parseInt(id))); + const updatedUsers = users.filter((user) => user.id !== parseInt(id)); + setUsers(updatedUsers); + localStorage.setItem("users", JSON.stringify(updatedUsers)); alert(`User with ID ${id} deleted.`); navigate("/"); }; @@ -63,10 +73,7 @@ const EditUser = ({ users, setUsers }) => { control={control} rules={{ required: "Name is required." }} render={({ field }) => ( - + )} /> {errors.name && {errors.name.message}} @@ -84,10 +91,7 @@ const EditUser = ({ users, setUsers }) => { }, }} render={({ field }) => ( - + )} /> {errors.email && {errors.email.message}} @@ -105,10 +109,7 @@ const EditUser = ({ users, setUsers }) => { }, }} render={({ field }) => ( - + )} /> {errors.phone && {errors.phone.message}} @@ -120,7 +121,8 @@ const EditUser = ({ users, setUsers }) => { control={control} rules={{ pattern: { - value: /^(https?:\/\/)?([\w\d\-_]+\.)+[\w\d\-_]+(\/[\w\d\-_.?&=]*)*\/?$/, + value: + /^(https?:\/\/)?([\w\d\-_]+\.)+[\w\d\-_]+(\/[\w\d\-_.?&=]*)*\/?$/, message: "Invalid website URL.", }, }} diff --git a/src/components/UserDetails.jsx b/src/components/UserDetails.jsx index 7f4ec76..7fe5883 100644 --- a/src/components/UserDetails.jsx +++ b/src/components/UserDetails.jsx @@ -1,19 +1,29 @@ -import React from "react"; +import React, { useState, useEffect } from "react"; import { useParams, useNavigate } from "react-router-dom"; -const UserDetails = ({ users, setUsers }) => { +const UserDetails = () => { const { id } = useParams(); const navigate = useNavigate(); + const [users, setUsers] = useState([]); + + useEffect(() => { + const storedUsers = JSON.parse(localStorage.getItem("users")) || []; + setUsers(storedUsers); + }, []); + + useEffect(() => { + localStorage.setItem("users", JSON.stringify(users)); + }, [users]); + const userId = parseInt(id, 10); const user = users.find((user) => user.id === userId); const handleDelete = () => { - const updatedUsers = users.filter((user) => user.id !== userId); - setUsers([...updatedUsers]); + setUsers(updatedUsers); alert(`User with ID ${id} deleted.`); - navigate("/"); + navigate("/"); }; if (!user) { diff --git a/src/components/UserList.jsx b/src/components/UserList.jsx index 45cf504..0c7fdc7 100644 --- a/src/components/UserList.jsx +++ b/src/components/UserList.jsx @@ -2,22 +2,20 @@ import React, { useState, useEffect } from "react"; import { Link } from "react-router-dom"; import axios from "axios"; -const UserList = ({ users, setUsers }) => { +const UserList = () => { + const [users, setUsers] = useState([]); const [searchTerm, setSearchTerm] = useState(""); const [currentPage, setCurrentPage] = useState(1); - const usersPerPage = 5; // Number of users to display per page - + const usersPerPage = 5; useEffect(() => { - if (users.length === 0) { - axios - .get("https://jsonplaceholder.typicode.com/users") - .then((response) => setUsers(response.data)) - .catch((error) => console.error("Error fetching users:", error)); - } - }, [users, setUsers]); + const storedUsers = JSON.parse(localStorage.getItem("users")) || []; + setUsers(storedUsers); + }, []); const handleDelete = (id) => { - setUsers(users.filter((user) => user.id !== id)); + const updatedUsers = users.filter((user) => user.id !== id); + setUsers(updatedUsers); + localStorage.setItem("users", JSON.stringify(updatedUsers)); alert(`User with ID ${id} deleted.`); }; @@ -27,7 +25,6 @@ const UserList = ({ users, setUsers }) => { user.email.toLowerCase().includes(searchTerm.toLowerCase()) ); - // Calculate pagination details const indexOfLastUser = currentPage * usersPerPage; const indexOfFirstUser = indexOfLastUser - usersPerPage; const currentUsers = filteredUsers.slice(indexOfFirstUser, indexOfLastUser);