import { motion } from 'framer-motion'; import { useState, useMemo, useRef, useEffect } from 'react'; import { useQuery } from '@tanstack/react-query'; import { Instagram, Calendar } from 'lucide-react'; import { Swiper, SwiperSlide } from 'swiper/react'; import 'swiper/css'; import { getMembers } from '../../../api/public/members'; // 모바일 멤버 페이지 - 카드 스와이프 스타일 function MobileMembers() { const [currentIndex, setCurrentIndex] = useState(0); const swiperRef = useRef(null); const indicatorRef = useRef(null); // useQuery로 멤버 데이터 로드 const { data: allMembers = [] } = useQuery({ queryKey: ['members'], queryFn: getMembers, }); // useMemo로 현재/전 멤버 정렬 (현재 멤버 먼저, 전 멤버 나중) const members = useMemo(() => { return [...allMembers].sort((a, b) => { if (a.is_former !== b.is_former) { return a.is_former ? 1 : -1; } return 0; }); }, [allMembers]); // 나이 계산 const calculateAge = (birthDate) => { if (!birthDate) return null; const birth = new Date(birthDate); const today = new Date(); let age = today.getFullYear() - birth.getFullYear(); const monthDiff = today.getMonth() - birth.getMonth(); if (monthDiff < 0 || (monthDiff === 0 && today.getDate() < birth.getDate())) { age--; } return age; }; // 인디케이터 자동 스크롤 useEffect(() => { if (indicatorRef.current && members.length > 0) { const container = indicatorRef.current; const itemWidth = 64; // 52px 썸네일 + 12px 간격 const containerWidth = container.offsetWidth; const paddingLeft = 16; // px-4 const targetScroll = paddingLeft + (currentIndex * itemWidth) + 26 - (containerWidth / 2); container.scrollTo({ left: Math.max(0, targetScroll), behavior: 'smooth' }); } }, [currentIndex, members.length]); // 인디케이터 클릭 핸들러 const handleIndicatorClick = (index) => { if (swiperRef.current) { swiperRef.current.slideTo(index); } }; if (members.length === 0) { return (

멤버 정보가 없습니다

); } return (
{/* 상단 썸네일 인디케이터 */}
{members.map((member, index) => { const isSelected = index === currentIndex; const isFormer = member.is_former; return ( ); })}
{/* 메인 카드 영역 */} { swiperRef.current = swiper; }} onSlideChange={(swiper) => setCurrentIndex(swiper.activeIndex)} slidesPerView={1.12} centeredSlides={true} spaceBetween={0} className="h-full !overflow-visible [&>.swiper-wrapper]:!overflow-visible" style={{ padding: '8px 0' }} > {members.map((member, index) => { const isFormer = member.is_former; const age = calculateAge(member.birth_date); return ( {({ isActive }) => (
{/* 배경 이미지 */} {member.image_url ? ( {member.name} ) : (
)} {/* 하단 그라데이션 오버레이 */}
{/* 전 멤버 라벨 */} {isFormer && (
전 멤버
)} {/* 멤버 정보 */}
{/* 이름 */}

{member.name}

{/* 포지션 */} {member.position && (

{member.position}

)} {/* 생일 정보 */} {member.birth_date && (
{member.birth_date?.slice(0, 10).replaceAll('-', '.')} {age && ( {age}세 )}
)} {/* 인스타그램 버튼 */} {!isFormer && member.instagram && ( Instagram )}
)} ); })}
); } export default MobileMembers;