Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
7a9b814
design: 이벤트 탭 이름 변경
leeleeleeleejun Feb 17, 2026
04e2197
refactor: LuckyDraw 탭 key 이름을 의미에 맞게 변경
leeleeleeleejun Feb 17, 2026
cc09c1b
refactor: 럭키드로우 컴포넌트 네이밍 개선
leeleeleeleejun Feb 17, 2026
3821113
feat: 종료된 이벤트 목록 페이지 구현
leeleeleeleejun Feb 17, 2026
5c28836
feat: 종료된 이벤트 목록에 EmptyFallback 컴포넌트 추가
leeleeleeleejun Feb 17, 2026
128a573
feat: 이벤트 결과 조회 시 eventId 파라미터 추가
leeleeleeleejun Feb 17, 2026
9f98804
refactor: 행운 복권 페이지 Header를 layout으로 이동
leeleeleeleejun Feb 17, 2026
10fe338
refactor: 이벤트 결과 페이지를 동적 라우트로 리팩토링
leeleeleeleejun Feb 17, 2026
da01968
feat: EventSummary 컴포넌트 추가로 이벤트 정보 표시
leeleeleeleejun Feb 17, 2026
2024c31
feat: 당첨 시 전화번호 입력 폼(WinnerInfoForm) 추가
leeleeleeleejun Feb 17, 2026
5f752b7
style: FinishedEvent 및 LuckyDraw 컴포넌트의 CSS 클래스 수정
leeleeleeleejun Feb 18, 2026
f67a9cb
feat: 럭키드로우 이벤트 빈 상태 처리 및 레이아웃 개선
leeleeleeleejun Feb 18, 2026
7cc3bec
fix: null 체크 전 구조 분해 할당으로 인한 런타임 에러 방지
leeleeleeleejun Feb 18, 2026
3859fe2
fix: 이벤트 결과 쿼리 키에 eventId 추가하여 캐시 충돌 방지
leeleeleeleejun Feb 18, 2026
db2d655
fix: TypeScript 컴파일 에러 수정
leeleeleeleejun Feb 18, 2026
0b518ff
refactor: 디버그 코드 제거 및 import 순서 수정
leeleeleeleejun Feb 18, 2026
5d90756
refactor: 이벤트 응모 에러 처리 개선
leeleeleeleejun Feb 18, 2026
a9c2269
feat: 럭키드로우 당첨자 전화번호 제출 기능 구현
leeleeleeleejun Feb 18, 2026
470105a
fix: 럭키드로우 이벤트 미들웨어 matcher에서 경로 제거
leeleeleeleejun Feb 24, 2026
486b979
refactor: EmptyEventState 컴포넌트를 별도 파일로 분리
leeleeleeleejun Feb 24, 2026
8b9c40d
feat: 이벤트 페이지 회원/비회원 분기 및 컴포넌트 구조 개선
leeleeleeleejun Feb 24, 2026
fe0c5d8
refactor: NavBarItem 컴포넌트 파일 이동
leeleeleeleejun Feb 24, 2026
0c3e879
fix: 럭키드로우 결과 페이지 미들웨어 matcher에 경로 추가
leeleeleeleejun Feb 24, 2026
4c99c78
fix: '종료된 이벤트' 탭명을 '참여했던 이벤트'로 변경
leeleeleeleejun Feb 24, 2026
5f830b1
refactor: 이벤트 데이터 null 처리 방식 개선 및 관련 컴포넌트 로직 수정
leeleeleeleejun Feb 25, 2026
3383d15
docs: 진행 중인 이벤트 없을 시 첫 번째 단계로 자동 리다이렉트 주석 추가
leeleeleeleejun Feb 26, 2026
d067171
feat: 참여했던 이벤트 목록 조회 API 및 스키마 추가
leeleeleeleejun Feb 26, 2026
ebb1fc3
refactor: 이벤트 스키마 및 타입 명칭 일관성 개선 및 관련 API 함수명 수정
leeleeleeleejun Feb 26, 2026
cd89e0b
refactor: 이벤트 스키마 및 타입 명칭 일관성 개선 및 관련 API 함수명 수정
leeleeleeleejun Feb 26, 2026
f1d51ce
refactor: 이벤트 스키마 및 타입 명칭 일관성 개선 및 관련 API 함수명 수정
leeleeleeleejun Feb 26, 2026
f4e1607
refactor: 이벤트 엔트리 관련 API 경로 및 쿼리 키 명칭 일관성 개선
leeleeleeleejun Feb 26, 2026
49f083b
feat: 이벤트 엔트리 목록 mock 데이터 및 핸들러 추가
leeleeleeleejun Feb 26, 2026
ea51bf3
feat: 이벤트 목록 렌더링에 Suspense 및 Spinner 로딩 UI 추가
leeleeleeleejun Feb 26, 2026
5659b41
feat: 종료된 이벤트 목록 API 연동
leeleeleeleejun Feb 26, 2026
062aa3e
refactor: FinishedEventItem 컴포넌트명을 EventSummary로 변경
leeleeleeleejun Feb 26, 2026
68b01a3
feat: EventResultClient에서 이벤트 상품 이미지에 sizes, priority, className 속성 추가
leeleeleeleejun Feb 26, 2026
7a4bbf2
feat: 당첨자 폼 스키마에 약관 동의 추가, 관련 함수 및 훅 리팩터링
leeleeleeleejun Feb 26, 2026
87781fb
feat: 당첨자 폼에 약관 동의 UI 및 로직 추가, 제출 성공 시 모달 자동 닫힘 처리
leeleeleeleejun Feb 26, 2026
63ac813
refactor: 추첨 애니메이션 대기 시간(800ms) 매직 넘버 상수화
leeleeleeleejun Feb 26, 2026
9516ba4
feat: 종료된 이벤트 탭 명칭 수정 및 참여 기록 안내 문구 추가
leeleeleeleejun Feb 27, 2026
04598bc
feat: 이벤트 결과 API 연동 및 스키마 확장, 당첨자 폼 제출 여부 로직 추가
leeleeleeleejun Feb 27, 2026
1e00a65
feat: 당첨자 폼 제출 성공 시 이벤트 결과 쿼리 무효화 로직 추가
leeleeleeleejun Feb 27, 2026
61575ce
fix: WinnerInfoForm 전화번호 입력 필드 disabled prop 명칭 수정
leeleeleeleejun Feb 27, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 11 additions & 4 deletions apps/web/app/_apis/mutations/useParticipationEvent.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { useMutation, useQueryClient } from '@tanstack/react-query'
import { AxiosError } from 'axios'
import { participationEvent } from '@/_apis/services/event'
import { EventQueryKeys } from '@/_apis/queries/event'
import { addToast } from '@heroui/react'
Expand All @@ -12,17 +13,23 @@ export const useParticipationEvent = () => {
},
onSuccess: () => {
queryClient.invalidateQueries({
queryKey: [...EventQueryKeys.privateInfo()],
queryKey: EventQueryKeys.byPrivate(),
})
addToast({
title: '응모가 성공적으로 완료되었습니다!',
severity: 'success',
})
},
onError: () => {
onError: (error) => {
console.error('Event participation failed:', error)

const message =
error instanceof AxiosError && error.response?.data?.message
? error.response.data.message
: '응모 중 오류가 발생했습니다. 잠시 후 다시 시도해주세요.'

addToast({
title: '응모 중 오류가 발생했습니다.',
color: 'danger',
title: message,
severity: 'danger',
})
},
Expand Down
36 changes: 36 additions & 0 deletions apps/web/app/_apis/mutations/useSubmitWinnerForm.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import { useMutation, useQueryClient } from '@tanstack/react-query'
import { addToast } from '@heroui/react'

import { submitWinnerForm } from '../services/event'
import type { EventWinnerForm } from '@/_apis/schemas/event'
import { EventQueryKeys } from '@/_apis/queries/event'

type UseSubmitWinnerFormParams = {
eventId: string
}

export const useSubmitWinnerForm = ({ eventId }: UseSubmitWinnerFormParams) => {
const queryClient = useQueryClient()

return useMutation({
mutationFn: (data: EventWinnerForm) => submitWinnerForm(eventId, data),
onSuccess: () => {
queryClient.invalidateQueries({
queryKey: [...EventQueryKeys.result(eventId)],
})

addToast({
title: '전화번호가 성공적으로 제출되었습니다!',
severity: 'success',
})
},
onError: (error) => {
console.error('Failed to submit winner phone number:', error)

addToast({
title: '전화번호 제출에 실패했습니다. 잠시 후 다시 시도해주세요.',
severity: 'danger',
})
},
})
}
36 changes: 22 additions & 14 deletions apps/web/app/_apis/queries/event.ts
Original file line number Diff line number Diff line change
@@ -1,31 +1,39 @@
import { queryOptions } from '@tanstack/react-query'
import {
getPublicEventInfo,
getPrivateEventInfo,
getEventByPublic,
getEventByPrivate,
getEventResult,
getEventByEntries,
} from '@/_apis/services/event'

export const EventQueryKeys = {
all: () => ['event'] as const,
publicInfo: () => [...EventQueryKeys.all(), 'info', 'public'] as const,
privateInfo: () => [...EventQueryKeys.all(), 'info', 'private'] as const,
result: () => [...EventQueryKeys.all(), 'result'] as const,
byPublic: () => [...EventQueryKeys.all(), 'info', 'public'] as const,
byPrivate: () => [...EventQueryKeys.all(), 'info', 'private'] as const,
byEntry: () => [...EventQueryKeys.all(), 'entry'] as const,
result: (eventId: string) =>
[...EventQueryKeys.all(), 'result', eventId] as const,
}

export const useEventQueries = {
publicInfo: () =>
byPublic: () =>
queryOptions({
queryKey: EventQueryKeys.publicInfo(),
queryFn: getPublicEventInfo,
queryKey: EventQueryKeys.byPublic(),
queryFn: getEventByPublic,
}),
privateInfo: () =>
byPrivate: () =>
queryOptions({
queryKey: EventQueryKeys.privateInfo(),
queryFn: getPrivateEventInfo,
queryKey: EventQueryKeys.byPrivate(),
queryFn: getEventByPrivate,
}),
result: () =>
byEntry: () =>
queryOptions({
queryKey: EventQueryKeys.result(),
queryFn: getEventResult,
queryKey: EventQueryKeys.byEntry(),
queryFn: getEventByEntries,
}),
result: (eventId: string) =>
queryOptions({
queryKey: EventQueryKeys.result(eventId),
queryFn: () => getEventResult(eventId),
}),
}
57 changes: 40 additions & 17 deletions apps/web/app/_apis/schemas/event.ts
Original file line number Diff line number Diff line change
@@ -1,32 +1,55 @@
import { z } from 'zod'

export const PublicEventSchema = z.object({
prize: z.object({
description: z.string(),
imageUrl: z.string(),
}),
export const EventPrizeSchema = z.object({
description: z.string(),
imageUrl: z.string(),
})

export const PrivateEventSchema = z.object({
export const BaseEventSchema = z.object({
eventId: z.number().transform(String),
prize: z.object({
description: z.string(),
imageUrl: z.string(),
}),
prize: EventPrizeSchema,
totalWinnersCount: z.number(),
participantsCount: z.number(),
usedTicketsCount: z.number(),
remainingTicketsCount: z.number(),
eventEndDate: z.string(),
})

export const EventResultSchema = z.object({
eventId: z.string(),
export const EventByPublicSchema = z.nullable(
z.object({
prize: EventPrizeSchema,
}),
)

export const EventByPrivateSchema = z.nullable(
BaseEventSchema.extend({
usedTicketsCount: z.number(),
remainingTicketsCount: z.number(),
}),
)

export const EventEntrySchema = BaseEventSchema

export const EventResultSchema = BaseEventSchema.extend({
isWinner: z.boolean(),
participantsCount: z.number(),
usedTicketsCount: z.number(),
isPhoneSubmitted: z.boolean(),
})
Comment on lines +31 to +35
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

EventResultSchema가 결과 응답 계약을 과도하게 강제하고 있습니다.

Line 31에서 BaseEventSchema.extend(...)를 사용하면 결과 응답에 prize, totalWinnersCount, participantsCount, eventEndDate가 모두 필수가 됩니다. 현재 PR의 apps/web/app/_mocks/data/event.tseventResult 형태와도 충돌해서 타입/파싱 실패 위험이 큽니다. 결과 전용 스키마를 별도로 두는 게 안전합니다.

🔧 제안 수정안
-export const EventResultSchema = BaseEventSchema.extend({
-  isWinner: z.boolean(),
-  usedTicketsCount: z.number(),
-  isPhoneSubmitted: z.boolean(),
-})
+export const EventResultSchema = z.object({
+  eventId: z.number().transform(String),
+  isWinner: z.boolean(),
+  participantsCount: z.number(),
+  usedTicketsCount: z.number(),
+  isPhoneSubmitted: z.boolean().default(false),
+})
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
export const EventResultSchema = BaseEventSchema.extend({
isWinner: z.boolean(),
participantsCount: z.number(),
usedTicketsCount: z.number(),
isPhoneSubmitted: z.boolean(),
})
export const EventResultSchema = z.object({
eventId: z.number().transform(String),
isWinner: z.boolean(),
participantsCount: z.number(),
usedTicketsCount: z.number(),
isPhoneSubmitted: z.boolean().default(false),
})
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/web/app/_apis/schemas/event.ts` around lines 31 - 35, EventResultSchema
currently extends BaseEventSchema which forces result responses to include
BaseEventSchema fields (e.g., prize, totalWinnersCount, participantsCount,
eventEndDate) and causes parsing/type failures against the eventResult mock;
change EventResultSchema to be a standalone schema that only validates
result-specific fields (isWinner, usedTicketsCount, isPhoneSubmitted) or create
a separate Result-only schema and use that for response parsing instead of
BaseEventSchema.extend; update references to EventResultSchema where result
responses are validated so they consume the new result-only schema and ensure
compatibility with apps/web/app/_mocks/data/event.ts's eventResult shape.


export const EventWinnerFormSchema = z.object({
phoneNumber: z
.string()
.min(1, '전화번호를 입력해주세요.')
.regex(
/^010-\d{4}-\d{4}$/,
'올바른 형식으로 입력해주세요 (예: 010-1234-5678)',
),
agreements: z.object({
termsAgreed: z.boolean().refine((val) => val === true),
privacyAgreed: z.boolean().refine((val) => val === true),
}),
})

export type PublicEvent = z.infer<typeof PublicEventSchema>
export type PrivateEvent = z.infer<typeof PrivateEventSchema>
export type EventByPublic = z.infer<typeof EventByPublicSchema>
export type EventByPrivate = z.infer<typeof EventByPrivateSchema>
export type EventByEntry = z.infer<typeof EventEntrySchema>
export type EventResult = z.infer<typeof EventResultSchema>
export type EventWinnerForm = z.infer<typeof EventWinnerFormSchema>
37 changes: 26 additions & 11 deletions apps/web/app/_apis/services/event.ts
Original file line number Diff line number Diff line change
@@ -1,33 +1,48 @@
import axiosInstance from '@/_lib/axiosInstance'
import { API_PATH } from '@/_constants/path'
import {
PrivateEventSchema,
PublicEventSchema,
EventByPrivateSchema,
EventByPublicSchema,
EventEntrySchema,
EventResultSchema,
type EventByEntry,
type EventResult,
type PrivateEvent,
type PublicEvent,
type EventByPrivate,
type EventByPublic,
type EventWinnerForm,
} from '@/_apis/schemas/event'

export const getPublicEventInfo = async (): Promise<PublicEvent> => {
export const getEventByPublic = async (): Promise<EventByPublic> => {
const { data } = await axiosInstance.get(API_PATH.EVENT.INFO)
return PublicEventSchema.parse(data)
return EventByPublicSchema.parse(data)
}

export const getPrivateEventInfo = async (): Promise<PrivateEvent> => {
export const getEventByPrivate = async (): Promise<EventByPrivate> => {
const { data } = await axiosInstance.get(API_PATH.EVENT.INFO)
return PrivateEventSchema.parse(data)
return EventByPrivateSchema.parse(data)
}

export const participationEvent = async (body: {
eventId: string
ticketsCount: number
}) => {
const { data } = await axiosInstance.post(API_PATH.EVENT.PARTICIPATIONS, body)
const { data } = await axiosInstance.post(API_PATH.EVENT.ENTRIES, body)
return data
}

export const getEventResult = async (): Promise<EventResult | null> => {
const { data } = await axiosInstance.get(API_PATH.EVENT.RESULT)
export const getEventByEntries = async (): Promise<EventByEntry[]> => {
const { data } = await axiosInstance.get(API_PATH.EVENT.ENTRIES)
return EventEntrySchema.array().parse(data)
}

export const getEventResult = async (eventId: string): Promise<EventResult> => {
const { data } = await axiosInstance.get(API_PATH.EVENT.RESULT(eventId))
return EventResultSchema.parse(data)
}

export const submitWinnerForm = async (
eventId: string,
data: EventWinnerForm,
): Promise<void> => {
await axiosInstance.post(API_PATH.EVENT.APPLY(eventId), data)
}
6 changes: 4 additions & 2 deletions apps/web/app/_constants/path.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,9 @@ export const API_PATH = {
},
EVENT: {
INFO: '/events',
PARTICIPATIONS: '/events/entries',
RESULT: '/events/results',
ENTRIES: '/events/entries',
RESULT: (eventId: string) => `/events/${eventId}/entries`,
APPLY: (eventId: string) => `/events/${eventId}/apply`,
Comment on lines +39 to +41
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

cat -n apps/web/app/_constants/path.ts

Repository: knu-matzip/Matzip-Client

Length of output: 2991


🏁 Script executed:

rg -n "API_PATH\.EVENT\.RESULT" --type ts --type tsx -A 2 -B 2

Repository: knu-matzip/Matzip-Client

Length of output: 95


🏁 Script executed:

rg -n "API_PATH\.EVENT\.RESULT[^(]" --type ts --type tsx

Repository: knu-matzip/Matzip-Client

Length of output: 95


🏁 Script executed:

rg "API_PATH\.EVENT\.RESULT" -A 2 -B 2

Repository: knu-matzip/Matzip-Client

Length of output: 450


🏁 Script executed:

rg "EVENT\.RESULT" --type ts

Repository: knu-matzip/Matzip-Client

Length of output: 179


🏁 Script executed:

fd -t ts -t tsx . | head -20

Repository: knu-matzip/Matzip-Client

Length of output: 237


🏁 Script executed:

rg "EVENT\.RESULT" -i

Repository: knu-matzip/Matzip-Client

Length of output: 179


🏁 Script executed:

cat -n apps/web/app/_apis/services/event.ts

Repository: knu-matzip/Matzip-Client

Length of output: 1842


함수에 명시적 반환 타입 추가 필요

코딩 가이드라인에서 "TypeScript 파일의 함수는 반환 타입이 필수"라고 명시되어 있으나, 현재 파일의 모든 매개변수를 받는 함수들이 명시적 반환 타입을 선언하지 않고 있습니다.

예시:

  • Line 40: RESULT: (eventId: string) => /events/${eventId}/entries`` → RESULT: (eventId: string): string => ... 필요
  • Line 41: APPLY: (eventId: string) => /events/${eventId}/apply`` → APPLY: (eventId: string): string => ... 필요
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/web/app/_constants/path.ts` around lines 39 - 41, Add explicit return
types to the arrow functions in the path constants: change RESULT and APPLY to
include a : string return type (i.e., RESULT: (eventId: string): string =>
`/events/${eventId}/entries` and APPLY: (eventId: string): string =>
`/events/${eventId}/apply`) so the TypeScript files comply with the rule that
functions must declare their return type.

},
REQUEST: {
LIST: '/requests/places',
Expand Down Expand Up @@ -66,6 +67,7 @@ export const CLIENT_PATH = {
REQUEST_DETAIL: (id: string | number) => `/requests/${id}`,
EVENTS_FOOD_SLOT: '/events/food-slot',
EVENTS_LUCKY_DRAW: '/events/lucky-draw',
EVENTS_RESULT: (id: string | number) => `/events/lucky-draw/result/${id}`,
EVENT_GIFTICON: '/events/gifticon',
EVENT_GIFTICON_DETAIL: (id: string | number) => `/events/gifticon/${id}`,
LOGIN: '/login',
Expand Down
31 changes: 29 additions & 2 deletions apps/web/app/_mocks/data/event.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type { PrivateEvent, EventResult } from '@/_apis/schemas/event'
import type { EventByPrivate, EventResult } from '@/_apis/schemas/event'

export const event: PrivateEvent = {
export const event: EventByPrivate = {
eventId: '1',
prize: {
description: 'BHC 뿌링클 치킨 기프티콘 1장',
Expand All @@ -20,3 +20,30 @@ export const eventResult: EventResult = {
participantsCount: 3,
usedTicketsCount: 3,
}

export const EVENT_ENTRIES = {
data: [
{
eventId: 1,
totalWinnersCount: 3,
participantsCount: 27,
prize: {
description: 'BHC 뿌링클 치킨 기프티콘 1장',
imageUrl:
'https://search.pstatic.net/common/?src=https%3A%2F%2Fpup-review-phinf.pstatic.net%2FMjAyNTA3MjNfNzkg%2FMDAxNzUzMjYzMDcwMDI4.YZPG9RYk5jn6jJtaNcaba70NF9uqeD_o8hY4xJ9xc6Eg.mMpLZc8GqkgQAslKGy-gPgAjiktsTSUGuMPQbNdIDWYg.JPEG%2F20250723_182109.jpg',
},
eventEndDate: '2025-12-18T00:00:00.000000',
},
{
eventId: 2,
totalWinnersCount: 4,
participantsCount: 27,
prize: {
description: 'BHC 뿌링클 치킨 기프티콘 1장',
imageUrl:
'https://search.pstatic.net/common/?src=https%3A%2F%2Fpup-review-phinf.pstatic.net%2FMjAyNTA3MjNfNzkg%2FMDAxNzUzMjYzMDcwMDI4.YZPG9RYk5jn6jJtaNcaba70NF9uqeD_o8hY4xJ9xc6Eg.mMpLZc8GqkgQAslKGy-gPgAjiktsTSUGuMPQbNdIDWYg.JPEG%2F20250723_182109.jpg',
},
eventEndDate: '2025-12-18T00:00:00.000000',
},
],
}
15 changes: 9 additions & 6 deletions apps/web/app/_mocks/handlers/eventHandlers.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,19 @@
import { http, HttpResponse } from 'msw'
import { eventResult } from '../data/event'
import { EVENT_ENTRIES } from '../data/event'
import { API_PATH } from '@/_constants/path'
import { addBaseUrl } from './addBaseUrl'

export const EventHandlers = [
// http.get(addBaseUrl(API_PATH.EVENT.INFO), () => {
// return HttpResponse.json(event)
// }),
http.post(addBaseUrl(API_PATH.EVENT.PARTICIPATIONS), () => {
return HttpResponse.json({ message: '성공' })
}),
http.get(addBaseUrl(API_PATH.EVENT.RESULT), () => {
return HttpResponse.json(eventResult)
// http.post(addBaseUrl(API_PATH.EVENT.ENTRIES), () => {
// return HttpResponse.json({ message: '성공' })
// }),
// http.get(addBaseUrl('/events/:eventId/entries'), () => {
// return HttpResponse.json(eventResult)
// }),
http.get(addBaseUrl(API_PATH.EVENT.ENTRIES), () => {
return HttpResponse.json(EVENT_ENTRIES)
}),
]
39 changes: 0 additions & 39 deletions apps/web/app/events/lucky-draw/LuckyDraw.tsx

This file was deleted.

Loading