import { motion, AnimatePresence } from 'framer-motion'; import { useState, useMemo } from 'react'; import { useQuery } from '@tanstack/react-query'; import { Instagram, Calendar, X } from 'lucide-react'; import { getMembers } from '../../../api/public/members'; // 모바일 멤버 페이지 function MobileMembers() { const [selectedMember, setSelectedMember] = useState(null); // useQuery로 멤버 데이터 로드 const { data: allMembers = [] } = useQuery({ queryKey: ['members'], queryFn: getMembers, }); // useMemo로 현재/전 멤버 분리 const members = useMemo(() => allMembers.filter(m => !m.is_former), [allMembers]); const formerMembers = useMemo(() => allMembers.filter(m => m.is_former), [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; }; // 모달 닫기 const closeModal = () => setSelectedMember(null); // 멤버 카드 렌더링 함수 const renderMemberCard = (member, index, isFormer = false) => ( setSelectedMember(member)} className="cursor-pointer group" initial={{ opacity: 0, y: 20 }} animate={{ opacity: 1, y: 0 }} transition={{ delay: index * 0.05, duration: 0.3 }} whileTap={{ scale: 0.95 }} > {/* 카드 컨테이너 */}
{/* 이미지 영역 - 3:4 비율 */}
{member.image_url && ( {member.name} )}
{/* 정보 영역 - 하단 그라데이션 오버레이 */}

{member.name}

{/* 호버시 반짝이 효과 */} {!isFormer && (
)}
); return (
{/* 현재 멤버 그리드 */}
{members.map((member, index) => renderMemberCard(member, index))}
{/* 전 멤버 */} {formerMembers.length > 0 && (

전 멤버

{formerMembers.map((member, index) => renderMemberCard(member, index, true))}
)} {/* 멤버 상세 모달 - 드래그로 닫기 가능 */} {selectedMember && ( { if (info.offset.y > 100 || info.velocity.y > 300) { closeModal(); } }} className="bg-white w-full rounded-t-3xl overflow-hidden" onClick={e => e.stopPropagation()} > {/* 드래그 핸들 */}
{/* 헤더 */}

멤버 정보

{/* 모달 콘텐츠 */}
{/* 프로필 이미지 - 원본 비율 */}
{selectedMember.image_url && ( {selectedMember.name} )}
{/* 정보 */}

{selectedMember.name}

{selectedMember.position && (

{selectedMember.position}

)} {selectedMember.birth_date && (
{selectedMember.birth_date?.slice(0, 10).replaceAll('-', '.')} {calculateAge(selectedMember.birth_date) && ( ({calculateAge(selectedMember.birth_date)}세) )}
)}
{/* 인스타그램 버튼 - 정보 영역 아래쪽 */} {!selectedMember.is_former && selectedMember.instagram && ( Instagram )}
)}
); } export default MobileMembers;