Skip to content

Commit 9e0ee9d

Browse files
committed
#16 행사 일정 정돈 및 자동 리본, 필터, 클릭 제한 이벤트 적용 완료
1 parent ee7466f commit 9e0ee9d

18 files changed

Lines changed: 1801 additions & 152 deletions

package-lock.json

Lines changed: 398 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
"react-dom": "^19.2.0",
2121
"react-icons": "^5.5.0",
2222
"react-router-dom": "^7.13.1",
23+
"recharts": "^3.8.0",
2324
"tailwind-merge": "^3.5.0",
2425
"tailwindcss-animate": "^1.0.7"
2526
},
161 KB
Loading
70.8 KB
Loading
230 KB
Loading
89 KB
Loading
113 KB
Loading
135 KB
Loading

src/data/constants.ts

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,28 @@
11
// 사이트 전반에서 공유하는 상수 및 레이블 매핑
22

33
// ─── 행사 종류 / 참여 대상 ───────────────────────────────────────────
4-
export type EventKind = 'regular' | 'ongoing'
4+
export type EventKind = 'regular' | 'ongoing' | 'special'
55

66
export const EVENT_KIND: Record<EventKind, { label: string; desc: string }> = {
77
regular: {
8-
label: '정기',
8+
label: '정기 행사',
99
desc: 'SSAFYnity를 대표하는 대규모 정기 행사예요.\n연 2회(상*하반기 1회씩), 50~100명 이상 규모로 진행되는 동문회의 정체성을 담은 행사입니다',
1010
},
1111
ongoing: {
12-
label: '상시',
13-
desc: '정회원을 위한 소규모 행사를 상시 운영합니다.\n더 자주, 더 가깝게 동문들과 만날 수 있는 자리입니다. 일부 공석에 대해 일반회원도 참여가능해요.',
12+
label: '상시 행사',
13+
desc: '비정기적인 소규모 행사를 상시 운영합니다.\n주로 정회원 위주의 행사로 진행되며, 일부 공석에 대해서 일반회원도 참여할 수 있어요..',
14+
},
15+
special: {
16+
label: '단발성 행사',
17+
desc: '일회성으로 기획된 특별 행사예요.\n정기·상시 일정과 별개로, 특정 목적이나 기회에 맞춰 열리는 행사입니다.',
1418
},
1519
}
1620

1721
// label만 필요한 곳에서 사용
1822
export const EVENT_KIND_LABEL: { [K in EventKind]: string } = {
1923
regular: EVENT_KIND.regular.label,
2024
ongoing: EVENT_KIND.ongoing.label,
25+
special: EVENT_KIND.special.label,
2126
}
2227

