// ✅ Profile.jsx - 프로필관리 컴포넌트
// 수정완료 버튼 클릭
const editConfirmHandler = async () => {
if (window.confirm("이대로 수정하시겠습니까?")) {
// 서버에 PATCH 요청
previewAvatar && setNewAvatar(previewAvatar);
await editProfileInfo(newNickname, newAvatar, accessToken);
// userInfoReducer 리듀서 state 변경
dispatch(editUser({ newNickname, newAvatar }));
console.log(avatar);
setIsEdited(!isEdited);
}
};
// ✅ users.js - JWT서버로 PATCH하는 api
// 닉네임, 프로필이미지 수정하기
export const editProfileInfo = async (newNickname, newAvatar, token) => {
const headers = {
Authorization: `Bearer ${token}`,
};
const updateData = {
nickname: newNickname,
avatar: newAvatar,
};
await axios.patch("https://moneyfulpublicpolicy.co.kr/profile", updateData, {
headers,
});
};
// ✅ authSlice.js - editUser가 포함된 리덕스툴킷 Slice
const userInfoSlice = createSlice({
name: "userInfo",
initialState,
reducers: {
editUser: (state, action) => {
const { newNickname, newAvatar } = action.payload;
return { ...state, nickname: newNickname, avatar: newAvatar };
},
원인 : 프로필정보를 변경할때는 PATCH로 정보를 넘겨주는것 뿐만아니라 추가적인 과정이 더 필요함!
formData
로 만들어서 append
로 넣어줘야 함
accessToken이 유효한 경우, 프로필 이미지 또는 닉네임을 FormData을 통해 요청
-> 변경 완료된 이미지 URL과 닉네임을 응답
// 이미지파일을 FormData에 담는 방법
const formData = new FormData();
// avatar와 nickname 중 하나 또느 모두 변경 가능
formData.append("avatar", imgFile);
formData.append("nickname", nickname);
// 요청 시 Content-Type에 유의
const response = await axios.patch(`${BASE_URL}/profile`, formData, {
headers: {
"Content-Type": "multipart/form-data",
Authorization: `Bearer ${accessToken}`,
},
}
);
파일
형식이어야함파일형식
을 전달해줘야 하는거였음! (URL
XX)<img src="">
의 src에는 url이 들어감문제 : 내가 작성한 게시글에만 수정, 삭제 버튼이 보이게 하고싶은데 ㅠㅠ
비교해본 3가지 토큰 (다 같을줄 알았는데.....)
원인 : 토큰은 일시적으로 유효한거라서, 토큰값으로 비교하면 안되고 userId
같은걸로 비교해야하는거였다!!
👍🏻 결론은
Redux thunk
를 사용하자
서버에 값 보내서 서버상에서는 값이 바꼈는데, 화면에서도 바뀌게 만들려면 state로 또 바꿔줘야하고... 코드도 길어지고 나중에는 너무 복잡해서 나조차도 헷갈리고 로직을 까먹게되고 코드를 봐도 이게 뭐였는지 모르게 되고 state는 너무 많아지고.... 멘붕에 멘붕
해결 : Redux thunk
!
new Date().toString
으로 입력한 시간이 문자열로 들어가게 구현해놓음
-> 숫자가 아니라서 오름차순, 내림차순을 못함
-> 숫자열로 변환하려면?!
Date.now()
: 숫자열을 반환
-> Date.now()로 반환된 숫자열을 new Date(여기) 안에 넣으면 시간형식으로 변환해줌!
-> 숫자열로 정렬 먼저 해준 다음, 화면에 렌더링할때는 날짜형식으로 바꿔서 보여주면 되지~!
ex)
const result = Date.now()
new Date(result) -> 연월일 시간 형식의 날짜가 나옴