Skip to content

Commit c568025

Browse files
Merge pull request #232 from summerDev96/React-배수민-sprint8
[배수민] sprint8
2 parents 813ebc1 + e2feaca commit c568025

Some content is hidden

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

59 files changed

+2362
-844
lines changed

package-lock.json

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

package.json

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010
"react-dom": "^18.2.0",
1111
"react-router-dom": "^7.6.0",
1212
"react-scripts": "5.0.1",
13-
"web-vitals": "^2.1.4"
13+
"web-vitals": "^2.1.4",
14+
"zustand": "^5.0.6"
1415
},
1516
"scripts": {
1617
"start": "react-scripts start",
@@ -37,6 +38,9 @@
3738
]
3839
},
3940
"devDependencies": {
40-
"eslint-config-prettier": "^10.1.5"
41+
"@babel/plugin-proposal-private-property-in-object": "^7.21.11",
42+
"@types/node": "^24.0.14",
43+
"eslint-config-prettier": "^10.1.5",
44+
"typescript": "^4.9.5"
4145
}
4246
}

src/App.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { Outlet } from "react-router-dom";
22
import Nav from "./components/Nav";
3+
import Footer from "./components/Footer";
34

45
function App() {
56
return (
@@ -8,6 +9,7 @@ function App() {
89
<div>
910
<Outlet />
1011
</div>
12+
<Footer />
1113
</>
1214
);
1315
}

src/Main.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,23 @@ import "./css/base/common.css";
66
import ItemsPage from "./pages/ItemsPage";
77
import ItemRegisterPage from "./pages/ItemRegisterPage";
88
import ItemDetailPage from "./pages/ItemDetailPage";
9+
import HomePage from "./pages/HomePage";
10+
import SignupPage from "./pages/SignupPage";
11+
import LoginPage from "./pages/LoginPage";
912

1013
const Main = () => {
1114
return (
1215
<BrowserRouter>
1316
<Routes>
1417
<Route path="/" element={<App />}>
18+
<Route index element={<HomePage />} />
1519
<Route path="items">
1620
<Route path=":id" element={<ItemDetailPage />}></Route>
1721
<Route index element={<ItemsPage />}></Route>
1822
</Route>
1923
<Route path="additem" element={<ItemRegisterPage />}></Route>
24+
<Route path="signup" element={<SignupPage />}></Route>
25+
<Route path="login" element={<LoginPage />}></Route>
2026
</Route>
2127
</Routes>
2228
</BrowserRouter>

src/components/Button.js renamed to src/components/Button.tsx

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,22 @@
11
import "./css/Button.css";
22
import backIcon from "../img/back.svg";
3+
import { ReactNode } from "react";
4+
5+
interface ButtonProps {
6+
className?: string;
7+
type?: "register" | "return" | "cancel" | "small" | "large";
8+
disabled?: boolean;
9+
children?: ReactNode;
10+
onClick?: () => void;
11+
}
312

413
const Button = ({
5-
className,
6-
type,
7-
disabled,
14+
className = "",
15+
type = "small",
16+
disabled = false,
817
children,
918
onClick = () => {},
10-
}) => {
19+
}: ButtonProps) => {
1120
const btnStyleClass = {
1221
register: "btn-register",
1322
return: "btn-return",

src/components/Comment.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ const Comment = ({ data }) => {
1111
const [showDropdown, setShowDropdown] = useState(false);
1212
const [isEditMode, setIsEditMode] = useState(false);
1313

14-
const onClickDropdown = () => {
14+
const toggleDropdown = () => {
1515
setShowDropdown(!showDropdown);
1616
};
1717

@@ -20,7 +20,7 @@ const Comment = ({ data }) => {
2020
{ name: "삭제하기", value: "delete" },
2121
];
2222

23-
const onClickDropdownItem = (item) => {
23+
const handleDropdownItemClick = (item) => {
2424
// 동작 실행 후 닫기
2525
switch (item.value) {
2626
case "edit":
@@ -52,8 +52,8 @@ const Comment = ({ data }) => {
5252
<div className="comment__content">
5353
<span>{content}</span>
5454
<MoreDropdown
55-
onClickDropdown={onClickDropdown}
56-
onClickDropdownItem={onClickDropdownItem}
55+
onToggleDropdown={toggleDropdown}
56+
onDropdownItemClick={handleDropdownItemClick}
5757
onCloseDropdown={onCloseDropdown}
5858
dropdownList={dropdownList}
5959
showDropdown={showDropdown}

src/components/Dropdown.js

Lines changed: 11 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,29 @@
11
import "./css/Dropdown.css";
22
import sortIcon from "../img/sort.svg";
33
import arrowDownIcon from "../img/arrow_down.svg";
4-
import { createContext, useContext, useRef, useEffect } from "react";
4+
import { createContext, useContext, useRef } from "react";
5+
import useClickOutside from "../hooks/useClickOutside";
56
const DropdownContext = createContext();
67

78
const Dropdown = ({
89
children,
910
className = "",
10-
onClickDropdown,
11-
onClickDropdownItem,
11+
onToggleDropdown,
12+
onDropdownItemClick,
1213
onCloseDropdown = () => {},
1314
dropdownList,
1415
showDropdown,
1516
value,
1617
}) => {
1718
const dropdownRef = useRef(null);
18-
19-
// 외부 클릭 시 드롭다운 닫기
20-
useEffect(() => {
21-
const handleClickOutside = (e) => {
22-
if (dropdownRef.current && !dropdownRef.current.contains(e.target)) {
23-
onCloseDropdown();
24-
}
25-
};
26-
window.addEventListener("click", handleClickOutside);
27-
return () => window.removeEventListener("click", handleClickOutside);
28-
}, [onCloseDropdown]);
19+
useClickOutside(dropdownRef, onCloseDropdown);
2920

3021
return (
3122
<DropdownContext.Provider
3223
value={{
3324
className,
34-
onClickDropdown,
35-
onClickDropdownItem,
25+
onToggleDropdown,
26+
onDropdownItemClick,
3627
onCloseDropdown,
3728
dropdownList,
3829
showDropdown,
@@ -47,9 +38,9 @@ const Dropdown = ({
4738
};
4839

4940
const Button = () => {
50-
const { value, onClickDropdown } = useContext(DropdownContext);
41+
const { value, onToggleDropdown } = useContext(DropdownContext);
5142
return (
52-
<div className="dropdown__button" onClick={onClickDropdown}>
43+
<div className="dropdown__button" onClick={onToggleDropdown}>
5344
<span className="dropdown__text">{value.name}</span>
5445
<img
5546
src={arrowDownIcon}
@@ -62,15 +53,15 @@ const Button = () => {
6253
};
6354

6455
const List = ({ listClassName = "" }) => {
65-
const { showDropdown, dropdownList, onClickDropdownItem } =
56+
const { showDropdown, dropdownList, onDropdownItemClick } =
6657
useContext(DropdownContext);
6758
if (!showDropdown) return null;
6859
return (
6960
<ul className={`dropdown__list ${listClassName}`}>
7061
{dropdownList?.map((item, index) => (
7162
<li
7263
key={`${item.value}-${index}`}
73-
onClick={() => onClickDropdownItem(item)}
64+
onClick={() => onDropdownItemClick(item)}
7465
>
7566
{item.name}
7667
</li>

0 commit comments

Comments
 (0)