import React, {useState, useEffect, useRef, useCallback} from 'react'; import {Link, useNavigate, useLocation, useParams} from 'react-router-dom'; import Modal from "react-bootstrap/Modal"; import * as EgovNet from 'api/egovFetch'; import URL from 'constants/url'; import CODE from 'constants/code'; import {default as EgovLeftNav} from 'components/leftmenu/EgovLeftNavAdmin'; import EgovRadioButtonGroup from 'components/EgovRadioButtonGroup'; import {Form} from "react-bootstrap"; import RichTextEditor from "../../../components/editor/RichTextEditor"; import AttachFile from "../../../components/file/AttachFile"; function AdminPostMgtEdit({props, reloadFunction}) { console.group("AdminPostMgtEdit"); console.log("[Start] AdminPostMgtEdit ------------------------------"); console.log("AdminPostMgtEdit [props] : ", props); const navigate = useNavigate(); const location = useLocation(); const checkRef = useRef([]); console.log("AdminPostMgtEdit [location] : ", location); let item = null; item = props; console.log("@@@ item : " + JSON.stringify(item)); const [modeInfo, setModeInfo] = useState(props.selectedBbsSeq ? {mode: CODE.MODE_CREATE} : {mode: props.mode}); const [boardDetail, setBoardDetail] = useState({}); console.log("@@@ mode : " + modeInfo.mode); const [categoryList, setCategoryList] = useState([]); const retrieveList = useCallback(() => { const retrieveListURL = '/admin/boards/posts/get-category-and-file-list'; const requestOptions = { method: "POST", headers: { 'Content-type': 'application/json', }, body: JSON.stringify(item ? item : {}) } EgovNet.requestFetch(retrieveListURL, requestOptions, (resp) => { setCategoryList(resp.result.categoryList); if (resp.result.files) { setServerFiles(resp.result.files); console.log("@@@ files : " + JSON.stringify(resp.result.files)); } console.log("@@@ categoryList : " + JSON.stringify(resp.result.categoryList)); }, function (resp) { console.log("err response : ", resp); } ); }, []); useEffect(() => { retrieveList(); initMode(); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const initMode = () => { if (modeInfo.mode === CODE.MODE_MODIFY) { setBoardDetail(item); setSelectedBbsSeq(props?.bbsSeq); } } function editPost(e) { const formData = new FormData(); e.preventDefault(); e.stopPropagation(); const form = e.target; formData.append('fixedYn', defaultFixedYn); formData.append('secretYn', defaultSecretYn); formData.append('bbsId', form.bbsId.value); formData.append('bbsSeq', selectedBbsSeq); formData.append('bbsContTitle', form.bbsContTitle.value); formData.append('bbsContents', text); //첨부파일 if (files) { for (let i = 0; i < files.length; i++) { if (files[i].seq) { // 살아남은 file의 seq 목록 서버로 보내면 서버가 알아서 기존파일을 정리해준다. formData.append("survivingFiles", files[i].seq); continue; } formData.append("files", files[i]); } } if (modeInfo.mode === CODE.MODE_MODIFY) { formData.append('bbsContSeq', props.bbsContSeq); } EgovNet.requestFetch( '/admin/boards/posts/post-mgt', { method: "PUT", body: formData }, (resp) => { if (Number(resp.resultCode) === Number(CODE.RCV_SUCCESS)) { alert("저장되었습니다."); reloadFunction(); } else if (Number(resp.resultCode) === Number(CODE.RCV_ERROR_AUTH)) { console.log("토큰 갱신중.") } else { alert(resp.result.resultMessage) } } ) } function deletePost(post) { if (window.confirm("삭제하시겠습니까?")) { EgovNet.requestFetch( '/admin/boards/posts/post-mgt', { method: "DELETE", headers: { 'Content-type': 'application/json' }, body: JSON.stringify(post) }, (resp) => { if (Number(resp.resultCode) === Number(CODE.RCV_SUCCESS)) { reloadFunction(); } else if (Number(resp.resultCode) === Number(CODE.RCV_ERROR_AUTH)) { console.log("토큰 갱신중.") } else { alert(resp.result.resultMessage) } } ) } } console.log("------------------------------AdminPostMgtEdit [End]"); console.groupEnd("AdminPostMgtEdit"); const [defaultFixedYn, setDefaultFixedYn] = useState(props?.fixedYn || "N"); const [defaultSecretYn, setDefaultSecretYn] = useState(props?.secretYn || "N"); const [text, setText] = useState(props?.bbsContents); const [selectedBbsSeq, setSelectedBbsSeq] = useState(null); const handleSelectChange = (e) => { const selectedBbsId = e.target.value; const selectedOption = categoryList.find((item) => item.bbsId === selectedBbsId); setSelectedBbsSeq(selectedOption.bbsSeq); } const fileTypes = ["JPG", "PNG", "GIF", "PDF", "HWP", "HWPX", "ZIP", "JPEG", "MP4", "TXT"]; const [serverFiles, setServerFiles] = useState([]); const [files, setFiles] = useState([]); // 첨부된 file을 삭제하는 요청 const deleteFile = (fileSeq) => { const deleteFileURL = `/contents/api/popup-manage/file/${fileSeq}`; const requestOptions = { method: "DELETE", headers: { 'Content-type': 'application/json', } } EgovNet.requestFetch(deleteFileURL, requestOptions, (resp) => { } ); } return ( <> {/* */} {modeInfo.mode === CODE.MODE_CREATE && '글 작성'} {modeInfo.mode === CODE.MODE_MODIFY && '글 수정'} { editPost(e) }} noValidate> 상단고정필수 setDefaultFixedYn(e.target.checked ? 'Y' : 'N')} /> 비밀글필수 setDefaultSecretYn(e.target.checked ? 'Y' : 'N')} /> 카테고리필수 선택 {categoryList.map((item) => ( {item.bbsTitle} ))} 제목필수 파일필수 내용필수 {/* */} {modeInfo.mode === CODE.MODE_MODIFY && { deletePost(props) }}>삭제 } 저장 {/* */} > ); } export default AdminPostMgtEdit;