멤버 수정
멤버 정보를 수정합니다
import { useState, useEffect, useRef } from 'react'; import { useNavigate, useParams, Link } from 'react-router-dom'; import { motion, AnimatePresence } from 'framer-motion'; import { Save, Upload, LogOut, Home, ChevronRight, User, Instagram, Calendar, Briefcase } from 'lucide-react'; import Toast from '../../../components/Toast'; import CustomDatePicker from '../../../components/admin/CustomDatePicker'; 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] = useState(null); const [imagePreview, setImagePreview] = useState(null); const [imageFile, setImageFile] = useState(null); const [formData, setFormData] = useState({ name: '', birth_date: '', position: '', instagram: '', is_former: false }); // Toast 자동 숨김 useEffect(() => { if (toast) { const timer = setTimeout(() => setToast(null), 3000); return () => clearTimeout(timer); } }, [toast]); 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 handleLogout = () => { authApi.logout(); navigate('/admin'); }; 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 (
멤버 정보를 수정합니다