Skip to content

Commit d4111a6

Browse files
authored
Refactor : 드롭다운 재사용 가능한 컴포넌트로 구현
Refactor : 드롭다운 재사용 가능한 컴포넌트로 구현
2 parents b370ecf + 94bbe00 commit d4111a6

File tree

3 files changed

+37
-15
lines changed

3 files changed

+37
-15
lines changed

components/Dropdown.tsx

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,35 @@
1+
import Link from "next/link";
12
import React from "react";
23

4+
interface DropdownItem {
5+
label: string;
6+
href?: string;
7+
onClick?: () => void;
8+
}
9+
310
interface DropdownProps {
4-
onEdit?: () => void;
5-
openDelete?: () => void;
11+
items: DropdownItem[];
612
}
713

8-
const Dropdown = ({ onEdit, openDelete }: DropdownProps) => {
14+
const Dropdown = ({ items }: DropdownProps) => {
915
const buttonStyle =
1016
"block w-full py-2 text-sm hover:bg-gray200 hover:text-purple100";
1117

1218
return (
1319
<div className="absolute top-[17px] right-0 flex flex-col gap-[2px] min-w-[100px] bg-white shadow-lg rounded">
14-
<button className={buttonStyle} onClick={onEdit}>
15-
수정하기
16-
</button>
17-
<button className={buttonStyle} onClick={openDelete}>
18-
삭제하기
19-
</button>
20+
{items.map((item, index) =>
21+
// href가 있으면 Link로 렌더링
22+
item.href ? (
23+
<Link key={index} href={item.href} className={buttonStyle}>
24+
{item.label}
25+
</Link>
26+
) : (
27+
// href가 없으면 버튼으로 렌더링
28+
<button key={index} onClick={item.onClick} className={buttonStyle}>
29+
{item.label}
30+
</button>
31+
)
32+
)}
2033
</div>
2134
);
2235
};

components/LinkCard.tsx

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,11 @@ interface LinkCardProps {
1515
url: string;
1616
createdAt: string;
1717
};
18-
onEdit?: () => void;
18+
openEdit?: () => void;
1919
openDelete?: () => void;
2020
}
2121

22-
const LinkCard = ({ onEdit, openDelete, info }: LinkCardProps) => {
22+
const LinkCard = ({ openEdit, openDelete, info }: LinkCardProps) => {
2323
const [isSubscribed, setIsSubscribed] = useState(false);
2424
const [isDropdownOpen, setIsDropdownOpen] = useState(false);
2525
const { isOpen: isModalOpen } = useModalStore(); // 모달 열림 상태 구독
@@ -38,6 +38,17 @@ const LinkCard = ({ onEdit, openDelete, info }: LinkCardProps) => {
3838
// dropdown 버튼
3939
const toggleDropdown = () => setIsDropdownOpen((prev) => !prev);
4040

41+
const dropdownItems = [
42+
{
43+
label: "수정하기",
44+
onClick: openEdit,
45+
},
46+
{
47+
label: "삭제하기",
48+
onClick: openDelete,
49+
},
50+
];
51+
4152
return (
4253
<div className="w-[340px] h-[344px] rounded-[12px] shadow-lg overflow-hidden cursor-pointer hover:scale-105 hover:duration-300">
4354
<section className="relative w-full h-[60%]">
@@ -79,9 +90,7 @@ const LinkCard = ({ onEdit, openDelete, info }: LinkCardProps) => {
7990
>
8091
<Image src="/icons/kebab.svg" alt="kebab button" fill />
8192
</button>
82-
{isDropdownOpen && (
83-
<Dropdown onEdit={onEdit} openDelete={openDelete} />
84-
)}
93+
{isDropdownOpen && <Dropdown items={dropdownItems} />}
8594
</div>
8695
)}
8796
</div>

pages/link/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ const LinkPage = ({ linkList, folderList }: LinkPageProps) => {
8888
{linkCardList.map((link) => (
8989
<LinkCard
9090
key={link.id}
91-
onEdit={() => openEdit(link.url, link.id)}
91+
openEdit={() => openEdit(link.url, link.id)}
9292
openDelete={() => openDelete(link.url, link.id)}
9393
info={link}
9494
/>

0 commit comments

Comments
 (0)