Changes done according to PR
This commit is contained in:
parent
6337befab6
commit
38335cef91
34
src/App.jsx
34
src/App.jsx
|
@ -3,41 +3,15 @@ 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 <Component {...props} />;
|
||||
};
|
||||
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 (
|
||||
<Router>
|
||||
<Routes>
|
||||
<Route
|
||||
path="/"
|
||||
element={<RouteWithProps Component={UserList} props={sharedProps} />}
|
||||
/>
|
||||
<Route
|
||||
path="/user/:id"
|
||||
element={<RouteWithProps Component={UserDetails} props={sharedProps} />}
|
||||
/>
|
||||
<Route
|
||||
path="/edit/:id"
|
||||
element={<RouteWithProps Component={EditUser} props={sharedProps} />}
|
||||
/>
|
||||
<Route path="/" element={<UserList />} />
|
||||
<Route path="/user/:id" element={<UserDetails />} />
|
||||
<Route path="/edit/:id" element={<EditUser />} />
|
||||
</Routes>
|
||||
</Router>
|
||||
);
|
||||
|
|
|
@ -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) =>
|
||||
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 }) => (
|
||||
<input
|
||||
{...field}
|
||||
className={errors.name ? "error-input" : ""}
|
||||
/>
|
||||
<input {...field} className={errors.name ? "error-input" : ""} />
|
||||
)}
|
||||
/>
|
||||
{errors.name && <span>{errors.name.message}</span>}
|
||||
|
@ -84,10 +91,7 @@ const EditUser = ({ users, setUsers }) => {
|
|||
},
|
||||
}}
|
||||
render={({ field }) => (
|
||||
<input
|
||||
{...field}
|
||||
className={errors.email ? "error-input" : ""}
|
||||
/>
|
||||
<input {...field} className={errors.email ? "error-input" : ""} />
|
||||
)}
|
||||
/>
|
||||
{errors.email && <span>{errors.email.message}</span>}
|
||||
|
@ -105,10 +109,7 @@ const EditUser = ({ users, setUsers }) => {
|
|||
},
|
||||
}}
|
||||
render={({ field }) => (
|
||||
<input
|
||||
{...field}
|
||||
className={errors.phone ? "error-input" : ""}
|
||||
/>
|
||||
<input {...field} className={errors.phone ? "error-input" : ""} />
|
||||
)}
|
||||
/>
|
||||
{errors.phone && <span>{errors.phone.message}</span>}
|
||||
|
@ -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.",
|
||||
},
|
||||
}}
|
||||
|
|
|
@ -1,17 +1,27 @@
|
|||
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("/");
|
||||
};
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue