Skip to content

Commit 4989239

Browse files
authored
refactor: 지원 관련 페이지 레이아웃 수정
* feat: recruit 관련 페이지 footer 숨김 * refactor: recruit 관련 페이지 레이아웃 수정 (DASOMFE-33) * refactor: hook 분리 * refactor: 일정 조회 로직 수정
1 parent d1349a8 commit 4989239

19 files changed

+857
-629
lines changed

src/App.tsx

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,18 @@ function App() {
5151
function AppContent() {
5252
const location = useLocation()
5353
const hideHeaderFooter = ['/login'] // 헤더와 푸터를 숨길 페이지
54+
const hideFooterOnly = [
55+
'/recruit',
56+
'/recruitinfo',
57+
'/recruit/submit',
58+
'/recruit/result',
59+
'/recruit/check',
60+
'/recruit/check/final',
61+
'/recruit/meeting',
62+
'/recruit/meeting/submit',
63+
'/somkathon',
64+
'/somkathon/submit',
65+
] // 푸터만 숨길 페이지
5466

5567
return (
5668
<>
@@ -152,7 +164,8 @@ function AppContent() {
152164
}
153165
/>
154166
</Routes>
155-
{!hideHeaderFooter.includes(location.pathname) && <Footer />}
167+
{!hideHeaderFooter.includes(location.pathname) &&
168+
!hideFooterOnly.includes(location.pathname) && <Footer />}
156169
</>
157170
)
158171
}

src/components/UI/RecruitUI.tsx

Lines changed: 46 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,39 @@
11
import React, { useEffect, useState } from 'react'
2-
import apiClient from '../../utils/apiClient'
3-
import { RecruitHeaderProps } from './types'
2+
import { formatKoreanDate, useRecruitSchedule } from '../../pages/recruit/useRecruitSchedule'
3+
import { RecruitScheduleData } from '@/pages/recruit/Recruittype'
44

55
interface RecruitUIProps {
6-
name: string
6+
name?: string
7+
}
8+
9+
interface RecruitHeaderProps {
10+
title: string
711
}
812

913
export const RecruitHeader: React.FC<RecruitHeaderProps> = ({ title }) => {
1014
return (
11-
<div className='w-auto bg-[#00B493] text-white font-pretendardBold text-[13px] p-1 pl-2 mx-2 mt-16'>
15+
<div className='w-auto bg-[#00B493] text-white font-pretendardBold text-[13px] md:text-base p-1 pl-2 mx-2 mt-4'>
1216
{title}
1317
</div>
1418
)
1519
}
1620

1721
export const RecruitUI: React.FC = () => {
18-
const [recruitmentData, setRecruitmentData] = useState<Record<
19-
string,
20-
string
21-
> | null>(null)
22+
const { loadSchedule } = useRecruitSchedule()
23+
const [scheduleData, setScheduleData] = useState<RecruitScheduleData | null>(null)
2224

2325
useEffect(() => {
2426
const fetchRecruit = async () => {
2527
try {
26-
const res = await apiClient.get('/recruit')
27-
const data = res.data
28-
if (Array.isArray(data)) {
29-
const formattedData: Record<string, string> = {}
30-
data.forEach((item: any) => {
31-
formattedData[item.key] = item.value
32-
})
33-
setRecruitmentData(formattedData)
34-
} else {
35-
console.error('예상하지 못한 응답 형식:', data)
36-
}
28+
const { scheduleData } = await loadSchedule()
29+
setScheduleData(scheduleData)
3730
} catch (error) {
38-
console.error('API 요청 오류:', error)
31+
console.error('모집 기간 확인 중 오류 발생:', error)
3932
}
4033
}
4134
fetchRecruit()
42-
}, [])
35+
}, [loadSchedule])
4336

