diff --git a/package-lock.json b/package-lock.json index 6cffc66d..0b3681f9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,9 +8,11 @@ "name": "sprintmisson5", "version": "0.0.0", "dependencies": { + "lodash": "^4.17.21", "react": "^19.1.0", "react-dom": "^19.1.0", - "react-icons": "^5.5.0" + "react-icons": "^5.5.0", + "react-router-dom": "^7.6.0" }, "devDependencies": { "@eslint/js": "^9.25.0", @@ -2719,6 +2721,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -3179,6 +3187,53 @@ "node": ">=0.10.0" } }, + "node_modules/react-router": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.6.0.tgz", + "integrity": "sha512-GGufuHIVCJDbnIAXP3P9Sxzq3UUsddG3rrI3ut1q6m0FI6vxVBF3JoPQ38+W/blslLH4a5Yutp8drkEpXoddGQ==", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-router-dom": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.6.0.tgz", + "integrity": "sha512-DYgm6RDEuKdopSyGOWZGtDfSm7Aofb8CCzgkliTjtu/eDuB0gcsv6qdFhhi8HdtmA+KHkt5MfZ5K2PdzjugYsA==", + "license": "MIT", + "dependencies": { + "react-router": "7.6.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/react-router/node_modules/cookie": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", + "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -3329,6 +3384,12 @@ "node": ">= 18" } }, + "node_modules/set-cookie-parser": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", + "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", + "license": "MIT" + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", diff --git a/package.json b/package.json index 0fda482a..a4ec8f44 100644 --- a/package.json +++ b/package.json @@ -10,9 +10,11 @@ "preview": "vite preview" }, "dependencies": { + "lodash": "^4.17.21", "react": "^19.1.0", "react-dom": "^19.1.0", - "react-icons": "^5.5.0" + "react-icons": "^5.5.0", + "react-router-dom": "^7.6.0" }, "devDependencies": { "@eslint/js": "^9.25.0", diff --git a/src/App.css b/src/App.css new file mode 100644 index 00000000..9dfa9354 --- /dev/null +++ b/src/App.css @@ -0,0 +1,3 @@ +:root { + background-color: var(--content-bg); +} \ No newline at end of file diff --git a/src/App.jsx b/src/App.jsx index 02c611c9..e80336e4 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -1,106 +1,18 @@ -import Nav from "./components/Nav"; +import { BrowserRouter, Routes, Route } from 'react-router-dom'; +import Items from './Pages/Items/Items.jsx'; +import AddItem from './Pages/AddItem/AddItem.jsx'; -import styles from "./css/App.module.css"; -import Header from "./components/Header"; -import DropDown from "./components/DropDown"; -import ProductList from "./components/ProductList"; -import Button from "./components/Button"; -import SearchItem from "./components/SearchItem"; -import Pagination from "./components/Pagination"; - -import { getProducts } from "./api/ProductApi"; -import { useScreenSize } from "./utils/useScreenSize"; -import { useState, useEffect } from "react"; +import './App.css' function App() { - const [search, setSearch] = useState(""); - const [order, setOrder] = useState("recent"); - const [currPage, setCurrPage] = useState(1); - const [totalProducts, setTotalProducts] = useState(0); - const [bestProduct, setBestProduct] = useState(4); - const [allProduct, setAllProduct] = useState(10); - const [isBestProduct, setIsBestProduct] = useState(true); - - const screenSize = useScreenSize(); - - const handleSearch = (e) => { - setSearch(e.target.value); - }; - - const handleOrder = (selectedOrder) => { - setOrder(selectedOrder); - }; - - const handlePage = (newPage) => { - setCurrPage(newPage); - }; - - const getTotalProducts = async () => { - try { - const { totalCount } = await getProducts({ - orderBy: order, - keyword: search, - }); - setTotalProducts(totalCount); - } catch (error) { - console.error("전체 상품 수를 불러오는 중 오류:", error); - } - }; - - useEffect(() => { - let newPageSize; - if (screenSize === "lg") { - setBestProduct(4); - newPageSize = 10; - } else if (screenSize === "md") { - setBestProduct(2); - newPageSize = 6; - } else { - setBestProduct(1); - newPageSize = 4; - } - if (newPageSize !== allProduct) { - const firstItemOfCurrentPage = (currPage - 1) * allProduct; - const newPage = Math.floor(firstItemOfCurrentPage / newPageSize) + 1; - setCurrPage(newPage); - setAllProduct(newPageSize); - } - }, [screenSize, currPage, allProduct]); - - useEffect(() => { - getTotalProducts(); - }, []); return ( - <> -