728x90
반응형
목차
완성된 모습
PostEditPage 코드 구현
이미지 파일 수정은 추후 수정 예정
import { useNavigate, useParams } from 'react-router-dom';
import { useCallback, useEffect, useState } from 'react';
import { Button } from '@mui/material';
import { useRecoilState } from 'recoil';
import { UserInterface } from 'configs/interface/UserInterface';
import { userState } from 'store/atom/UserAtom';
import { Position } from 'configs/interface/KakaoMapInterface';
import { patchData } from 'services/patchData';
import { useMutation, useQuery } from '@tanstack/react-query';
import { getData } from 'services/getData';
import ImageUploader from './ImageUploader';
import TextArea from './TextArea';
import PostAddPostion from './PostAddPostion';
import styles from './PostEdit.module.scss';
import {
FormDataEntryInterface,
postFormData,
} from '../../services/postFormData';
function PostEdit() {
// const token = useSelector((state) => state.Auth.token);
const navigate = useNavigate();
// URI 파라미터 가져오기
const { postId } = useParams();
// 게시판 제목, 내용, 사진
// 게시판 제목, 내용, 사진
const [user, setUser] = useRecoilState<UserInterface>(userState);
const [image, setImage] = useState({
image_file: '',
preview_URL: './img/profile.png',
});
const [position, setPosition] = useState<Position>({
lat: 0,
lng: 0,
});
const { data: board, isSuccess } = useQuery({
queryKey: ['postList', postId],
queryFn: ({ signal }) => getData<any>(`api/boards/${postId}`, signal),
});
useEffect(() => {
console.log(board);
}, [board]);
const canSubmit = useCallback(() => { //모든 내용이 입력되야 함
return ( //usecallback을 통해 특정 함수를 새로 만들지 않고 재사용
image.image_file !== '' &&
user.content !== '' &&
user.title !== '' &&
position.lat !== 0 &&
position.lng !== 0 &&
user.nickname !== '' &&
user.password !== ''
);
}, [image, user.title, user.content, user.latitude, user.longitude]);
const handleSubmit = useCallback(async () => {
try {
const Data = {
nickname: user.nickname,
password: user.password,
title: user.title,
content: user.content,
image: '', //이미지 파일은 아직 안됨
latitude: position.lat.toString(),
longitude: position.lng.toString(),
};
console.log(Data);
const response = await patchData(`api/boards/${postId}`, Data);
console.log(response);
window.alert('등록이 완료되었습니다');
navigate('/postView');
} catch (e) {
console.log('patch-error');
}
}, [canSubmit]);
return (
<div className={styles['addBoard-wrapper']}>
<div className={styles['addBoard-header']}>게시물 수정하기 🖊️</div>
<div className={styles.submitButton}>
{canSubmit() ? (
<Button
onClick={handleSubmit}
className={styles['success-button']}
variant="outlined"
>
수정하기
</Button>
) : (
<Button
className={styles['disable-button']}
variant="outlined"
size="large"
>
수정힐 내용을 모두 입력하세요
</Button>
)}
</div>
<div className={styles['addBoard-body']}>
//이전 contents값 불러오기
{board && <TextArea contents={board.content} titles={board.title} />}
<ImageUploader setImage={setImage} />
<PostAddPostion position={position} setPosition={setPosition} />
</div>
</div>
);
}
export default PostEdit;
반응형
'프로젝트 > 재활용프로젝트' 카테고리의 다른 글
[재활용 프로젝트][리액트] 재활용 플랫폼 완성 (0) | 2024.06.11 |
---|---|
[리액트][재활용 프로젝트] 댓글 crud 구현 (0) | 2024.06.07 |
[재활용 프로젝트][리액트] 메인 화면 재구상하기 (0) | 2024.05.23 |
[재활용 프로젝트][리액트] 카카오 api 카테고리 마커 세부화 (0) | 2024.05.13 |
[재활용프로젝트][리액트] main화면 구성하기 (0) | 2024.05.08 |