import { useState, useEffect, useRef } from 'react'; import { useNavigate, useParams, Link } from 'react-router-dom'; import { motion, AnimatePresence } from 'framer-motion'; import { Save, Upload, Home, ChevronRight, User, Instagram, Calendar, Briefcase } from 'lucide-react'; import Toast from '../../../components/Toast'; import CustomDatePicker from '../../../components/admin/CustomDatePicker'; import AdminLayout from '../../../components/admin/AdminLayout'; import useToast from '../../../hooks/useToast'; import * as authApi from '../../../api/admin/auth'; import * as membersApi from '../../../api/admin/members'; function AdminMemberEdit() { const navigate = useNavigate(); const { name } = useParams(); const [user, setUser] = useState(null); const [loading, setLoading] = useState(true); const [saving, setSaving] = useState(false); const { toast, setToast } = useToast(); const [imagePreview, setImagePreview] = useState(null); const [imageFile, setImageFile] = useState(null); const [formData, setFormData] = useState({ name: '', birth_date: '', position: '', instagram: '', is_former: false }); useEffect(() => { // 로그인 확인 if (!authApi.hasToken()) { navigate('/admin'); return; } setUser(authApi.getCurrentUser()); fetchMember(); }, [navigate, name]); const fetchMember = async () => { try { const data = await membersApi.getMember(encodeURIComponent(name)); setFormData({ name: data.name || '', birth_date: data.birth_date ? data.birth_date.split('T')[0] : '', position: data.position || '', instagram: data.instagram || '', is_former: !!data.is_former }); setImagePreview(data.image_url); setLoading(false); } catch (error) { console.error('멤버 로드 오류:', error); setToast({ message: '멤버 정보를 불러올 수 없습니다.', type: 'error' }); setLoading(false); } }; const handleImageChange = (e) => { const file = e.target.files[0]; if (file) { setImageFile(file); const reader = new FileReader(); reader.onloadend = () => setImagePreview(reader.result); reader.readAsDataURL(file); } }; const handleSubmit = async (e) => { e.preventDefault(); setSaving(true); try { const formDataToSend = new FormData(); formDataToSend.append('name', formData.name); formDataToSend.append('birth_date', formData.birth_date); formDataToSend.append('position', formData.position); formDataToSend.append('instagram', formData.instagram); formDataToSend.append('is_former', formData.is_former); if (imageFile) { formDataToSend.append('image', imageFile); } await membersApi.updateMember(encodeURIComponent(name), formDataToSend); setToast({ message: '멤버 정보가 수정되었습니다.', type: 'success' }); setTimeout(() => navigate('/admin/members'), 1000); } catch (error) { console.error('수정 오류:', error); setToast({ message: '수정 중 오류가 발생했습니다.', type: 'error' }); } finally { setSaving(false); } }; return ( {/* Toast */} setToast(null)} /> {/* 메인 콘텐츠 */}
{/* 브레드크럼 */}
멤버 관리 멤버 수정
{/* 타이틀 */}

멤버 수정

멤버 정보를 수정합니다

{loading ? (
) : (
{/* 이미지 업로드 영역 */}
document.getElementById('imageInput').click()} > {imagePreview ? ( <> 프로필 미리보기
변경
) : (
클릭하여 업로드
)}
{/* 입력 폼 영역 */}
{/* 이름 */}
setFormData({ ...formData, name: e.target.value })} required className="w-full px-4 py-3 border border-gray-200 rounded-xl focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent" placeholder="멤버 이름" />
{/* 생년월일 */}
setFormData({ ...formData, birth_date: date })} />
{/* 포지션 */}
setFormData({ ...formData, position: e.target.value })} className="w-full px-4 py-3 border border-gray-200 rounded-xl focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent" placeholder="메인보컬, 리드댄서 등" />
{/* 인스타그램 */}
setFormData({ ...formData, instagram: e.target.value })} className="w-full px-4 py-3 border border-gray-200 rounded-xl focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent" placeholder="@username" />
{/* 활동 상태 */}
{/* 버튼 영역 */}
)}
); } export default AdminMemberEdit;