'use client'; import './style.scss'; import Link from 'next/link'; import Image from 'next/image'; import { useState } from 'react'; import { useMemberContext } from '@/contexts/memberProvider'; import useErrorAlert from '@/hooks/useErrorAlert'; import { fetchApi, throwError } from '@/lib/utils/client'; import Loading from '@/app/component/Loading'; export default function ChangeThumb() { const { member, setMember } = useMemberContext(); const { setError } = useErrorAlert(); const [loading, setLoading] = useState(false); const [newThumb, setNewThumb] = useState(null); const [preview, setPreview] = useState(null); const resetFileInput = () => { const fileInput = document.getElementById("thumb") as HTMLInputElement; if (fileInput) fileInput.value = ""; }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!member) { return; } if (!newThumb) { return setError('사진을 선택하세요.'); } setLoading(true); const formData = new FormData(); formData.append('thumb', newThumb); fetchApi<{thumbUrl: string}>('/api/mypage/thumb', { method: 'POST', body: formData }).then((res) => { throwError(res); member.thumb = (res.data?.thumbUrl || null); setMember(member); localStorage.setItem('member', JSON.stringify(member)); alert("사진이 변경되었습니다."); }).catch(err => { setError(err.message); }).finally(() => { setLoading(false); setNewThumb(null); setPreview(null); resetFileInput(); }); } const handleChange = (e: React.ChangeEvent) => { if (e.target.files && e.target.files[0]) { const selectedFile = e.target.files[0]; setNewThumb(selectedFile); // 이미지 미리보기 const reader = new FileReader(); reader.onloadend = () => setPreview(reader.result as string); reader.readAsDataURL(selectedFile); } }; const handleRemove = async () => { // 미리보기만 있고 서버에 저장된 사진이 아닌 경우 로컬만 초기화 if (!member?.thumb) { setNewThumb(null); setPreview(null); resetFileInput(); return; } if (!confirm('사진을 삭제하시겠습니까?')) { return; } setLoading(true); fetchApi('/api/mypage/thumb', { method: 'DELETE' }).then((res) => { throwError(res); member.thumb = null; setMember(member); localStorage.setItem('member', JSON.stringify(member)); setNewThumb(null); setPreview(null); resetFileInput(); alert("사진이 삭제되었습니다."); }).catch(err => { setError(err.message); }).finally(() => { setLoading(false); }); }; return (
{ loading && }

회원 사진

커뮤니티 프로필에 대표 사진을 설정할 수 있습니다.
{preview ? 미리보기 : member?.thumb ? {member.email} : 기본 사진 }
{(preview || member?.thumb) && }

98x98 크기 이상, 4MB 이하의 사진이 권장됩니다. 이미지 파일을 사용하세요. 사진이 {process.env.NEXT_PUBLIC_SITE_NAME} 커뮤니티 가이드를 준수해야 합니다.

취소
); }