1- import { useState } from "react" ;
1+ import { useEffect , useState } from "react" ;
2+ import { useRouter } from "next/router" ;
23import timeAgo from "@/util/timAgo" ;
34import Image from "next/image" ;
5+ import Dropdown from "./Dropdown" ;
6+ import useModalStore from "@/store/useModalStore" ;
47
58interface LinkCardProps {
69 info : {
@@ -12,16 +15,29 @@ interface LinkCardProps {
1215 url : string ;
1316 createdAt : string ;
1417 } ;
15- isFavoritePage ?: boolean ;
18+ onEdit ?: ( ) => void ;
19+ openDelete ?: ( ) => void ;
1620}
1721
18- const LinkCard = ( { isFavoritePage , info } : LinkCardProps ) => {
22+ const LinkCard = ( { onEdit , openDelete , info } : LinkCardProps ) => {
1923 const [ isSubscribed , setIsSubscribed ] = useState ( false ) ;
20- const [ isOpen , setIsOpen ] = useState ( false ) ;
24+ const [ isDropdownOpen , setIsDropdownOpen ] = useState ( false ) ;
25+ const { isOpen : isModalOpen } = useModalStore ( ) ; // 모달 열림 상태 구독
2126
2227 const formattedDate = info . createdAt ?. slice ( 0 , 10 ) . replace ( / - / g, "." ) ;
2328 const createdTime = timeAgo ( info . createdAt ) ;
2429
30+ const router = useRouter ( ) ;
31+ const isFavoritePage = router . pathname === "/favorite" ;
32+
33+ // 모달이 열릴 때 드롭다운 닫기
34+ useEffect ( ( ) => {
35+ if ( isModalOpen ) setIsDropdownOpen ( false ) ;
36+ } , [ isModalOpen ] ) ;
37+
38+ // dropdown 버튼
39+ const toggleDropdown = ( ) => setIsDropdownOpen ( ( prev ) => ! prev ) ;
40+
2541 return (
2642 < div className = "w-[340px] h-[344px] rounded-[12px] shadow-lg overflow-hidden cursor-pointer hover:scale-105 hover:duration-300" >
2743 < section className = "relative w-full h-[60%]" >
@@ -31,47 +47,41 @@ const LinkCard = ({ isFavoritePage, info }: LinkCardProps) => {
3147 alt = "링크 미리보기"
3248 fill
3349 />
34- { /* isFavoritePage가 false일 때만 즐겨찾기 버튼 렌더링 */ }
35- { ! isFavoritePage &&
36- ( isSubscribed ? (
37- < div
38- onClick = { ( ) => setIsSubscribed ( ! isSubscribed ) }
39- className = "absolute top-[15px] right-[15px] z-1"
40- >
41- < Image
42- src = "/icons/star-fill.svg"
43- width = { 32 }
44- height = { 32 }
45- alt = "subscripe button"
46- />
47- </ div >
48- ) : (
49- < div
50- onClick = { ( ) => setIsSubscribed ( ! isSubscribed ) }
51- className = "absolute top-[15px] right-[15px] z-1"
52- >
53- < Image
54- src = "/icons/star-empty.svg"
55- width = { 32 }
56- height = { 32 }
57- alt = "subscripe button"
58- />
59- </ div >
60- ) ) }
50+ { /* isFavoritePage일 때만 즐겨찾기 버튼 렌더링 */ }
51+ { ! isFavoritePage && (
52+ < div
53+ onClick = { ( ) => setIsSubscribed ( ! isSubscribed ) }
54+ className = "absolute top-[15px] right-[15px] z-1"
55+ >
56+ < Image
57+ src = {
58+ isSubscribed ? "/icons/star-fill.svg" : "/icons/star-empty.svg"
59+ }
60+ width = { 32 }
61+ height = { 32 }
62+ alt = "subscribe button"
63+ />
64+ </ div >
65+ ) }
6166 </ section >
6267
6368 < section className = "w-full h-[40%] flex flex-col justify-between gap-[10px] pt-[15px] px-[20px] pb-[10px]" >
6469 < div className = "flex justify-between" >
6570 < span className = "text-sm text-gray-400" >
6671 { createdTime || "1일 전" }
6772 </ span >
68- { /* isFavoritePage가 false일 때만 케밥 버튼 렌더링 */ }
73+ { /* isFavoritePage일 때만 케밥 버튼 렌더링 */ }
6974 { ! isFavoritePage && (
70- < div
71- className = "relative w-[21px] h-[17px]"
72- onClick = { ( state ) => setIsOpen ( ! state ) }
73- >
74- < Image src = "/icons/kebab.svg" alt = "kebab button" fill />
75+ < div className = "relative" >
76+ < button
77+ className = "relative w-[21px] h-[17px]"
78+ onClick = { toggleDropdown }
79+ >
80+ < Image src = "/icons/kebab.svg" alt = "kebab button" fill />
81+ </ button >
82+ { isDropdownOpen && (
83+ < Dropdown onEdit = { onEdit } openDelete = { openDelete } />
84+ ) }
7585 </ div >
7686 ) }
7787 </ div >
0 commit comments