navigate
로 해당 edit 페이지의 id로 넘아가고 그 글의 getposting 담긴 값을 state로 넘겨준다. <S.UpdateTitle
onClick={() => navigate(`/edit/${id}`, { state: getPostings })}
>
게시글 수정하기
</S.UpdateTitle>
updatedoc
을 해주는데 필요한 부분만 업데이트를 해준다.// postEditpage.tsx
//updatedoc (기존의 post와 다르게 업데이트 될 부분만 올려준다.)
const geturl: any = () => {
getDownloadURL(ref(storage, `test/${PostingID_Posting}/thumbnail`))
.then((thumbnailUrl) => {
console.log('섬네일url', thumbnailUrl);
// Get banner url
getDownloadURL(ref(storage, `test/${PostingID_Posting}/banner`))
.then((bannerUrl) => {
console.log('배너url', typeof bannerUrl);
try {
const postRef = doc(dbService, 'Post', id);
updateDoc(postRef, {
Description_Posting: Description,
RsvDate_Posting,
RsvHour_Posting,
Title_Posting: Title,
Category_Posting: postCategory,
ThumbnailURL_Posting: thumbnailUrl,
BannerURL_Posting: bannerUrl,
Address_Posting,
MeetLongitude_Posting,
MeetLatitude_Posting,
});
console.log('글작성완료 ID: ', postRef);
} catch (e) {
console.error('Error updating document: ', e);
}
})
.catch((error) => {
alert(error);
});
})
.catch((error) => {
alert(error);
});
};
// 1. 해당 글 id의 값을 params로 받아온다.
const { id } = useParams();
// 2. 해당 글의 db에 올라간 객체를 useLoaction으로 받아온다.
const { state } = useLocation();
console.log(id);
console.log(state);
우리 파일 구조가 postpage
-> mainpost
-> information(지도)
페이지 순으로 이어져있다.
mainpost
에서는 제목과 내용을 입력하는 코드가 있다.
하지만adddoc
이 일어지는 곳은postpage
이기 때문에 부모에서 자식으로 올라갈 수 없다.
팀원분이 애초에 postpage의 usestate를 만들어서 main으로 넘겨주면 되는데 props에 익숙하지 않아
recoil
을 사용해서 mainpost에 타이틀과 내용 값을 있는 것을 postpage로 넘겨주고 있다.
아래처럼 mainpost 값을Atom
을 사용하여 값을 postpage로 넘겨주고 있다.
main
에서 post
페이지로 useRecoilState
를 사용하여 TitleInput
값을 넘겨준다.
즉, 그 글에서 입력한 posttitle, postdescription 값을 useRecoilState를 사용하여 TitleInput 값을 넘겨준다.
//타이틀, 글 내용
const Title = useRecoilValue(TitleInput);
console.log(TitleInput);
console.log(Title);
const Description = useRecoilValue(DescriptionInput);
console.log(DescriptionInput);
console.log(Description);
아래 캡처본처럼 잘 찍힌다.
6.postpage
에서 useRecoilValue(TitleInput)
값을 Title
에 할당해주는 로직의 시스템이다.
//Atom.tsx
export const ReserveDate = atom<any>({
key: 'ReserveDate',
// key의 값은 항상 고유값이어야 합니다.
default: Date(),
});
export const TitleInput = atom<string>({
key: 'TitleInput',
// key의 값은 항상 고유값이어야 합니다.
default: '',
});
//mainpost.tsx
const [posttitel, Setposttitle] = useRecoilState(TitleInput); //글 제목
const [postdescription, SetDescription] = useRecoilState(DescriptionInput); //글 내용
//postpage.tsx
//타이틀, 글 내용
const Title = useRecoilValue(TitleInput);
const Description = useRecoilValue(DescriptionInput);
title
과 descriton을 가져오겠다.useRecoilState
를 사용하여 아래처럼 변경해준다. 그럼 recoil
을 통해 그 게시글이 올라간 타이틀과 내용의 값을 가져온다.// PostEditPage.tsx
//타이틀, 글 내용
const [Title, setTitle] = useRecoilState(TitleInput);
const [Description, setDescription] = useRecoilState(DescriptionInput);
useEffect
를 사용하여 만약에 state
값이 들어온다면 setTitle
과 setDescription
Title_Posting
과 Description_Posting
을 넣어준다.// PostEditPage.tsx
//수정
useEffect(() => {
if (state) {
setTitle(state.Title_Posting);
setDescription(state.Description_Posting);
}
}, [state]);
카테고리 값
을 가져와야 된다.
postpage
에usestate
를 사용하여 게시글의 카테고리 값을 가져온다.
postEditpage
에서state.Category_posting
게시글의 값을 가져온다.
그럼 게시글 수정을 누르면 내가 선택했던 즉 db에 올라간 카테고리 값이 제대로 선택되어있다.카테고리 선택을 하면 값들이 postEditpage (setPostCategory={setPostCategory} postCategory={postCategory})-> mainEditpage -> DropdownCategory으로 내려간다.
mainEditpage
에서 선택한 카테고리 값을 <S.CategoryTitle>{postCategory}</S.CategoryTitle> 로 박아준다. 그럼 내가 선택할때마다 카테고리 타이틀이 바뀐다.
DropdownCategory
에서setPostCategory
받아서완료
라는 버튼을 클릭하면 내가 클릭한event.target.innerText
을setPostCategory
함수에 넣어준다. 이런식으로 순환하는 로직이다.
//postEditpage.tsx
const [postCategory, setPostCategory] = useState(state.Category_Posting);
썸네일 배너 이미지
값을 가져와야된다.postEditpage
에서 thumbnailimg={state.ThumbnailURL_Posting}
, bannerimg={state.BannerURL_Posting}
의 게시글의 썸네일과 배너 이미지 값을 mainPostEdit
으로 넘겨준다.// postEditpage.tsx
<MainPostEdit
setPostCategory={setPostCategory}
postCategory={postCategory}
thumbnailimg={state.ThumbnailURL_Posting}
bannerimg={state.ThumbnailURL_Posting}
/>
postpage
는 아래처럼 로직이 짜여져있다. 그럼 postEditpage
도 값을 넘겨주자!// mainpage.tsx
const [photoupload, setPhotoupload] = useRecoilState(ThumbnailUpload);
const [bannerupload, setBanneruploadupload] = useRecoilState(Bannerupload);
state.ThumbnailURL_Posting
, state.ThumbnailURL_Posting
을 postEditpage
-> mainEditpage
으로 넘겨준다.mainEdit.page
에서 thumbnailimg,bannerimg
값을 받아와서 useState 값에 넣어주면 게시글 작성했을때의 배너와 썸네일 이미지가 잘 들어온다.const [thumbnail, setThumbnail] = useState<any>(thumbnailimg);
const [banner, setBanner] = useState<any>(bannerimg);
지도 값
을 가져오는 코드는 다음편에...