Skip to content

Commit b5e0a7f

Browse files
authored
Merge pull request #274 from CSE-Shaco/develop
[FEAT/REF] 디자인 시스템 고도화 및 리크루팅 사용자 경험 개선
2 parents aa3d7f0 + e495e94 commit b5e0a7f

37 files changed

Lines changed: 2039 additions & 2109 deletions

src/app/login/page.tsx

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import {
1818
import { PENDING_SIGNUP_STORAGE_KEY, type PendingSignupPayload } from '@/constant/auth'
1919
import { unwrapApiResponse } from '@/utils/api/unwrap'
2020

21-
const DEFAULT_FALLBACK_ROUTE = '/main'
21+
const DEFAULT_FALLBACK_ROUTE = '/'
2222

2323
const getSafeNextUrl = (raw: string | null): string => {
2424
if (!raw) return DEFAULT_FALLBACK_ROUTE
@@ -235,10 +235,12 @@ export default function LoginPage() {
235235
GDGoC INHA 홈페이지를 이용하려면 로그인하세요.
236236
</p>
237237
</div>
238-
<GdgGoogleLoginButton device="pc" onClick={handleGoogleLogin} disabled={!canUseGoogleLogin || loading} loading={loading} />
239-
<div className="space-y-1 typo-c1 text-gray-400">
240-
<p>@inha.edu 계정만 사용 가능합니다</p>
241-
{errorMessage ? <p className="text-red">{errorMessage}</p> : null}
238+
<div className="flex flex-col items-center gap-2">
239+
<GdgGoogleLoginButton device="pc" onClick={handleGoogleLogin} disabled={!canUseGoogleLogin || loading} loading={loading} />
240+
<div className="space-y-1 typo-c1 text-gray-400">
241+
<p>@inha.edu 계정만 사용 가능합니다</p>
242+
{errorMessage ? <p className="text-red">{errorMessage}</p> : null}
243+
</div>
242244
</div>
243245
</div>
244246
</div>
@@ -262,10 +264,12 @@ export default function LoginPage() {
262264
GDGoC INHA 홈페이지를 이용하려면 로그인하세요.
263265
</p>
264266
</div>
265-
<GdgGoogleLoginButton device="mobile" onClick={handleGoogleLogin} disabled={!canUseGoogleLogin || loading} loading={loading} />
266-
<div className="space-y-1 typo-m-c2 text-gray-400">
267-
<p>@inha.edu 계정만 사용 가능합니다</p>
268-
{errorMessage ? <p className="text-red">{errorMessage}</p> : null}
267+
<div className="flex flex-col items-center gap-2">
268+
<GdgGoogleLoginButton device="mobile" onClick={handleGoogleLogin} disabled={!canUseGoogleLogin || loading} loading={loading} />
269+
<div className="space-y-1 typo-m-c2 text-gray-400">
270+
<p>@inha.edu 계정만 사용 가능합니다</p>
271+
{errorMessage ? <p className="text-red">{errorMessage}</p> : null}
272+
</div>
269273
</div>
270274
</div>
271275
</div>

src/app/main/layout.tsx

Lines changed: 0 additions & 18 deletions
This file was deleted.

src/app/main/page.tsx

Lines changed: 0 additions & 52 deletions
This file was deleted.

src/app/recruit/core/CustomCheckbox.tsx

Lines changed: 0 additions & 50 deletions
This file was deleted.
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
'use client'
2+
3+
import Link from 'next/link'
4+
import { GdgLogo, GdgButton } from '@/components/ui/design-system'
5+
6+
export default function RecruitCoreCompleted() {
7+
return (
8+
<main className="min-h-screen bg-black overflow-x-hidden">
9+
<div className="relative z-10 pt-18 pb-32 mobile:pt-12 mobile:pb-24 px-4 layout-grid layout-grid--narrow-screen layout-grid--4 gap-y-10">
10+
{/* Header */}
11+
<div className="col-span-4 flex items-center gap-3 mobile:gap-2">
12+
<GdgLogo mode="auto" />
13+
<h1 className="typo-h3 text-white mobile:typo-m-h3">Core Member 지원 완료</h1>
14+
</div>
15+
16+
{/* Content Sections - Step 2 UI 이관 */}
17+
<div className="col-span-4 flex flex-col gap-10 w-full">
18+
<div className="space-y-2">
19+
<p className="pl-2 typo-s2 mobile:typo-m-s1 text-white">모집 일정</p>
20+
<div className="rounded-xl bg-gray-100 px-4 py-3 text-white">
21+
<div className="space-y-4 typo-b2 mobile:space-y-3 mobile:typo-b3">
22+
<div className="space-y-1">
23+
<p>✅ 서류 지원 기간</p>
24+
<p>2025. 12. 26.(금) - 2026. 01. 09.(금) 23:59:59</p>
25+
</div>
26+
<div className="space-y-1">
27+
<p>✅ 서류 결과 발표</p>
28+
<p>~ 2026. 01. 10.(토)</p>
29+
</div>
30+
<div className="space-y-1">
31+
<p>✅ 면접 진행 기간</p>
32+
<p>2026. 01. 12.(월) - 2026. 01. 16.(금)</p>
33+
<p className="typo-c2 text-gray-700">
34+
※ 지원자 및 면접관 일정에 따라 마감 전 면접이 가능할 수 있습니다.
35+
</p>
36+
</div>
37+
<div className="space-y-1">
38+
<p>✅ 최종 결과 발표</p>
39+
<p>~ 2026. 01. 16.(금)</p>
40+
</div>
41+
</div>
42+
</div>
43+
</div>
44+
45+
<div className="space-y-2">
46+
<p className="pl-2 typo-s2 mobile:typo-m-s1 text-white">면접 안내</p>
47+
<div className="rounded-xl bg-gray-100 px-4 py-3 text-white typo-b2 mobile:typo-b3">
48+
<p>• 원칙적으로 대면 면접을 진행하며, 부득이한 경우 비대면으로 조정될 수 있습니다.</p>
49+
<p className="mt-2">• 면접은 인하대학교 내부 장소에서 진행됩니다.</p>
50+
</div>
51+
</div>
52+
53+
<div className="space-y-2">
54+
<p className="pl-2 typo-s2 mobile:typo-m-s1 text-white">활동 안내</p>
55+
<div className="rounded-xl bg-gray-100 px-4 py-3 text-white typo-b2 mobile:typo-b3">
56+
<p>• 운영진으로 활동 시, 매주 1회 정기 운영진 회의에 필수 참석해야 합니다.</p>
57+
<p className="mt-1 typo-c2 text-gray-700">※ 일정은 1월 내로 공지 드립니다.</p>
58+
</div>
59+
</div>
60+
61+
<div className="flex justify-end pt-4">
62+
<Link href="/">
63+
<GdgButton variant="active" size="small">
64+
홈으로 이동
65+
</GdgButton>
66+
</Link>
67+
</div>
68+
</div>
69+
</div>
70+
</main>
71+
)
72+
}

src/app/recruit/core/page.tsx

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
type ChangeEvent,
1111
type FormEvent
1212
} from 'react'
13+
import { useRouter } from 'next/navigation'
1314

1415
import {
1516
GdgButton,
@@ -183,6 +184,7 @@ function TextareaField({
183184
}
184185

185186
export default function RecruitCore() {
187+
const router = useRouter()
186188
const { apiClient } = useAuthenticatedApi()
187189

188190
const [currentStep, setCurrentStep] = useState<RecruitStep>(0)
@@ -249,10 +251,16 @@ export default function RecruitCore() {
249251
major: prev.major || payload.major || '',
250252
phone: formatPhoneNumberInput(prev.phone || payload.phone || '')
251253
}))
252-
} catch (error) {
254+
} catch (error: any) {
253255
if (!active) return
254-
console.error('[코어 리크루팅] 기본 정보 불러오기에 실패했습니다.', error)
255-
setPrefillError('기본 정보를 불러오지 못했습니다. 직접 입력해주세요.')
256+
const errorCode = error.response?.data?.code
257+
if (errorCode === 'ALREADY_APPLIED') {
258+
alert('이미 지원이 완료되었습니다. 제출된 지원서는 마이페이지에서 확인하실 수 있습니다.')
259+
router.replace('/recruit/core/completed')
260+
} else {
261+
console.error('[코어 리크루팅] 기본 정보 불러오기에 실패했습니다.', error)
262+
setPrefillError('기본 정보를 불러오지 못했습니다. 직접 입력해주세요.')
263+
}
256264
}
257265
}
258266

@@ -388,9 +396,11 @@ export default function RecruitCore() {
388396

389397
await apiClient.post('/recruit/core/applications', payload)
390398
alert('지원서가 제출되었습니다!')
399+
router.replace('/recruit/core/completed')
391400
} catch (error: any) {
392401
if (error?.response?.status === 409) {
393402
alert('이미 지원이 완료되었습니다.')
403+
router.replace('/recruit/core/completed')
394404
} else {
395405
alert('지원서 제출 중 오류가 발생했습니다.')
396406
}
@@ -616,9 +626,9 @@ export default function RecruitCore() {
616626
<GdgButton
617627
type="button"
618628
device="pc"
619-
size="large"
620-
variant={selected ? 'active' : 'default'}
621-
fullWidth
629+
size="small"
630+
variant={selected ? 'pressed' : 'bordered'}
631+
widthToken="small"
622632
onClick={() => handleTeamChange(team.id)}
623633
>
624634
{team.label}
@@ -628,9 +638,9 @@ export default function RecruitCore() {
628638
<GdgButton
629639
type="button"
630640
device="mobile"
631-
size="large"
632-
variant={selected ? 'active' : 'default'}
633-
fullWidth
641+
size="small"
642+
variant={selected ? 'pressed' : 'bordered'}
643+
widthToken="medium"
634644
onClick={() => handleTeamChange(team.id)}
635645
>
636646
{team.label}
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { cn } from '@/utils/cn'
88
function Section({ title, children }: { title: string; children: React.ReactNode }) {
99
return (
1010
<div className="flex flex-col gap-2 w-full max-w-[550px]">
11-
<h3 className="typo-s3 text-white pl-2">{title}</h3>
11+
<h2 className="typo-s2 typo-m-s1 text-white pl-2">{title}</h2>
1212
<div className="flex flex-col gap-4 bg-gray-100 rounded-xl p-4 w-full">{children}</div>
1313
</div>
1414
)
@@ -53,15 +53,15 @@ function BulletPoint({ children }: { children: React.ReactNode }) {
5353
export default function RecruitSubmit() {
5454
return (
5555
<main className="min-h-screen bg-black overflow-x-hidden">
56-
<div className="relative z-10 flex flex-col items-center pt-18 pb-32 mobile:pt-12 mobile:pb-24 px-4 gap-10">
56+
<div className="relative z-10 pt-18 pb-32 mobile:pt-12 mobile:pb-24 px-4 layout-grid layout-grid--narrow-screen layout-grid--4 gap-y-10">
5757
{/* Header */}
58-
<div className="flex items-center gap-3 mobile:gap-2">
58+
<div className="col-span-4 flex items-center gap-3 mobile:gap-2">
5959
<GdgLogo mode="auto" />
6060
<h1 className="typo-h3 text-white mobile:typo-m-h3">GDGoC Inha Univ. 모집 안내</h1>
6161
</div>
6262

6363
{/* Content Sections */}
64-
<div className="flex flex-col gap-10 w-full items-center">
64+
<div className="col-span-4 flex flex-col gap-10 w-full">
6565
{/* 모집 일정 */}
6666
<Section title="모집 일정">
6767
<InfoRow
@@ -198,7 +198,7 @@ export default function RecruitSubmit() {
198198
</div>
199199

200200
<Link
201-
href="/core-recruit"
201+
href="/recruit/core"
202202
className="inline-flex items-center justify-center rounded-full bg-red px-12 py-3.5 text-white font-bold text-[14px] leading-[20px] hover:bg-red-400 transition-colors shadow-[0px_2px_50px_rgba(0,0,0,0.35)]"
203203
>
204204
운영진(CORE) 지원하러 가기

0 commit comments

Comments
 (0)