11import { useEffect , useState } from "react" ;
22import { useRouter } from "next/router" ;
3+ import { putLinkFavorite } from "@/lib/api/link" ;
4+ import { useLinkCardStore } from "@/store/useLinkCardStore" ;
35import timeAgo from "@/util/timAgo" ;
46import Image from "next/image" ;
57import Dropdown from "../Dropdown" ;
@@ -15,14 +17,13 @@ interface LinkCardProps {
1517 url : string ;
1618 createdAt : string ;
1719 } ;
18- openEdit ?: ( ) => void ;
19- openDelete ?: ( ) => void ;
2020}
2121
22- const LinkCard = ( { openEdit , openDelete , info } : LinkCardProps ) => {
23- const [ isSubscribed , setIsSubscribed ] = useState ( false ) ;
22+ const LinkCard = ( { info } : LinkCardProps ) => {
23+ const [ isSubscribed , setIsSubscribed ] = useState ( info . favorite || false ) ;
2424 const [ isDropdownOpen , setIsDropdownOpen ] = useState ( false ) ;
25- const { isOpen : isModalOpen } = useModalStore ( ) ;
25+ const { isOpen, openModal } = useModalStore ( ) ;
26+ const { updateFavorite } = useLinkCardStore ( ) ;
2627
2728 const formattedDate = info . createdAt ?. slice ( 0 , 10 ) . replace ( / - / g, "." ) ;
2829 const createdTime = timeAgo ( info . createdAt ) ;
@@ -32,20 +33,39 @@ const LinkCard = ({ openEdit, openDelete, info }: LinkCardProps) => {
3233
3334 // 모달이 열릴 때 드롭다운 닫기
3435 useEffect ( ( ) => {
35- if ( isModalOpen ) setIsDropdownOpen ( false ) ;
36- } , [ isModalOpen ] ) ;
36+ if ( isOpen ) setIsDropdownOpen ( false ) ;
37+ } , [ isOpen ] ) ;
38+
39+ // 즐겨찾기 버튼 클릭 시 호출되는 함수
40+ const handleFavoriteToggle = async ( ) => {
41+ setIsSubscribed ( ( prev ) => ! prev ) ;
42+ try {
43+ await putLinkFavorite ( info . id , { favorite : ! isSubscribed } ) ;
44+ updateFavorite ( info . id , ! isSubscribed ) ;
45+ } catch ( error ) {
46+ console . error ( "즐겨찾기 설정 중 오류 발생:" , error ) ;
47+ }
48+ } ;
3749
3850 // dropdown 버튼
3951 const toggleDropdown = ( ) => setIsDropdownOpen ( ( prev ) => ! prev ) ;
4052
53+ const handleModalOpen = (
54+ type : "EditLink" | "DeleteLinkModal" ,
55+ link : string ,
56+ linkId : number
57+ ) => {
58+ openModal ( type , { link, linkId } ) ;
59+ } ;
60+
4161 const dropdownItems = [
4262 {
4363 label : "수정하기" ,
44- onClick : openEdit ,
64+ onClick : ( ) => handleModalOpen ( "EditLink" , info . url , info . id ) ,
4565 } ,
4666 {
4767 label : "삭제하기" ,
48- onClick : openDelete ,
68+ onClick : ( ) => handleModalOpen ( "DeleteLinkModal" , info . url , info . id ) ,
4969 } ,
5070 ] ;
5171
@@ -61,7 +81,7 @@ const LinkCard = ({ openEdit, openDelete, info }: LinkCardProps) => {
6181 { /* 즐겨찾기 페이지가 아닐 때에는 즐겨찾기 버튼 렌더링x */ }
6282 { ! isFavoritePage && (
6383 < div
64- onClick = { ( ) => setIsSubscribed ( ! isSubscribed ) }
84+ onClick = { handleFavoriteToggle }
6585 className = "absolute top-[15px] right-[15px] z-1"
6686 >
6787 < Image
0 commit comments