Skip to content

Commit 4295a7d

Browse files
authored
Merge pull request #276 from CSE-Shaco/develop
[FEAT/REF] 2026-1 리크루팅 업데이트 및 디자인 시스템/보안 강화
2 parents 0659e0c + b05d52a commit 4295a7d

15 files changed

Lines changed: 188 additions & 123 deletions

File tree

src/app/login/layout.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ import type { Metadata } from 'next'
22
import type { ReactNode } from 'react';
33

44
export const metadata: Metadata = {
5-
title: 'SignIn',
6-
description: 'SignIn to your account',
5+
title: '로그인',
6+
description: 'GDGoC INHA 계정으로 로그인하세요.',
77
};
88

99
export default function LoginLayout({ children }: { children: ReactNode }) {

src/app/login/page.tsx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,14 @@ export default function LoginPage() {
142142
}
143143

144144
if (data.user && data.accessToken && data.refreshToken) {
145+
console.log('[LoginPage] Existing user login success, saving to storage')
145146
setUser(data.user, data.accessToken, data.refreshToken)
147+
} else {
148+
console.warn('[LoginPage] Login success but missing data', {
149+
hasUser: !!data.user,
150+
hasAt: !!data.accessToken,
151+
hasRt: !!data.refreshToken
152+
})
146153
}
147154
if (typeof window !== 'undefined') {
148155
sessionStorage.removeItem(PENDING_SIGNUP_STORAGE_KEY)

src/app/recruit/core/layout.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
1-
'use client'
2-
1+
import type { Metadata } from 'next'
32
import ApiCodeGuard from '@/components/auth/ApiCodeGuard'
43

4+
export const metadata: Metadata = {
5+
title: '운영진 모집',
6+
description: 'GDGoC INHA 2026-1 운영진(CORE) 멤버를 모집합니다.'
7+
}
8+
59
export default function RecruitCoreLayout({ children }) {
610
return (
711
<ApiCodeGuard requiredRole="GUEST" nextOverride="/recruit/core">

src/app/recruit/member/completed/page.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ export default function RecruitSubmit() {
132132
</div>
133133

134134
<div className="flex flex-col gap-1">
135-
<p className="typo-s2 text-white mobile:typo-m-s2 mb-1">💵 25-2 회비</p>
135+
<p className="typo-s2 text-white mobile:typo-m-s2 mb-1">💵 26-1 회비</p>
136136
<BulletPoint>20,000 원</BulletPoint>
137137
</div>
138138

@@ -143,7 +143,7 @@ export default function RecruitSubmit() {
143143
] 으로 변경해주세요!
144144
</BulletPoint>
145145
<BulletPoint>
146-
→ ex) <span className="font-bold">24김인하</span>
146+
→ ex) <span className="font-bold">25김인하</span>
147147
</BulletPoint>
148148
</div>
149149

src/app/recruit/member/layout.tsx

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { type ReactNode } from 'react'
2+
import { type Metadata } from 'next'
3+
4+
export const metadata: Metadata = {
5+
title: '멤버 모집',
6+
description: 'GDGoC INHA 2026-1 신입 멤버를 모집합니다.'
7+
}
8+
9+
export default function RecruitMemberLayout({ children }: { children: ReactNode }) {
10+
return <>{children}</>
11+
}

src/app/signup/layout.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ import type { Metadata } from 'next'
22
import type { ReactNode } from 'react'
33

44
export const metadata: Metadata = {
5-
title: 'SignUp',
6-
description: 'GDGoC 가입을 완료하세요'
5+
title: '회원가입',
6+
description: 'GDGoC INHA 멤버 가입을 완료하세요.'
77
}
88

99
export default function SignupLayout({ children }: { children: ReactNode }) {

src/app/signup/page.tsx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,14 @@ export default function SignupPage() {
259259

260260
const data = unwrapApiResponse<SignupResponseBody>(response.data)
261261
if (data?.user && data.accessToken && data.refreshToken) {
262+
console.log('[SignupPage] Signup success, saving to storage')
262263
setUser(data.user, data.accessToken, data.refreshToken)
264+
} else {
265+
console.warn('[SignupPage] Signup success but missing data', {
266+
hasUser: !!data?.user,
267+
hasAt: !!data?.accessToken,
268+
hasRt: !!data?.refreshToken
269+
})
263270
}
264271
sessionStorage.removeItem(PENDING_SIGNUP_STORAGE_KEY)
265272
router.replace(nextUrl)

src/components/landing/AboutSection.tsx

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -79,32 +79,32 @@ export default function AboutSection() {
7979
<div className="flex flex-col items-center w-full h-full">
8080
<div className="text-white/90 text-[3.5vw] font-semibold mobile:text-[5vw] mt-40 mobile:mt-24 mobile:mx-[30px]">
8181
<span className="font-google-sans-flex font-normal mobile:text-3xl">
82-
<span className="text-red-400 neon1 neon-text-sm">G</span>
83-
<span className="text-green-400 neon1 neon-text-sm">D</span>
84-
<span className="text-yellow-400 neon1 neon-text-sm">G</span>
85-
<span className="text-blue-400 neon1 neon-text-sm">o</span>
86-
<span className="text-red-400 neon1 neon-text-sm">C</span>
82+
<span className="text-red neon1 neon-text-sm">G</span>
83+
<span className="text-green neon1 neon-text-sm">D</span>
84+
<span className="text-yellow neon1 neon-text-sm">G</span>
85+
<span className="text-blue neon1 neon-text-sm">o</span>
86+
<span className="text-red neon1 neon-text-sm">C</span>
8787
<span className="text-white ml-2 neon-text-sm">INHA</span>
8888
</span>
8989
, 어떤 곳인가요?
9090
</div>
9191
<div className="text-white space-y-4 font-semibold text-[2.5vw] mobile:text-xl flex flex-col items-center mt-20 gap-y-4 text-center">
9292
<p id="section2-text1" className="opacity-0">
93-
<span className="text-red-400">개발</span>에 관심 있는 사람들이 모여{' '}
93+
<span className="text-red">개발</span>에 관심 있는 사람들이 모여{' '}
9494
<br className="hidden mobile:inline" />
95-
<span className="text-green-400">네트워킹</span> 하고,
95+
<span className="text-green">네트워킹</span> 하고,
9696
</p>
9797
<p id="section2-text2" className="opacity-0">
9898
다양한 프로젝트에 참여하며 <br className="hidden mobile:inline" />
99-
<span className="text-yellow-400">함께 성장</span>하는 공간입니다.
99+
<span className="text-yellow">함께 성장</span>하는 공간입니다.
100100
</p>
101101
<p id="section2-text3" className="opacity-0">
102102
비개발자부터 숙련된 개발자까지 <br className="hidden mobile:inline" />
103-
누구나 <span className="text-blue-400">함께</span>할 수 있습니다.
103+
누구나 <span className="text-blue">함께</span>할 수 있습니다.
104104
</p>
105105
<p id="section2-text4" className="opacity-0">
106106
GDGoC라는 글로벌 IT 무대에서 <br className="hidden mobile:inline" />
107-
끊임없이 기회를 찾고 <span className="text-red-400">성장</span>해보세요!
107+
끊임없이 기회를 찾고 <span className="text-red">성장</span>해보세요!
108108
</p>
109109
</div>
110110
</div>
Lines changed: 85 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -1,98 +1,99 @@
1-
import React, { useState, useEffect } from 'react';
2-
import Image from 'next/image';
3-
import gsap from 'gsap';
1+
import React, { useState, useEffect } from 'react'
2+
import Image from 'next/image'
3+
import gsap from 'gsap'
44

5-
import seminar from '@public/images/activity/seminar.jpg';
6-
import snack from '@public/images/activity/snack.jpg';
7-
import party from '@public/images/activity/party.jpg';
8-
import conf from '@public/images/activity/conf.jpg';
9-
import googleconf from '@public/images/activity/googleconf.jpg';
10-
import christmas from '@public/images/activity/christmas.jpg';
5+
import seminar from '@public/images/activity/seminar.jpg'
6+
import snack from '@public/images/activity/snack.jpg'
7+
import party from '@public/images/activity/party.jpg'
8+
import conf from '@public/images/activity/conf.jpg'
9+
import googleconf from '@public/images/activity/googleconf.jpg'
10+
import christmas from '@public/images/activity/christmas.jpg'
1111

1212
function ActivitiesSection() {
13+
const [hoveredCard, setHoveredCard] = useState(1)
1314

14-
const [hoveredCard, setHoveredCard] = useState(1);
15+
const handleMouseEnter = (cardIndex) => {
16+
setHoveredCard(cardIndex)
17+
}
1518

16-
const handleMouseEnter = (cardIndex) => {
17-
setHoveredCard(cardIndex);
18-
};
19+
const handleMouseLeave = () => {
20+
setHoveredCard(null)
21+
}
1922

20-
const handleMouseLeave = () => {
21-
setHoveredCard(null);
22-
};
23+
const cards = [
24+
{ title: '연사자 초청', description: '실전활용도 높은 온/오프 강연', image: seminar },
25+
{ title: '간식드리미', description: '정성 가득 시험기간 간식드리미', image: snack },
26+
{ title: '네트워킹 행사', description: 'MT/한강/잔막 등 다같이 외부 나들이', image: party },
27+
{ title: '내부 행사', description: '자체•연합 해커톤 주최 및 참여', image: conf },
28+
{
29+
title: '외부 행사',
30+
description: 'Google 등 IT기업의 네트워킹/레퍼런스 참여',
31+
image: googleconf
32+
},
33+
{ title: '크리스마스 파티', description: '연말 파티와 함께하는 네트워킹', image: christmas }
34+
]
2335

24-
const cards = [
25-
{title: '연사자 초청', description: '실전활용도 높은 온/오프 강연', image: seminar},
26-
{title: '간식드리미', description: '정성 가득 시험기간 간식드리미', image: snack},
27-
{title: '네트워킹 행사', description: 'MT/한강/잔망 등 다같이 외부 나들이', image: party},
28-
{title: '내부 행사', description: '자체•연합 해커톤 주최 및 참여', image: conf},
29-
{title: '외부행사', description: 'Google 등 IT기업의 네트워킹/레퍼런스 참여', image: googleconf},
30-
{title: '크리스마스 파티', description: '연말 파티와 함께하는 네트워킹', image: christmas},
31-
]
36+
useEffect(() => {
37+
gsap.fromTo(
38+
'#cards',
39+
{
40+
y: 90,
41+
opacity: 0
42+
},
43+
{
44+
y: 0,
45+
opacity: 1,
46+
duration: 1,
47+
delay: 0.5,
48+
ease: 'power2.out',
49+
scrollTrigger: {
50+
trigger: '#section4',
51+
start: 'top center',
52+
toggleActions: 'play none none reverse'
53+
}
54+
}
55+
)
56+
}, [])
3257

33-
34-
useEffect(() => {
35-
gsap.fromTo(
36-
'#cards',
37-
{
38-
y: 90,
39-
opacity: 0,
40-
},
41-
{
42-
y: 0,
43-
opacity: 1,
44-
duration: 1,
45-
delay: 0.5,
46-
ease: 'power2.out',
47-
scrollTrigger: {
48-
trigger: '#section4',
49-
start: 'top center',
50-
toggleActions: 'play none none reverse',
51-
},
52-
}
53-
);
54-
}, []);
55-
56-
57-
return (
58-
<div id='section4' className='flex flex-col h-full w-full justify-center'>
59-
<div className='text-white text-[3.5vw] mobile:text-[6vw] mobile:mx-[20px] font-semibold mt-96 text-center'>
60-
<div className='text-[70px] mobile:text-[26vw]'></div>
61-
<div className='text-[2.5vw] mobile:text-[4vw]'>합류하면 어떤 활동들을 할 수 있나요?</div>
62-
</div>
63-
<div id='cards' className='flex flex-col w-full h-full mt-36 mb-36 opacity-0'>
64-
<div className='grid grid-cols-3 mobile:grid-cols-2 gap-5 px-28 tablet:px-30 mobile:px-4'>
65-
{cards.map((card, index) => (
66-
<div
67-
id='card'
68-
key={index}
69-
className='group relative w-full h-[300px] rounded-2xl overflow-hidden'
70-
onMouseEnter={() => handleMouseEnter(index)}
71-
onMouseLeave={handleMouseLeave}
72-
>
73-
<div className="w-full h-full relative">
74-
<Image
75-
src={card.image}
76-
alt={card.title}
77-
fill
78-
className='w-auto h-auto object-cover transition-transform duration-300 group-hover:scale-110 z-0'
79-
/>
80-
<div
81-
className={`absolute inset-0 bg-black/70 transition-opacity duration-300 flex items-center justify-center z-10
58+
return (
59+
<div id="section4" className="flex flex-col h-full w-full justify-center">
60+
<div className="text-white text-[3.5vw] mobile:text-[6vw] mobile:mx-[20px] font-semibold mt-96 text-center">
61+
<div className="text-[70px] mobile:text-[26vw]"></div>
62+
<div className="text-[2.5vw] mobile:text-[4vw]">합류하면 어떤 활동들을 할 수 있나요?</div>
63+
</div>
64+
<div id="cards" className="flex flex-col w-full h-full mt-36 mb-36 opacity-0">
65+
<div className="grid grid-cols-3 mobile:grid-cols-2 gap-5 px-28 tablet:px-30 mobile:px-4">
66+
{cards.map((card, index) => (
67+
<div
68+
id="card"
69+
key={index}
70+
className="group relative w-full h-[300px] rounded-2xl overflow-hidden"
71+
onMouseEnter={() => handleMouseEnter(index)}
72+
onMouseLeave={handleMouseLeave}
73+
>
74+
<div className="w-full h-full relative">
75+
<Image
76+
src={card.image}
77+
alt={card.title}
78+
fill
79+
className="w-auto h-auto object-cover transition-transform duration-300 group-hover:scale-110 z-0"
80+
/>
81+
<div
82+
className={`absolute inset-0 bg-black/70 transition-opacity duration-300 flex items-center justify-center z-10
8283
${hoveredCard === index ? 'opacity-100' : 'opacity-0'}`}
83-
>
84-
<div className='text-white text-center p-6'>
85-
<h3 className='text-[2.5vw] font-bold mb-2 mobile:text-[4vw]'>{card.title}</h3>
86-
<p className='text-[1.5vw] mobile:text-[4vw]'>{card.description}</p>
87-
</div>
88-
</div>
89-
</div>
90-
</div>
91-
))}
84+
>
85+
<div className="text-white text-center p-6">
86+
<h3 className="text-[2.5vw] font-bold mb-2 mobile:text-[4vw]">{card.title}</h3>
87+
<p className="text-[1.5vw] mobile:text-[4vw]">{card.description}</p>
88+
</div>
9289
</div>
90+
</div>
9391
</div>
92+
))}
9493
</div>
95-
);
94+
</div>
95+
</div>
96+
)
9697
}
9798

98-
export default ActivitiesSection;
99+
export default ActivitiesSection

src/components/landing/CTASection.tsx

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,24 @@ function CTASection({ router }) {
1515
<br className='hidden mobile:inline' />
1616
변화하는 나를 만나보세요
1717
</div>
18-
<div className='flex flex-row mt-32 mb-96 mobile:mb-60 w-full justify-center items-center space-x-3'>
19-
<Button
20-
onPress={() => router.push('/recruit/member')}
21-
radius='full'
22-
className='w-64 max-w-full h-14 mobile:w-40 mobile:h-12 mobile:text-2xl bg-gradient-to-r from-red to-yellow text-white text-3xl relative group'
23-
>
24-
<div className='absolute inset-0 bg-gradient-to-r from-red to-yellow blur-lg opacity-75 group-hover:opacity-100 transition-opacity duration-300'></div>
25-
<span className='font-semibold relative z-10'>지원하기</span>
26-
</Button>
18+
<div className="flex flex-col items-center gap-4 mt-24 mb-96 mobile:mb-60">
19+
<Button
20+
onPress={() => router.push('/recruit/member')}
21+
radius='full'
22+
className='w-64 max-w-full h-14 mobile:w-40 mobile:h-12 mobile:text-2xl bg-gradient-to-r from-red to-yellow text-white text-3xl relative group overflow-hidden'
23+
>
24+
<div className='absolute inset-0 bg-gradient-to-r from-red to-yellow blur-lg opacity-75 group-hover:opacity-100 transition-opacity duration-300'></div>
25+
<span className='font-semibold relative z-10'>지원하기</span>
26+
</Button>
27+
<p className="text-white/50 typo-c1 mobile:text-[10px]">
28+
지원 후 일정이 궁금하시다면?{' '}
29+
<button
30+
onClick={() => router.push('/recruit/member/completed')}
31+
className="underline underline-offset-4 hover:text-white transition-colors"
32+
>
33+
일정 안내 바로가기
34+
</button>
35+
</p>
2736
</div>
2837
</div>
2938
);

0 commit comments

Comments
 (0)