Skip to content

Commit 74495db

Browse files
committed
feat: guard closed core recruitment page
1 parent b5f22cd commit 74495db

2 files changed

Lines changed: 35 additions & 2 deletions

File tree

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

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
'use client'
22

33
import Link from 'next/link'
4+
import { useSearchParams } from 'next/navigation'
45
import { GdgLogo, GdgButton } from '@/components/ui/design-system'
56

67
function Bullet({ children }: { children: React.ReactNode }) {
@@ -15,17 +16,28 @@ function Bullet({ children }: { children: React.ReactNode }) {
1516
}
1617

1718
export default function RecruitCoreCompleted() {
19+
const searchParams = useSearchParams()
20+
const isClosed = searchParams.get('status') === 'closed'
21+
1822
return (
1923
<main className="min-h-screen bg-black overflow-x-hidden">
2024
<div className="relative z-10 pt-18 pb-32 mobile:pt-12 mobile:pb-24 layout-grid layout-grid--narrow-screen layout-grid--4 gap-y-10">
2125
{/* Header */}
2226
<div className="col-span-4 flex items-center gap-3 mobile:gap-2">
2327
<GdgLogo mode="auto" />
24-
<h1 className="typo-pc-h3 text-white mobile:typo-m-h2">Core Member 지원 완료</h1>
28+
<h1 className="typo-pc-h3 text-white mobile:typo-m-h2">
29+
{isClosed ? 'Core Member 지원 마감' : 'Core Member 지원 완료'}
30+
</h1>
2531
</div>
2632

2733
{/* Content Sections - Step 2 UI 이관 */}
2834
<div className="col-span-4 flex flex-col gap-10 w-full">
35+
<div className="rounded-xl bg-gray-100 px-4 py-3 text-white typo-pc-b2 mobile:typo-m-b3">
36+
{isClosed
37+
? '코어 지원 기간이 종료되어 더 이상 지원서를 제출할 수 없습니다.'
38+
: '지원이 정상적으로 완료되었습니다. 이후 일정은 아래 안내를 확인해 주세요.'}
39+
</div>
40+
2941
<div className="space-y-2">
3042
<p className="pl-2 typo-pc-s2 mobile:typo-m-s1 text-white">모집 일정</p>
3143
<div className="rounded-xl bg-gray-100 px-4 py-3 text-white">

src/app/recruit/core/page.tsx

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ const TEAM_OPTIONS = [
6161
{ id: 'TECH', label: 'TECH' },
6262
{ id: 'PR_DESIGN', label: 'PR·DESIGN' }
6363
] as const
64+
const CORE_RECRUIT_DEADLINE = '2026-03-14T23:59:59+09:00'
6465

6566
const unwrapPrefill = (raw: unknown): PrefillPayload | null => {
6667
if (!raw || typeof raw !== 'object') return null
@@ -202,6 +203,7 @@ export default function RecruitCore() {
202203
const [isSubmitting, setIsSubmitting] = useState(false)
203204
const [scheduleChecked, setScheduleChecked] = useState(false)
204205
const [agreementChecked, setAgreementChecked] = useState(false)
206+
const isRecruitClosed = Date.now() > new Date(CORE_RECRUIT_DEADLINE).getTime()
205207

206208
const [formData, setFormData] = useState<RecruitFormData>({
207209
name: '',
@@ -242,6 +244,19 @@ export default function RecruitCore() {
242244
}, [currentStep, formData, scheduleChecked, agreementChecked])
243245

244246
useEffect(() => {
247+
if (!isRecruitClosed) {
248+
return
249+
}
250+
251+
alert('코어 지원 기간이 종료되었습니다.')
252+
router.replace('/recruit/core/completed?status=closed')
253+
}, [isRecruitClosed, router])
254+
255+
useEffect(() => {
256+
if (isRecruitClosed) {
257+
return
258+
}
259+
245260
let active = true
246261

247262
const fetchPrefill = async () => {
@@ -278,7 +293,7 @@ export default function RecruitCore() {
278293
return () => {
279294
active = false
280295
}
281-
}, [apiClient, router])
296+
}, [apiClient, isRecruitClosed, router])
282297

283298
const validateStep = (step: RecruitStep) => {
284299
const nextErrors: Record<string, boolean> = {}
@@ -399,6 +414,12 @@ export default function RecruitCore() {
399414
const handleSubmit = async (event: FormEvent<HTMLFormElement>) => {
400415
event.preventDefault()
401416

417+
if (isRecruitClosed) {
418+
alert('코어 지원 기간이 종료되었습니다.')
419+
router.replace('/recruit/core/completed?status=closed')
420+
return
421+
}
422+
402423
if (!validateStep(currentStep)) return
403424

404425
if (currentStep < 3) {

0 commit comments

Comments
 (0)