Skip to content

Commit 75c2fcd

Browse files
committed
Merge branch 'develop' of https://github.com/team-incube/Gwangju-talent-festival-Client into fix/evaluation
2 parents 43677ae + e602f93 commit 75c2fcd

14 files changed

Lines changed: 661 additions & 18 deletions

File tree

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import LotteryView from "@/views/lottery/ui/LotteryView";
2+
3+
export default function LotteryPage() {
4+
return <LotteryView />;
5+
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import { useState, useCallback } from "react";
2+
import { Seat } from "../model/types";
3+
4+
interface UseLotteryAnimationProps {
5+
seats: Seat[];
6+
duration?: number;
7+
interval?: number;
8+
}
9+
10+
export const useLotteryAnimation = ({
11+
seats,
12+
duration = 3000,
13+
interval = 100
14+
}: UseLotteryAnimationProps) => {
15+
const [isAnimating, setIsAnimating] = useState(false);
16+
const [currentSeat, setCurrentSeat] = useState<Seat | null>(null);
17+
const [finalSeat, setFinalSeat] = useState<Seat | null>(null);
18+
19+
const startAnimation = useCallback(() => {
20+
if (seats.length === 0) return;
21+
22+
setIsAnimating(true);
23+
setFinalSeat(null);
24+
25+
const startTime = Date.now();
26+
const endTime = startTime + duration;
27+
28+
const animationInterval = setInterval(() => {
29+
const now = Date.now();
30+
31+
if (now >= endTime) {
32+
const randomIndex = Math.floor(Math.random() * seats.length);
33+
const selectedSeat = seats[randomIndex];
34+
setCurrentSeat(selectedSeat);
35+
setFinalSeat(selectedSeat);
36+
setIsAnimating(false);
37+
clearInterval(animationInterval);
38+
} else {
39+
const randomIndex = Math.floor(Math.random() * seats.length);
40+
setCurrentSeat(seats[randomIndex]);
41+
}
42+
}, interval);
43+
44+
return () => clearInterval(animationInterval);
45+
}, [seats, duration, interval]);
46+
47+
const resetAnimation = useCallback(() => {
48+
setIsAnimating(false);
49+
setCurrentSeat(null);
50+
setFinalSeat(null);
51+
}, []);
52+
53+
return {
54+
isAnimating,
55+
currentSeat,
56+
finalSeat,
57+
startAnimation,
58+
resetAnimation,
59+
};
60+
};
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
import { Section, Seat, SEAT_STATUS } from "./types";
2+
3+
export interface LotterySeatConfig {
4+
id: string;
5+
seats: Array<{
6+
section: Section;
7+
seatNumber: string;
8+
}>;
9+
}
10+
11+
export const LOTTERY_SEAT_CONFIGS: Record<string, LotterySeatConfig> = {
12+
"1": {
13+
id: "1",
14+
seats: [
15+
{ section: "A", seatNumber: "1" },
16+
{ section: "B", seatNumber: "2" },
17+
{ section: "C", seatNumber: "3" },
18+
{ section: "D", seatNumber: "4" },
19+
{ section: "E", seatNumber: "5" },
20+
]
21+
},
22+
"2": {
23+
id: "2",
24+
seats: [
25+
{ section: "B", seatNumber: "1" },
26+
{ section: "B", seatNumber: "2" },
27+
{ section: "B", seatNumber: "3" },
28+
{ section: "B", seatNumber: "4" },
29+
{ section: "B", seatNumber: "5" },
30+
{ section: "B", seatNumber: "6" },
31+
{ section: "B", seatNumber: "7" },
32+
{ section: "B", seatNumber: "8" },
33+
]
34+
},
35+
"3": {
36+
id: "3",
37+
seats: [
38+
{ section: "C", seatNumber: "1" },
39+
{ section: "C", seatNumber: "2" },
40+
{ section: "C", seatNumber: "3" },
41+
{ section: "C", seatNumber: "4" },
42+
{ section: "C", seatNumber: "5" },
43+
{ section: "C", seatNumber: "6" },
44+
{ section: "C", seatNumber: "7" },
45+
{ section: "C", seatNumber: "8" },
46+
{ section: "C", seatNumber: "9" },
47+
{ section: "C", seatNumber: "10" },
48+
]
49+
},
50+
"4": {
51+
id: "4",
52+
seats: [
53+
{ section: "D", seatNumber: "1" },
54+
{ section: "D", seatNumber: "2" },
55+
{ section: "D", seatNumber: "3" },
56+
{ section: "D", seatNumber: "4" },
57+
{ section: "D", seatNumber: "5" },
58+
{ section: "D", seatNumber: "6" },
59+
{ section: "D", seatNumber: "7" },
60+
{ section: "D", seatNumber: "8" },
61+
{ section: "D", seatNumber: "9" },
62+
{ section: "D", seatNumber: "10" },
63+
{ section: "D", seatNumber: "11" },
64+
{ section: "D", seatNumber: "12" },
65+
]
66+
},
67+
"5": {
68+
id: "5",
69+
seats: [
70+
{ section: "E", seatNumber: "1" },
71+
{ section: "E", seatNumber: "2" },
72+
{ section: "E", seatNumber: "3" },
73+
{ section: "E", seatNumber: "4" },
74+
{ section: "E", seatNumber: "5" },
75+
{ section: "E", seatNumber: "6" },
76+
{ section: "E", seatNumber: "7" },
77+
{ section: "E", seatNumber: "8" },
78+
{ section: "E", seatNumber: "9" },
79+
{ section: "E", seatNumber: "10" },
80+
{ section: "E", seatNumber: "11" },
81+
{ section: "E", seatNumber: "12" },
82+
{ section: "E", seatNumber: "13" },
83+
{ section: "E", seatNumber: "14" },
84+
{ section: "E", seatNumber: "15" },
85+
]
86+
}
87+
};
88+
89+
export const getLotteryConfig = (id: string): LotterySeatConfig | null => {
90+
return LOTTERY_SEAT_CONFIGS[id] || null;
91+
};
92+
93+
export const convertToSeats = (config: LotterySeatConfig): Seat[] => {
94+
return config.seats.map(seat => ({
95+
seatNumber: seat.seatNumber,
96+
section: seat.section,
97+
status: SEAT_STATUS.AVAILABLE
98+
}));
99+
};

0 commit comments

Comments
 (0)