From 2bcd389709eeccf13f3e2c6d1c7d2944755ab187 Mon Sep 17 00:00:00 2001 From: ajeong Date: Thu, 5 Sep 2024 11:28:08 +0900 Subject: [PATCH] =?UTF-8?q?Feat:=20=EA=B2=8C=EC=8B=9C=EB=AC=BC=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=EB=AF=B8=EB=A6=AC=EB=B3=B4=EA=B8=B0=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=B6=94=EA=B0=80=20#32?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/CreateBoardPage/CreateBoardPage.jsx | 57 +++++++++++++++++-- .../CreateBoardPage/CreateBoardPage.style.jsx | 44 ++++++++++++++ src/pages/UpdateBoardPage/UpdateBoardPage.jsx | 1 - 3 files changed, 97 insertions(+), 5 deletions(-) diff --git a/src/pages/CreateBoardPage/CreateBoardPage.jsx b/src/pages/CreateBoardPage/CreateBoardPage.jsx index 689894d..85c5faf 100644 --- a/src/pages/CreateBoardPage/CreateBoardPage.jsx +++ b/src/pages/CreateBoardPage/CreateBoardPage.jsx @@ -5,8 +5,30 @@ import { useNavigate } from "react-router-dom"; import TextareaAutosize from "react-textarea-autosize"; import axios from "../../customAxios" -const CreateBoardPage = () => { +const CheckCountFile = (files = []) => { + return files.length <= 5; +}; + +const PostContainer = ({ preview, setPreview, setFile }) => { + const containFiles = preview.length > 0; + return ( + { containFiles && + + {preview.map((prevUrl, index) => ( + + + { + setPreview((prevPreviews) => prevPreviews.filter((_, i) => i !== index)); + setFile((prevFiles) => prevFiles.filter((_, i) => i !== index)); + }} /> + + ))} + + } + ); +}; +const CreateBoardPage = () => { const inputEl = useRef(null); const [fileName, setFileName] = useState(""); const fileInputHandler = useCallback((event) => { @@ -50,7 +72,8 @@ const CreateBoardPage = () => { content: "", }); - const [file, setFile] = useState(null); + const [file, setFile] = useState([]); + const [preview, setPreview] = useState([]); const onChangeInfo = (e) => { setBoardInfo({ @@ -60,9 +83,28 @@ const CreateBoardPage = () => { }; const onChangeFile = (e) => { - setFile(e.target.files); + + const selectedFile = e.target.files[0]; + + if (selectedFile) { + const reader = new FileReader(); + reader.readAsDataURL(selectedFile); + reader.onloadend = () => { + const newFiles = [...file, selectedFile]; + if (CheckCountFile(newFiles)) { + setFile(newFiles); + setPreview((prevPreviews) => [...prevPreviews, reader.result]); + } else { + alert("사진은 최대 5개까지 추가할 수 있습니다."); + } + }; + } }; + useEffect(() => { + CheckCountFile(file); + }, [file]) + const navigate = useNavigate(); const handleCreateBoardPage = (e) => { e.preventDefault(); @@ -71,7 +113,9 @@ const CreateBoardPage = () => { formData.append("title", boardInfo.title); formData.append("content", boardInfo.content); if (file) { - formData.append("images", file[0]); + file.forEach((f) => { + formData.append("images", f); + }); } createBoardAPI(formData); navigate("/"); @@ -102,6 +146,11 @@ const CreateBoardPage = () => { placeholder="내용을 입력하세요 ..." minRows={10} /> + + + + +