44-
{
45-
/* 데이터 형식 번경 기능 */
46-
}
4737
const formatDate = (isoString: string) => {
4838
const date = new Date(isoString)
4939
const options: Intl.DateTimeFormatOptions = {
@@ -55,35 +45,34 @@ export const RecruitUI: React.FC = () => {
5545
}
5646

5747
return (
58-
<div className='text-white font-pretendardRegular flex flex-col text-[12px] items-start w-auto shadow-[0px_2px_3px_rgba(255,255,255,0.2)] bg-#17171B] gap-2 mx-2'>
48+
<div className='text-white font-pretendardRegular flex flex-col text-[12px] md:text-sm items-start w-auto shadow-[0px_2px_3px_rgba(255,255,255,0.2)] bg-#17171B] gap-2 mx-2'>
5949
<p className='pl-2 pt-2'>
6050
<span className='font-pretendardBold'>다솜</span>에서 개발자로서 성장해
6151
<span className='font-pretendardBold'>34기 멤버분들</span>
6252
찾습니다!
6353
</p>
6454
<div className='mt-2 pl-2'>
6555
<p className='text-mainColor font-pretendardSemiBold'>📅 모집 일정 :</p>
66-
{recruitmentData ? (
56+
{scheduleData ? (
6757
<p>
68-
모집 폼 제출 :{' '}
69-
{formatDate(recruitmentData.RECRUITMENT_PERIOD_START)} ~{' '}
70-
{formatDate(recruitmentData.RECRUITMENT_PERIOD_END)}
58+
모집 폼 제출 : {formatDate(scheduleData.recruitmentPeriodStart)} ~{' '}
59+
{formatDate(scheduleData.recruitmentPeriodEnd)}
7160
</p>
7261
) : (
7362
<p>모집 일정 불러오는 중...</p>
7463
)}
75-
{recruitmentData ? (
64+
{scheduleData ? (
7665
<p>
77-
대면 면접 : {formatDate(recruitmentData.INTERVIEW_PERIOD_START)} ~{' '}
78-
{formatDate(recruitmentData.INTERVIEW_PERIOD_END)}
66+
대면 면접 : {formatDate(scheduleData.interviewPeriodStart)} ~{' '}
67+
{formatDate(scheduleData.interviewPeriodEnd)}
7968
</p>
8069
) : (
8170
<p>대면 일정 불러오는 중...</p>
8271
)}
83-
{recruitmentData ? (
72+
{scheduleData ? (
8473
<p>
8574
최종 합격자 발표 :{' '}
86-
{formatDate(recruitmentData.INTERVIEW_PASS_ANNOUNCEMENT)}
75+
{formatDate(scheduleData.interviewPassAnnouncement)}
8776
</p>
8877
) : (
8978
<p>최종 합격 일정 불러오는 중...</p>
@@ -119,8 +108,23 @@ export const RecruitUI: React.FC = () => {
119108
}
120109

121110
export const RecruitUI_SUB: React.FC<RecruitUIProps> = ({ name }) => {
111+
const { loadSchedule } = useRecruitSchedule()
112+
const [scheduleData, setScheduleData] = useState<RecruitScheduleData | null>(null)
113+
114+
useEffect(() => {
115+
const fetchRecruit = async () => {
116+
try {
117+
const { scheduleData } = await loadSchedule()
118+
setScheduleData(scheduleData)
119+
} catch (error) {
120+
console.error('모집 기간 확인 중 오류 발생:', error)
121+
}
122+
}
123+
fetchRecruit()
124+
}, [loadSchedule])
125+
122126
return (
123-
<div className='whitespace-pre-line text-white flex flex-col items-start w-auto h-[auto] shadow-[0px_2px_3px_rgba(255,255,255,0.2)] bg-#17171B] gap-2 mx-2 font-pretendardRegular pl-2 text-[12px] '>
127+
<div className='whitespace-pre-line text-white flex flex-col items-start w-auto h-[auto] shadow-[0px_2px_3px_rgba(255,255,255,0.2)] bg-#17171B] gap-2 mx-2 font-pretendardRegular pl-2 text-[12px] md:text-sm'>
124128
<p className='pt-3 '>
125129
{`${name}님 안녕하세요 컴퓨터공학부 전공동아리 다솜입니다.
126130
먼저 다솜 34기에 많은 관심을 갖고 지원해 주셔서 감사드리며, `}
@@ -133,19 +137,17 @@ export const RecruitUI_SUB: React.FC<RecruitUIProps> = ({ name }) => {
133137
</p>
134138

135139
<p>
136-
{`다음 전형인 대면 인터뷰에서 뵐 수 있게 되어 기쁜 마음을 담아
137-
안내드립니다.`}
140+
{'다음 전형인 대면 인터뷰에서 뵐 수 있게 되어 기쁜 마음을 담아 안내드립니다.'}
138141
</p>
139142

140-
<p className='mb-3'>{`대면 인터뷰는 3/12(수)~14(금) 중에 진행 될 예정이며 편한 시간대로
141-
폼을 작성해주시면 감사하겠습니다.`}</p>
143+
<p className='mb-3'>대면 인터뷰는 {formatKoreanDate(scheduleData?.interviewPeriodStart)} ~ {formatKoreanDate(scheduleData?.interviewPeriodEnd)} 중에 진행 될 예정이며 편한 시간대로 폼을 작성해주시면 감사하겠습니다.</p>
142144
</div>
143145
)
144146
}
145147

146148
export const RecruitUI_SUB2: React.FC<RecruitUIProps> = ({ name }) => {
147149
return (
148-
<div className='whitespace-pre-line text-white flex flex-col items-start w-auto h-[auto] shadow-[0px_2px_3px_rgba(255,255,255,0.2)] bg-#17171B] gap-2 mx-2 font-pretendardRegular pl-2 text-[12px] '>
150+
<div className='whitespace-pre-line text-white flex flex-col items-start w-auto h-[auto] shadow-[0px_2px_3px_rgba(255,255,255,0.2)] bg-#17171B] gap-2 mx-2 font-pretendardRegular pl-2 text-[12px] md:text-sm'>
149151
<p className='pt-3 '>
150152
{`${name}님 안녕하세요 컴퓨터공학부 전공동아리 다솜입니다.
151153
먼저 다솜 34기에 많은 관심을 갖고 지원해 주셔서 감사드리며, `}
@@ -165,7 +167,7 @@ export const RecruitUI_SUB2: React.FC<RecruitUIProps> = ({ name }) => {
165167

166168
export const RecruitUI_FINAL: React.FC<RecruitUIProps> = ({ name }) => {
167169
return (
168-
<div className='whitespace-pre-line text-white flex flex-col items-start w-auto h-[auto] shadow-[0px_2px_3px_rgba(255,255,255,0.2)] bg-#17171B] gap-2 mx-2 font-pretendardRegular pl-2 text-[12px] '>
170+
<div className='whitespace-pre-line text-white flex flex-col items-start w-auto h-[auto] shadow-[0px_2px_3px_rgba(255,255,255,0.2)] bg-#17171B] gap-2 mx-2 font-pretendardRegular pl-2 text-[12px] md:text-sm'>
169171
<p className='pt-3 font-pretendardBold '>
170172
안녕하세요 {`${name}`}님, <br /> 다솜 34기에
171173
<span className='text-mainColor font-pretendardBold'> 최종합격</span>{' '}
@@ -189,7 +191,7 @@ export const RecruitUI_FINAL: React.FC<RecruitUIProps> = ({ name }) => {
189191

190192
export const RecruitUI_FINAL2: React.FC<RecruitUIProps> = ({ name }) => {
191193
return (
192-
<div className='whitespace-pre-line text-white flex flex-col items-start w-auto h-[auto] shadow-[0px_2px_3px_rgba(255,255,255,0.2)] bg-#17171B] gap-2 mx-2 font-pretendardRegular pl-2 text-[12px] '>
194+
<div className='whitespace-pre-line text-white flex flex-col items-start w-auto h-[auto] shadow-[0px_2px_3px_rgba(255,255,255,0.2)] bg-#17171B] gap-2 mx-2 font-pretendardRegular pl-2 text-[12px] md:text-sm'>
193195
<p className='pt-3 '>
194196
{`${name}님 안녕하세요. 컴퓨터공학부 전공동아리 다솜입니다.
195197
먼저, 다솜 34기에 관심을 갖고 지원해 주시고 소중한 시간을 내어
@@ -208,16 +210,15 @@ export const RecruitUI_FINAL2: React.FC<RecruitUIProps> = ({ name }) => {
208210

209211
<p className='mb-3'>
210212
{`다시 한번 지원해 주셔서 감사드리며,
211-
앞으로의 모든 도전을 응원하겠습니다.
212-
수고 많으셨습니다.`}
213+
앞으로의 모든 도전을 응원하겠습니다. 수고 많으셨습니다.`}
213214
</p>
214215
</div>
215216
)
216217
}
217218

218219
export const SomRecruitUI: React.FC = () => {
219220
return (
220-
<div className='text-white font-pretendardRegular flex flex-col text-[12px] items-start w-auto shadow-[0px_2px_3px_rgba(255,255,255,0.2)] bg-#17171B] gap-2 mx-2'>
221+
<div className='text-white font-pretendardRegular flex flex-col text-[12px] md:text-sm items-start w-auto shadow-[0px_2px_3px_rgba(255,255,255,0.2)] bg-#17171B] gap-2 mx-2'>
221222
<p className='pl-2 pt-2'>
222223
<span className='font-pretendardBold'>솜커톤</span>에서 멋진 프로젝트를
223224
만들어 주실 학우 여러분들을 모집합니다!

src/components/UI/Recruit_Button.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ export const Button: React.FC<ButtonProps> = ({
1212
<div className='w-full max-w-[395px] mt-20 mb-20 flex justify-center '>
1313
<button
1414
type='submit'
15-
className={`bg-[#00B493] max-w-[395px] h-[30px] text-white font-pretendardBold px-4 text-[12px] transition-all ${!disabled ? 'hover:bg-[#00937A] active:scale-95' : null} ${className}`}
15+
className={`bg-[#00B493] max-w-[395px] text-white font-pretendardBold px-4 md:px-6 md:py-2 text-[12px] md:text-base transition-all ${!disabled ? 'hover:bg-[#00937A] active:scale-95' : null} ${className}`}
1616
onClick={onClick}
1717
disabled={disabled}
1818
>

src/components/UI/Recruit_InfoBanner.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ export const Recruit_InfoBanner: React.FC<Recruit_InfoBannerProps> = ({
66
message,
77
}) => {
88
return (
9-
<div className='w-auto p-2 mt-3 text-white text-center text-[12px]'>
9+
<div className='w-auto p-2 mt-3 text-white text-center text-[12px] md:text-base'>
1010
<div className='w-auto bg-[#00B493] p-1'>
1111
<p className='whitespace-pre-line font-pretendardRegular'>{message}</p>
1212
</div>

src/components/UI/Recruit_InputField.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,11 @@ export const InputField: React.FC<InputFieldProps> = ({
2626
}
2727

2828
const containerStyles =
29-
'mb-4 p-3 shadow-[0px_2px_3px_rgba(255,255,255,0.2)] text-white text-[12px]'
29+
'mb-4 p-3 shadow-[0px_2px_3px_rgba(255,255,255,0.2)] text-white text-[12px] md:text-base w-full font-pretendardRegular'
3030
const baseInputStyles =
31-
'w-full bg-mainBlack border-b border-white p-2 focus:outline-none text-[10px]'
31+
'w-full bg-mainBlack border-b border-white p-2 focus:outline-none text-[10px] md:text-sm font-pretendardRegular'
3232
const inputStyles =
33-
'w-4 h-4 bg-mainBlack border border-white focus:ring-white border-2 rounded-[3px] appearance-none checked:bg-white checked:border-white'
33+
'w-4 h-4 bg-mainBlack border border-white focus:ring-white border-2 rounded-[3px] appearance-none checked:bg-white checked:border-white font-pretendardRegular'
3434

3535
return (
3636
<div className={containerStyles}>

src/components/layout/MobileLayout.tsx

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,10 @@ const MobileLayout: React.FC<Props> = ({ children }) => {
1010

1111
return (
1212
<div
13-
className='mx-auto bg-mainBlack overflow-auto no-scrollbar'
13+
className='mx-auto bg-mainBlack overflow-auto no-scrollbar min-w-[395px]'
1414
style={{
15-
width: width > 480 ? '395px' : '100%', // PC에서는 고정, 모바일에서는 꽉 차게
16-
height: '100vh',
17-
overflowY: 'auto',
15+
width: width > 480 ? '40%' : '100%', // PC에서는 고정, 모바일에서는 꽉 차게
16+
minHeight: 'calc(100vh - 56px)', // viewport 높이 - header 높이(56px)만 제외 (footer는 recruit 페이지에서 없음)
1817
}}
1918
>
2019
{children}

0 commit comments

Comments
 (0)