From aef97f1149317fc1a7fd2d33a1bb8e1ab2df01b2 Mon Sep 17 00:00:00 2001 From: veerjot_dm Date: Wed, 8 Jan 2025 17:23:39 +0530 Subject: [PATCH] update feedback changes --- .gitignore | 3 ++ package-lock.json | 19 ++++++++++ package.json | 3 ++ src/App.css | 1 - src/Component/Body.js | 28 +++++++------- src/Component/DarkMode.js | 40 ++++++++++---------- src/Component/Layout.js | 49 ++++++++++++------------ src/Component/Pagination.js | 18 ++++++--- src/Component/SearchBar.js | 8 ++-- src/Component/addPost.js | 18 +++++---- src/env.js | 1 - src/hooks/useFetch.js | 28 ++++++++++++++ src/styleing/SearchBar.css | 57 ++++++++++++++-------------- src/styleing/addPost.css | 74 +++++++++++++++++++------------------ src/styleing/body.css | 38 ++++++++++++------- src/styleing/layout.css | 27 ++++++++------ src/styleing/pagination.css | 63 ++++++++++++++++--------------- 17 files changed, 279 insertions(+), 196 deletions(-) delete mode 100644 src/env.js create mode 100644 src/hooks/useFetch.js diff --git a/.gitignore b/.gitignore index 4d29575..902243c 100644 --- a/.gitignore +++ b/.gitignore @@ -17,7 +17,10 @@ .env.development.local .env.test.local .env.production.local +.env npm-debug.log* yarn-debug.log* yarn-error.log* + +App.css \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index efcad56..7a5d3e6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,9 @@ "react-router-dom": "^7.1.1", "react-scripts": "5.0.1", "web-vitals": "^4.2.4" + }, + "devDependencies": { + "prettier": "3.4.2" } }, "node_modules/@alloc/quick-lru": { @@ -13314,6 +13317,22 @@ "node": ">= 0.8.0" } }, + "node_modules/prettier": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz", + "integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/pretty-bytes": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", diff --git a/package.json b/package.json index 6eff988..45cd985 100644 --- a/package.json +++ b/package.json @@ -33,5 +33,8 @@ "last 1 firefox version", "last 1 safari version" ] + }, + "devDependencies": { + "prettier": "3.4.2" } } diff --git a/src/App.css b/src/App.css index 8b13789..e69de29 100644 --- a/src/App.css +++ b/src/App.css @@ -1 +0,0 @@ - diff --git a/src/Component/Body.js b/src/Component/Body.js index 58eb16d..f0767c2 100644 --- a/src/Component/Body.js +++ b/src/Component/Body.js @@ -1,25 +1,22 @@ -import React from 'react'; +import React from "react"; import "../styleing/body.css"; -import Pagination from './Pagination'; -import AddPostForm from './addPost'; +import Pagination from "./Pagination"; +import AddPostForm from "./addPost"; function Body({ filteredData, setFilteredData, currentPage, setCurrentPage }) { const postsPerPage = 6; - const handleAddPost = (newPost) => { const postWithId = { ...newPost, id: Date.now() }; const updatedData = [postWithId, ...filteredData]; - setFilteredData(updatedData); + setFilteredData(updatedData); }; - const handleDeletePost = (id) => { const updatedData = filteredData?.filter((post) => post?.id !== id); - setFilteredData(updatedData); + setFilteredData(updatedData); }; - const indexOfLastPost = currentPage * postsPerPage; const indexOfFirstPost = indexOfLastPost - postsPerPage; const currentPosts = filteredData?.slice(indexOfFirstPost, indexOfLastPost); @@ -28,24 +25,25 @@ function Body({ filteredData, setFilteredData, currentPage, setCurrentPage }) { return (
setCurrentPage(page)} + onPageChange={(page) => setCurrentPage(page)} />
); diff --git a/src/Component/DarkMode.js b/src/Component/DarkMode.js index 75dd917..28d0165 100644 --- a/src/Component/DarkMode.js +++ b/src/Component/DarkMode.js @@ -1,21 +1,21 @@ -import React,{useState} from "react"; -function DarkMode(){ - const [theme,setTheme] = useState("light"); - const toggleTheme = ()=>{ - setTheme(theme === "light" ? "dark" : "light"); - }; - return ( -
-

{theme.charAt(0).toUpperCase()+theme.slice(1)}Mode

- -
- ); +import React, { useState } from "react"; +function DarkMode() { + const [theme, setTheme] = useState("light"); + const toggleTheme = () => { + setTheme(theme === "light" ? "dark" : "light"); + }; + return ( +
+

{theme.charAt(0).toUpperCase() + theme.slice(1)}Mode

+ +
+ ); } -export default DarkMode; \ No newline at end of file +export default DarkMode; diff --git a/src/Component/Layout.js b/src/Component/Layout.js index c860310..355a91c 100644 --- a/src/Component/Layout.js +++ b/src/Component/Layout.js @@ -1,48 +1,47 @@ import React, { useState, useEffect } from "react"; import Body from "./Body"; import SearchBar from "./SearchBar"; +import useFetch from "../hooks/useFetch"; import "../styleing/layout.css"; -import { api_url } from "../env"; + +const my_key = process.env.REACT_APP_API_KEY; const Layout = () => { - const [data, setData] = useState([]); const [filteredData, setFilteredData] = useState([]); const [currentPage, setCurrentPage] = useState(1); - const fetchData = async () => { - try { - const res = await fetch(api_url); - const fetchedData = await res?.json(); - setData(fetchedData); - setFilteredData(fetchedData); - } catch (error) { - console.error("Error fetching data:", error); - } - }; + const { data, loading, error } = useFetch(my_key); + useEffect(() => { + if (data) { + setFilteredData(data); + } + }, [data]); const handleSearch = (searchTerm) => { if (!searchTerm) { - setFilteredData(data); + setFilteredData(data); } else { - const filtered = data.filter( + const filtered = data?.filter( (post) => - post?.title.toLowerCase().includes(searchTerm?.toLowerCase()) || - post?.body.toLowerCase().includes(searchTerm?.toLowerCase()) + post?.title?.toLowerCase().includes(searchTerm?.toLowerCase()) || + post?.body?.toLowerCase().includes(searchTerm?.toLowerCase()) ); - if(filtered.length>0){ - setFilteredData([filtered[0]]); - }else{ + if (filtered?.length > 0) { + setFilteredData(filtered); + } else { setFilteredData([]); } - setCurrentPage(1); + setCurrentPage(1); } }; - useEffect(() => { - fetchData(); - }, []); - + if (loading) { + return
Loading....
; + } + if (error) { + return
Error: {error}
; + } return (
@@ -52,7 +51,7 @@ const Layout = () => {
diff --git a/src/Component/Pagination.js b/src/Component/Pagination.js index d0d4c68..057301a 100644 --- a/src/Component/Pagination.js +++ b/src/Component/Pagination.js @@ -1,5 +1,5 @@ -import React from 'react'; -import "../styleing/pagination.css" +import React from "react"; +import "../styleing/pagination.css"; const Pagination = ({ currentPage, totalPages, onPageChange }) => { const handlePageChange = (page) => { onPageChange(page); @@ -7,11 +7,19 @@ const Pagination = ({ currentPage, totalPages, onPageChange }) => { return (
- - Page {currentPage} of {totalPages} -
diff --git a/src/Component/SearchBar.js b/src/Component/SearchBar.js index b4a549c..4bfa190 100644 --- a/src/Component/SearchBar.js +++ b/src/Component/SearchBar.js @@ -1,13 +1,13 @@ -import React, { useState } from 'react'; -import '../styleing/SearchBar.css'; +import React, { useState } from "react"; +import "../styleing/SearchBar.css"; const SearchBar = ({ onSearch }) => { - const [searchTerm, setSearchTerm] = useState(''); + const [searchTerm, setSearchTerm] = useState(""); const handleInputChange = (event) => { const value = event?.target?.value; setSearchTerm(value); - onSearch(value); + onSearch(value); }; return ( diff --git a/src/Component/addPost.js b/src/Component/addPost.js index 04d0aef..37a5a66 100644 --- a/src/Component/addPost.js +++ b/src/Component/addPost.js @@ -1,32 +1,34 @@ - -import React, { useState } from 'react'; -import "../styleing/addPost.css" +import React, { useState } from "react"; +import "../styleing/addPost.css"; const AddPostForm = ({ onAddPost }) => { - const [newPost, setNewPost] = useState({ title: '', body: '' }); + const [newPost, setNewPost] = useState({ title: "", body: "" }); const handleSubmit = (e) => { e.preventDefault(); if (newPost.title && newPost.body) { - onAddPost(newPost); - setNewPost({ title: '', body: '' }); + onAddPost(newPost); + setNewPost({ title: "", body: "" }); } else { - alert('Title and Body are required!'); + alert("Title and Body are required!"); } }; + + return (
setNewPost({ ...newPost, title: e.target.value })} + onChange={(e) => setNewPost((prevState)=>({ ...prevState, title: e.target.value }))} />