diff --git a/frontend-temp/src/pages/schedule/MobileBirthday.jsx b/frontend-temp/src/pages/schedule/MobileBirthday.jsx new file mode 100644 index 0000000..d62162e --- /dev/null +++ b/frontend-temp/src/pages/schedule/MobileBirthday.jsx @@ -0,0 +1,155 @@ +import { useParams, Link } from 'react-router-dom'; +import { useQuery } from '@tanstack/react-query'; +import { motion } from 'framer-motion'; +import { ChevronLeft } from 'lucide-react'; +import { fetchApi } from '@/api/client'; + +// 한글 이름 → 영어 이름 매핑 +const memberEnglishName = { + 송하영: 'HAYOUNG', + 박지원: 'JIWON', + 이채영: 'CHAEYOUNG', + 이나경: 'NAKYUNG', + 백지헌: 'JIHEON', + 장규리: 'GYURI', + 이새롬: 'SAEROM', + 노지선: 'JISUN', + 이서연: 'SEOYEON', +}; + +/** + * Mobile 생일 페이지 + */ +function MobileBirthday() { + const { memberName, year } = useParams(); + + // URL 디코딩 + const decodedMemberName = decodeURIComponent(memberName || ''); + const englishName = memberEnglishName[decodedMemberName]; + + // 멤버 정보 조회 + const { + data: member, + isLoading: memberLoading, + error, + } = useQuery({ + queryKey: ['member', decodedMemberName], + queryFn: () => fetchApi(`/members/${encodeURIComponent(decodedMemberName)}`), + enabled: !!decodedMemberName, + }); + + if (!decodedMemberName || error) { + return ( +
+
+

멤버를 찾을 수 없습니다

+ + 일정으로 돌아가기 + +
+
+ ); + } + + if (memberLoading) { + return ( +
+
+
+ ); + } + + // 생일 계산 + const birthDate = member?.birth_date ? new Date(member.birth_date) : null; + const birthdayThisYear = birthDate ? new Date(parseInt(year), birthDate.getMonth(), birthDate.getDate()) : null; + + return ( +
+ {/* 헤더 */} +
+
+ + + +
+ + HAPPY {englishName} DAY + +
+
+
+
+ +
+ {/* 헤더 카드 */} + + {/* 배경 장식 */} +
+
+
+
+
🎉
+
🎈
+
+ +
+
+ {/* 멤버 사진 */} + {member?.image_url && ( +
+ {member.name} +
+ )} + + {/* 내용 */} +
+
+ 🎂 +

HAPPY {englishName} DAY

+
+

+ {year}년 {birthdayThisYear?.getMonth() + 1}월 {birthdayThisYear?.getDate()}일 +

+
+
+ + {/* 년도 뱃지 */} +
+ YEAR + {year} +
+
+ + + {/* 생일카페 섹션 */} + +

+ + 생일카페 +

+ + {/* 준비 중 메시지 */} +
+
🎁
+

+ {year}년 {decodedMemberName} 생일카페 정보가 준비 중입니다 +

+

생일카페 정보가 등록되면 이곳에 표시됩니다

+
+
+
+
+ ); +} + +export default MobileBirthday; diff --git a/frontend-temp/src/pages/schedule/PCBirthday.jsx b/frontend-temp/src/pages/schedule/PCBirthday.jsx new file mode 100644 index 0000000..5d95bcd --- /dev/null +++ b/frontend-temp/src/pages/schedule/PCBirthday.jsx @@ -0,0 +1,152 @@ +import { useParams, Link } from 'react-router-dom'; +import { useQuery } from '@tanstack/react-query'; +import { motion } from 'framer-motion'; +import { ChevronRight } from 'lucide-react'; +import { fetchApi } from '@/api/client'; + +// 한글 이름 → 영어 이름 매핑 +const memberEnglishName = { + 송하영: 'HAYOUNG', + 박지원: 'JIWON', + 이채영: 'CHAEYOUNG', + 이나경: 'NAKYUNG', + 백지헌: 'JIHEON', + 장규리: 'GYURI', + 이새롬: 'SAEROM', + 노지선: 'JISUN', + 이서연: 'SEOYEON', +}; + +/** + * PC 생일 페이지 + */ +function PCBirthday() { + const { memberName, year } = useParams(); + + // URL 디코딩 + const decodedMemberName = decodeURIComponent(memberName || ''); + const englishName = memberEnglishName[decodedMemberName]; + + // 멤버 정보 조회 + const { + data: member, + isLoading: memberLoading, + error, + } = useQuery({ + queryKey: ['member', decodedMemberName], + queryFn: () => fetchApi(`/members/${encodeURIComponent(decodedMemberName)}`), + enabled: !!decodedMemberName, + }); + + if (!decodedMemberName || error) { + return ( +
+
+

멤버를 찾을 수 없습니다

+ + 일정으로 돌아가기 + +
+
+ ); + } + + if (memberLoading) { + return ( +
+
+
+ ); + } + + // 생일 계산 + const birthDate = member?.birth_date ? new Date(member.birth_date) : null; + const birthdayThisYear = birthDate ? new Date(parseInt(year), birthDate.getMonth(), birthDate.getDate()) : null; + + return ( +
+
+ {/* 네비게이션 */} +
+ + 일정 + + + + HAPPY {englishName} DAY + +
+ + {/* 헤더 카드 */} + + {/* 배경 장식 */} +
+
+
+
+
+
🎉
+
🎈
+
+ +
+ {/* 멤버 사진 */} + {member?.image_url && ( +
+
+ {member.name} +
+
+ )} + + {/* 내용 */} +
+
+ 🎂 +

HAPPY {englishName} DAY

+
+

+ {year}년 {birthdayThisYear?.getMonth() + 1}월 {birthdayThisYear?.getDate()}일 +

+
+ + {/* 년도 뱃지 */} +
+
YEAR
+
{year}
+
+
+ + + {/* 생일카페 섹션 */} + +

+ + 생일카페 +

+ + {/* 준비 중 메시지 */} +
+
🎁
+

+ {year}년 {decodedMemberName} 생일카페 정보가 준비 중입니다 +

+

생일카페 정보가 등록되면 이곳에 표시됩니다

+
+
+
+
+ ); +} + +export default PCBirthday;