Changes done according to PR

This commit is contained in:
bansh_dml 2025-01-02 12:10:00 +05:30
parent 6337befab6
commit 38335cef91
4 changed files with 57 additions and 74 deletions

View file

@ -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>
);

View file

@ -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.",
},
}}

View file

@ -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("/");
};

View file

@ -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);