1
1
import React , { useState } from "react" ;
2
2
import styled from "styled-components" ;
3
+
4
+ import { useDispatch } from 'react-redux' ;
5
+ import { changeCompanyId } from "../../reducer/CompanyId-Reducer" ;
6
+
3
7
import logo from "../../asset/images/StockHolmImage.png" ;
8
+ import star_icon from "../../asset/icon/star_icon.png"
9
+ import star_filled_icon from "../../asset/icon/star_filled_icon.png"
10
+
11
+ import usePostStar from "../../hooks/stars/usePoststars" ;
12
+ import useDeleteStar from "../../hooks/stars/useDeletestars" ;
13
+ import useGetStar from "../../hooks/stars/useGetstars" ;
4
14
5
15
import kia from "../../asset/logos/기아.svg" ;
6
16
import dy from "../../asset/logos/디와이.jpeg" ;
@@ -47,6 +57,32 @@ const StockItem: React.FC<StockItemProps> = ({ company }) => {
47
57
// const priceColor2 = isPositiveChange ? "#f87369" : "#5a99f8";
48
58
49
59
const [ showChangePrice , setShowChangePrice ] = useState ( false ) ; // 상태를 여기로 이동
60
+ const [ isHovering , setIsHovering ] = useState ( false ) ; // 마우스 호버 상태
61
+ const { data : starredData } = useGetStar ( ) ;
62
+ const starredCompanyIds = starredData ?. map ( item => item . companyResponseDto . companyId ) || [ ] ;
63
+
64
+ // 해당 companyId가 이미 존재하는지 확인하고, isFavorited의 초기값을 설정합니다.
65
+ const [ isFavorited , setIsFavorited ] = useState ( starredCompanyIds . includes ( company . companyId ) ) ;
66
+
67
+ // usePostStar 및 useDeleteStar 훅 사용
68
+ const postMutation = usePostStar ( ) ;
69
+ const deleteMutation = useDeleteStar ( ) ;
70
+
71
+ const toggleFavorite = ( ) => {
72
+ // 현재 isFavorited 상태에 따라 요청을 결정합니다.
73
+ if ( isFavorited ) {
74
+ deleteMutation . mutate ( company . companyId ) ;
75
+ } else {
76
+ postMutation . mutate ( company . companyId ) ;
77
+ }
78
+ setIsFavorited ( ! isFavorited ) ;
79
+ } ;
80
+
81
+ const dispatch = useDispatch ( ) ;
82
+
83
+ const handleItemClick = ( ) => {
84
+ dispatch ( changeCompanyId ( company . companyId ) ) ;
85
+ } ;
50
86
51
87
// 🔴 회계 단위 추가
52
88
const price = parseInt ( company . stockPrice ) . toLocaleString ( ) ;
@@ -55,11 +91,20 @@ const StockItem: React.FC<StockItemProps> = ({ company }) => {
55
91
56
92
return (
57
93
< StockItemWrapper
58
- onMouseEnter = { ( ) => setShowChangePrice ( true ) } // StockItemWrapper에 이벤트 리스너 적용
59
- onMouseLeave = { ( ) => setShowChangePrice ( false ) }
94
+ onClick = { handleItemClick } // 👈 클릭 이벤트 핸들러 추가
95
+ onMouseEnter = { ( ) => {
96
+ setShowChangePrice ( true ) ;
97
+ setIsHovering ( true ) ;
98
+ } }
99
+ onMouseLeave = { ( ) => {
100
+ setShowChangePrice ( false ) ;
101
+ setIsHovering ( false ) ;
102
+ } }
60
103
>
61
104
< LogoContainer >
62
- < Logo src = { companyLogo } alt = "stock logo" />
105
+ < Logo src = { companyLogo } alt = "stock logo" opacity = { isHovering ? 0 : 1 } />
106
+ < FavoriteStar onClick = { toggleFavorite } opacity = { isHovering && ! isFavorited ? 1 : 0 } />
107
+ < FavoriteStarFilled onClick = { toggleFavorite } opacity = { isHovering && isFavorited ? 1 : 0 } />
63
108
</ LogoContainer >
64
109
< StockInfo >
65
110
< StockName > { company . korName } </ StockName >
@@ -112,19 +157,39 @@ const StockItemWrapper = styled.div`
112
157
// 🔴 로고 컨테이너 + 로고 크기
113
158
const LogoContainer = styled . div `
114
159
height: 100%;
160
+ width: 48px; // 아이콘의 너비와 margin-left, margin-right의 합계를 기준으로 설정
115
161
display: flex;
116
162
justify-content: center;
117
163
align-items: center;
164
+ position: relative;
118
165
` ;
119
166
120
- const Logo = styled . img `
167
+ const Logo = styled . img < { opacity : number } > `
121
168
border-radius: 50%;
122
169
width: 28px;
123
170
height: 28px;
124
171
margin-left: 10px;
125
172
margin-right: 10px;
173
+ position: absolute;
174
+ opacity: ${ ( props ) => props . opacity } ;
126
175
` ;
127
176
177
+ const FavoriteStar = styled . div < { opacity : number } > `
178
+ position: absolute;
179
+ width: 28px;
180
+ height: 28px;
181
+ background: url(${ star_icon } ) no-repeat center;
182
+ background-size: contain;
183
+ cursor: pointer;
184
+ opacity: ${ ( props ) => props . opacity } ;
185
+ ` ;
186
+
187
+ const FavoriteStarFilled = styled ( FavoriteStar ) < { opacity : number } > `
188
+ background: url(${ star_filled_icon } ) no-repeat center;
189
+ background-size: contain; // 👈 이 부분도 추가
190
+ ` ;
191
+
192
+
128
193
// 🔴 font 사이즈
129
194
const StockInfo = styled . div `
130
195
height: 100%;
@@ -172,4 +237,6 @@ const StockChange = styled.span<{ change: string }>`
172
237
font-size: 13px;
173
238
` ;
174
239
240
+
241
+
175
242
export default StockItem ;
0 commit comments