2328
export const EVENT_AUDIENCE = {
@@ -41,8 +46,8 @@ export const EVENT_AUDIENCE_LABEL: { [K in EventAudience]: string } = {
4146
// 복수 선택 가능 (예: ['online', 'offline', 'recorded'])
4247
export const EVENT_FORMAT = {
4348
offline: { label: '오프라인', desc: '현장에 직접 방문하여 참여하는 행사예요.' },
44-
online: { label: '온라인', desc: '온라인으로 참여하는 행사예요. 참여 링크는 별도 안내돼요.' },
45-
recorded: { label: '녹화제공', desc: '참석하지 못해도 추후 녹화본을 제공해드려요.' },
49+
online: { label: '온라인', desc: '온라인으로 참여하는 행사예요. 참여 안내 및 링크는 별도 안내돼요.' },
50+
recorded: { label: '녹화제공', desc: '추후 녹화본을 제공해드려요. 다만, 편집시간이 소요되니 최대 1~2개월 기다려주세요!' },
4651
} as const
4752

4853
export type EventFormat = keyof typeof EVENT_FORMAT
@@ -75,6 +80,23 @@ export type RecruitDateRange = {
7580
endTime?: string // 접수 종료 시각 (기본 '23:59')
7681
}
7782

83+
// ─── 행사 안내 (notices) ─────────────────────────────────────────────
84+
export type EventFee = {
85+
members?: number | string // 일반회원 (숫자: 원, 문자: '무료', '자율' 등)
86+
regular?: number | string // 정회원
87+
external?: number | string // 외부인
88+
operator?: number | string // 운영진
89+
note?: string // 결제 방식 등 부가 안내 (\n 지원)
90+
}
91+
92+
export type EventNotices = {
93+
fee?: EventFee // 참여비
94+
refund?: string[] // 환불 기준 (항목별, \n 지원)
95+
checklist?: string[] // 필수 확인 사항 (항목별, \n 지원)
96+
items?: string[] // 준비물 (항목별, \n 지원)
97+
custom?: { title: string; body: string }[] // 기타 자유 형식 안내 (\n 지원)
98+
}
99+
78100
// ─── 행사 참여자 분류 ────────────────────────────────────────────────
79101
export type ParticipantBreakdown = {
80102
members?: number // 일반회원
@@ -103,9 +125,11 @@ export type Event = {
103125
summary: string
104126
img?: string
105127
formUrl?: string // 접수 폼 URL (만료되면 생략)
106-
capacity?: number // 정원
128+
capacity?: number | 'unlimited' // 정원 (숫자: 명, 'unlimited': 제한 없음)
107129
registrants?: ParticipantBreakdown // 최종 접수자
108130
attendees?: ParticipantBreakdown // 실제 참여자
131+
completions?: ParticipantBreakdown // 수료자 (챌린지 등 수료 기준이 있는 행사)
132+
notices?: EventNotices // 행사 안내 (참여비·환불·준비물·필수확인 등)
109133
note?: string // 내부 메모 (운영진 참고용, 사이트에 노출 안 됨)
110134
internal?: boolean // true면 행사 일정에서 제외, 역대 행사에는 표시
111135
}

src/data/events/2022.ts

Lines changed: 80 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,29 @@ export const events2022: Event[] = [
1010
recruitDate: { start: '2022-05-16', end: '2022-06-01' },
1111
location: '멀티캠퍼스 역삼 18층',
1212
locationUrl: { naver: 'https://naver.me/x5GzwAww', kakao: 'https://place.map.kakao.com/21414107', google: 'https://maps.app.goo.gl/7cw8g2vDrjxw1AQU9' },
13+
kind: 'special',
1314
audience: 'members',
1415
format: ['online', 'offline'],
1516
summary: '싸피니티 공식 출범을 알리는 첫 번째 행사',
17+
notices: {
18+
fee: {
19+
members: '무료',
20+
},
21+
refund: [
22+
'해당사항 없음',
23+
],
24+
checklist: [
25+
'입장 시 이름·기수·캠퍼스 등 접수 정보를 확인합니다.',
26+
'도착 후 18층 프론트 데스크로 먼저 방문해주세요.',
27+
'행사 후 희망자에 한해 네트워킹 시간이 진행됩니다.',
28+
],
29+
custom: [
30+
{
31+
title: '주차 안내',
32+
body: '별도 주차장이 제공되지 않습니다. 가급적 대중교통을 이용해주세요.',
33+
},
34+
],
35+
},
1636
note: '2022년은 정회원 개념이 없었음',
1737
img: '/events/2022-founding-ceremony.jpg',
1838
},
@@ -23,6 +43,14 @@ export const events2022: Event[] = [
2343
format: ['offline'],
2444
audience: 'operator',
2545
summary: '1박 2일 집행부 워크숍 및 친목 도모',
46+
notices: {
47+
custom: [
48+
{
49+
title: '비용 안내',
50+
body: '이 행사는 동문회비를 사용하지 않습니다.\n참여를 희망하는 집행부원에 한해 개인 자부담으로 진행됩니다.',
51+
},
52+
],
53+
},
2654
note: '동문회비 미사용, 운영진 자부담으로 진행 / 2022년은 정회원 개념이 없었음',
2755
img: '/events/2022-operator-mt.jpg',
2856
internal: true,
@@ -34,10 +62,32 @@ export const events2022: Event[] = [
3462
recruitDate: { start: '2022-08-09', end: '2022-08-15' },
3563
location: '멀티캠퍼스 역삼 18층',
3664
locationUrl: { naver: 'https://naver.me/x5GzwAww', kakao: 'https://place.map.kakao.com/21414107', google: 'https://maps.app.goo.gl/7cw8g2vDrjxw1AQU9' },
37-
kind: 'ongoing',
65+
kind: 'special',
3866
audience: 'members',
3967
format: ['offline', 'online'],
4068
summary: '현직 IT CTO가 말하는 IT 트렌드 이야기',
69+
notices: {
70+
fee: {
71+
members: '무료',
72+
},
73+
refund: [
74+
'해당사항 없음',
75+
],
76+
checklist: [
77+
'입장 전 1층 접수 데스크에서 명찰을 수령해주세요.',
78+
'코로나19 방역 지침에 따라 마스크를 반드시 착용해주세요.',
79+
],
80+
custom: [
81+
{
82+
title: '행사 후 프로그램',
83+
body: '추첨을 통해 연사님과의 Q&A 시간이 진행됩니다.\n참석자 간 네트워킹도 별도로 진행됩니다.',
84+
},
85+
{
86+
title: '주차 안내',
87+
body: '별도 주차장이 제공되지 않습니다. 가급적 대중교통을 이용해주세요.',
88+
},
89+
],
90+
},
4191
note: '2022년은 정회원 개념이 없었음',
4292
img: '/events/2022-open-talk.jpg',
4393
},
@@ -52,6 +102,35 @@ export const events2022: Event[] = [
52102
kind: 'regular',
53103
audience: 'members',
54104
summary: '동문들과 함께하는 가을 체육 행사',
105+
notices: {
106+
fee: {
107+
members: '무료',
108+
},
109+
refund: [
110+
'해당사항 없음',
111+
],
112+
checklist: [
113+
'공원 입구에서 축구장까지 도보 이동이 있으니 여유 있게 도착해주세요.',
114+
],
115+
items: [
116+
'간편한 운동 복장',
117+
'선크림 등 자외선 차단 용품',
118+
],
119+
custom: [
120+
{
121+
title: '우천 안내',
122+
body: '우천 시 일정이 변경될 수 있습니다.\n변경 사항은 추후 공지드립니다.',
123+
},
124+
{
125+
title: '취소 안내',
126+
body: '팀전으로 진행되는 행사 특성상,\n참여가 어려울 경우 반드시 사전에 연락 부탁드립니다.',
127+
},
128+
{
129+
title: '뒷풀이 안내',
130+
body: '행사 후 희망자에 한해 뒷풀이 회식이 진행됩니다.\n음주 가능성이 있으니 차량 이용 예정이신 분은 참고해주세요.',
131+
},
132+
],
133+
},
55134
note: '2022년은 정회원 개념이 없었음',
56135
img: '/events/2022-sports-day.png',
57136
},

0 commit comments

Comments
 (0)