Skip to content

Commit b3792e8

Browse files
update: betting button disable
1 parent 55c94e7 commit b3792e8

File tree

2 files changed

+37
-14
lines changed

2 files changed

+37
-14
lines changed

src/components/EventDetailPage.tsx

Lines changed: 35 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

src/types.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@ export interface EventDetail {
6464
status: EventStatus;
6565
total_participants_count?: number;
6666
total_participants?: number;
67+
// Total amount the current user has bet on this event (personalized; may be omitted when not logged in)
68+
my_total_bet_amount?: number;
6769
like_count?: number;
6870
is_liked?: boolean | null;
6971
is_eligible?: boolean;

0 commit comments

Comments
 (0)