Skip to content

Commit c9603d2

Browse files
Merge pull request #312 from nagyum/React-박나겸-sprint7
[박나겸] Sprint 7
2 parents ce93795 + ce50d73 commit c9603d2

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

62 files changed

+803
-288
lines changed

eslint.config 2.mjs

Lines changed: 0 additions & 12 deletions
This file was deleted.

package-lock.json

Lines changed: 10 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
"@testing-library/jest-dom": "^5.17.0",
77
"@testing-library/react": "^13.4.0",
88
"@testing-library/user-event": "^13.5.0",
9+
"date-fns": "^4.1.0",
910
"react": "^18.2.0",
1011
"react-dom": "^18.2.0",
1112
"react-icons": "^5.3.0",

public/index.html

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,7 @@
77
<meta name="theme-color" content="#000000" />
88
<link
99
rel="stylesheet"
10-
as="style"dufisdufdsufiudsyfiudsyfiudsyfiudsyfiudsyfiudyfidsuyidus
11-
crossorigin
10+
as="style"
1211
href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/static/pretendard.min.css"
1312
/>
1413
<title>판다마켓</title>

src/App.jsx

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { BrowserRouter, Route, Routes } from "react-router-dom";
2+
import ProductPage from "./components/ProductPage/ProductPage";
3+
import ItemPage from "./components/ItemPage/ItemPage";
4+
import AddItem from "./components/AddItemPage/AddItemPage";
5+
import NavBar from "./components/Nav/NavBar";
6+
7+
function App() {
8+
return (
9+
<BrowserRouter>
10+
<NavBar />
11+
<Routes>
12+
<Route path="/items" element={<ProductPage />} />
13+
<Route path="/items/:id" element={<ItemPage />} />
14+
<Route path="/additem" element={<AddItem />} />
15+
</Routes>
16+
</BrowserRouter>
17+
);
18+
}
19+
20+
export default App;

src/Main.jsx

Lines changed: 0 additions & 18 deletions
This file was deleted.

src/api.js

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,38 @@
11
const BASE_URL = "https://panda-market-api.vercel.app";
2+
23
export async function getData({ page = 1, pageSize = 4, orderBy = "recent" }) {
3-
const query = `page=${page}&pageSize=${pageSize}&orderBy=${orderBy}`;
4-
const response = await fetch(`${BASE_URL}/products?${query}`);
5-
const body = response.json();
6-
return body;
4+
const url = new URL("/products", BASE_URL);
5+
url.searchParams.append("page", page);
6+
url.searchParams.append("pageSize", pageSize);
7+
url.searchParams.append("orderBy", orderBy);
8+
9+
const response = await fetch(url.toString());
10+
if (!response.ok) {
11+
throw new Error(`Failed to fetch data: ${response.statusText}`);
12+
}
13+
return response.json();
14+
}
15+
16+
//GET product ID
17+
export async function getProductDetail(id) {
18+
const url = new URL(`/products/${id}`, BASE_URL);
19+
// url.searchParams.append("{id}", id);
20+
21+
const response = await fetch(url.toString());
22+
if (!response.ok) {
23+
throw new Error(`Failed to fetch data: ${response.statusText}`);
24+
}
25+
return response.json();
26+
}
27+
28+
//GET 상세페이지 댓글들
29+
30+
export async function getProductComment(id, limit = 3) {
31+
const url = new URL(`/products/${id}/comments`, BASE_URL);
32+
url.searchParams.append("limit", limit);
33+
const response = await fetch(url.toString());
34+
if (!response.ok) {
35+
throw new Error(`Failed to fetch data: ${response.statusText}`);
36+
}
37+
return response.json();
738
}
Lines changed: 29 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,34 @@
1-
import NavBar from "../Nav/NavBar";
21
import "../AddItemPage/AddItemPage.scss";
3-
import InputForm from "../AddItemPage/InputForm";
4-
import InputImage from "../AddItemPage/InputImage";
5-
import InputTag from "./InputTag";
6-
import { useRef, useState } from "react";
2+
import InputForm from "./components/InputForm";
3+
import InputImage from "./components/InputImage";
4+
import InputTag from "./components/InputTag";
5+
import { useState } from "react";
76

87
function AddItemPage() {
98
const [values, setValues] = useState({
109
title: "",
1110
description: "",
1211
price: "",
13-
tag: "",
1412
});
15-
16-
const handleInputChange = (field) => (e) => {
17-
setValues((preValues) => ({
18-
...preValues,
19-
[field]: e.target.value,
20-
}));
21-
};
13+
const [tags, setTags] = useState([]);
2214

2315
const isSubmitDisabled =
24-
!values.title || !values.description || !values.price || !values.tag;
16+
!values.title || !values.description || !values.price || tags.length === 0;
17+
18+
console.log(isSubmitDisabled);
19+
2520
return (
2621
<>
27-
<NavBar />
28-
<form className="formContent">
22+
<form
23+
className="formContent"
24+
action="https://panda-market-api.vercel.app/products"
25+
>
2926
<div className="formTitle">상품 등록하기</div>
30-
<button className="formBtn" type="submit" disabled={isSubmitDisabled}>
27+
<button
28+
className={`formBtn ${isSubmitDisabled ? "disabled" : "active"}`} // 버튼 활성화/비활성화
29+
type="submit"
30+
disabled={isSubmitDisabled} // 조건에 따라 버튼 비활성화
31+
>
3132
등록
3233
</button>
3334
<InputImage title={"상품이미지"} placeholder={"이미지 등록 "} />
@@ -36,28 +37,35 @@ function AddItemPage() {
3637
value={values.title}
3738
height={56}
3839
placeholder={"상품명을 입력해주세요"}
40+
onChange={(e) => setValues({ ...values, title: e.target.value })} // title 값 변경
3941
/>
4042
<InputForm
4143
title={"상품소개"}
4244
value={values.description}
4345
height={282}
4446
placeholder={"상품 소개를 입력해주세요"}
47+
onChange={(e) =>
48+
setValues({ ...values, description: e.target.value })
49+
} // description 값 변경
4550
/>
4651
<InputForm
4752
title={"판매가격"}
4853
value={values.price}
4954
height={56}
5055
placeholder={"판매 가격을 입력해주세요"}
56+
type="number"
57+
onChange={(e) => setValues({ ...values, price: e.target.value })} // price 값 변경
5158
/>
5259
<InputTag
60+
tags={tags}
61+
setTags={setTags}
5362
title={"태그"}
54-
value={values.tag}
55-
height={56}
56-
placeholder={"태그을 입력해주세요"}
63+
placeholder={"태그를 입력해주세요"}
64+
type="string"
5765
/>
5866
</form>
5967
</>
6068
);
6169
}
6270

63-
export default AddItemPage; // default export
71+
export default AddItemPage;

src/components/AddItemPage/AddItemPage.scss

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,16 @@
2929
font-size: 12px;
3030
font-weight: 600;
3131
line-height: 26px;
32+
cursor: pointer;
33+
34+
&.active {
35+
background-color: #007bff; /* Blue when enabled */
36+
color: white;
37+
}
38+
39+
&.disabled {
40+
background-color: #ccc; /* Gray when disabled */
41+
color: #888; /* Gray text */
42+
cursor: not-allowed;
43+
}
3244
}

src/components/AddItemPage/InputTag.jsx

Lines changed: 0 additions & 70 deletions
This file was deleted.

0 commit comments

Comments
 (0)