@@ -48,7 +48,8 @@ const EventDetailPage = ({ eventId, onBack }: Props) => {
4848 const [ images , setImages ] = useState < EventDetail [ 'images' ] > ( [ ] ) ;
4949 const [ likeCount , setLikeCount ] = useState < number > ( 0 ) ;
5050 const [ isLiked , setIsLiked ] = useState < boolean | null > ( null ) ;
51- useIsLoggedIn ( ) ;
51+ const isLoggedIn = useIsLoggedIn ( ) ;
52+ const [ myTotalBetAmount , setMyTotalBetAmount ] = useState < number > ( 0 ) ;
5253
5354 const totalBetAmount = useMemo ( ( ) => {
5455 return options . reduce ( ( acc , o ) => acc + ( o . option_total_amount ?? 0 ) , 0 ) ;
@@ -120,6 +121,7 @@ const EventDetailPage = ({ eventId, onBack }: Props) => {
120121 setImages ( res . images ?? [ ] ) ;
121122 setLikeCount ( res . like_count ?? 0 ) ;
122123 setIsLiked ( res . is_liked ?? null ) ;
124+ setMyTotalBetAmount ( res . my_total_bet_amount ?? 0 ) ;
123125 setDescription ( res . description ?? '' ) ;
124126 setSelectedOptionId ( null ) ;
125127 setBetOpen ( false ) ;
@@ -144,6 +146,7 @@ const EventDetailPage = ({ eventId, onBack }: Props) => {
144146 setImages ( [ ] ) ;
145147 setLikeCount ( 0 ) ;
146148 setIsLiked ( null ) ;
149+ setMyTotalBetAmount ( 0 ) ;
147150 setSelectedOptionId ( null ) ;
148151 setBetOpen ( false ) ;
149152 setBetAmount ( '' ) ;
@@ -158,7 +161,7 @@ const EventDetailPage = ({ eventId, onBack }: Props) => {
158161 } ;
159162 } , [ eventId ] ) ;
160163
161- const canBet = status === 'OPEN' ;
164+ const canBet = status === 'OPEN' && isLoggedIn && myTotalBetAmount <= 0 ;
162165
163166 // When login/logout happens, refetch to update personalized fields like is_liked.
164167 useEffect ( ( ) => {
@@ -170,6 +173,7 @@ const EventDetailPage = ({ eventId, onBack }: Props) => {
170173 if ( ! alive ) return ;
171174 setLikeCount ( res . like_count ?? 0 ) ;
172175 setIsLiked ( res . is_liked ?? null ) ;
176+ setMyTotalBetAmount ( res . my_total_bet_amount ?? 0 ) ;
173177 } catch {
174178 // Non-fatal
175179 }
@@ -317,6 +321,7 @@ const EventDetailPage = ({ eventId, onBack }: Props) => {
317321 setDescription ( res . description ?? '' ) ;
318322 setLikeCount ( res . like_count ?? 0 ) ;
319323 setIsLiked ( res . is_liked ?? null ) ;
324+ setMyTotalBetAmount ( res . my_total_bet_amount ?? 0 ) ;
320325 } ;
321326 const normalizePointInput = ( raw : string ) => {
322327 // Keep digits only (so users can paste with commas)
@@ -501,17 +506,6 @@ const EventDetailPage = ({ eventId, onBack }: Props) => {
501506 </ div >
502507 ) : null }
503508
504- { ! canBet ? (
505- < p className = "page-sub" style = { { marginTop : 10 } } >
506- 베팅은 OPEN 상태에서만 가능해요. 또한 베팅은 제출 후 수정할 수
507- 없어요.
508- </ p >
509- ) : (
510- < p className = "page-sub" style = { { marginTop : 10 } } >
511- 베팅은 제출 후 수정할 수 없어요.
512- </ p >
513- ) }
514-
515509 { description ? < p className = "event-desc" > { description } </ p > : null }
516510
517511 < div className = "event-stats" >
@@ -644,8 +638,23 @@ const EventDetailPage = ({ eventId, onBack }: Props) => {
644638 < >
645639 선택됨: < strong > { selectedOption . name } </ strong >
646640 </ >
641+ ) : status !== 'OPEN' ? (
642+ < p className = "page-sub" style = { { marginTop : 10 } } >
643+ OPEN이 아니어서 배팅할 수 없어요.
644+ </ p >
645+ ) : ! isLoggedIn ? (
646+ < p className = "page-sub" style = { { marginTop : 10 } } >
647+ 로그인 후 베팅할 수 있어요.
648+ </ p >
649+ ) : myTotalBetAmount > 0 ? (
650+ < p className = "page-sub" style = { { marginTop : 10 } } >
651+ 이미 이 이벤트에 베팅했어요. (추가 베팅 불가)
652+ </ p >
647653 ) : (
648- '옵션을 선택하면 베팅할 수 있어요'
654+ < p className = "page-sub" style = { { marginTop : 10 } } >
655+ 옵션을 선택 후 배팅하기 버튼을 누르세요. 베팅은 제출 후 수정할
656+ 수 없어요.
657+ </ p >
649658 ) }
650659 </ div >
651660 < button
@@ -655,6 +664,18 @@ const EventDetailPage = ({ eventId, onBack }: Props) => {
655664 e . stopPropagation ( ) ;
656665 setBetError ( null ) ;
657666 if ( ! canBet ) {
667+ if ( ! isLoggedIn ) {
668+ setBetError ( '로그인 후 베팅할 수 있어요.' ) ;
669+ return ;
670+ }
671+
672+ if ( myTotalBetAmount > 0 ) {
673+ setBetError (
674+ '이미 이 이벤트에 베팅했어요. (추가 베팅 불가)'
675+ ) ;
676+ return ;
677+ }
678+
658679 setBetError ( '베팅은 OPEN 상태에서만 가능합니다.' ) ;
659680 return ;
660681 }
0 commit comments