🍟 로그인 시에는 post 요청
axios.post(`${process.env.REACT_APP_API_URL}/oauth/kakao?code=${code}`, {}, { withCredentials: true })
// post 요청의 형태 : axios.post(path, data, config)
🍟 로그아웃 시에도 post 요청
axios.post(`${process.env.REACT_APP_API_URL}/signout`, {}, { withCredentials: true })
const signoutHandler = () => {
axios
.post(`${process.env.REACT_APP_API_URL}/signout`, {}, { withCredentials: true })
.then((res) => {
// console.log(res);
alert("Signed Out successfully!");
dispatch(setUserInfo({}));
setLocalUserInfo((state) => ({ ...state, ...{} }));
navigate("/");
})
.catch((err) => console.log(err));
};
🍟 ({...A, ...B}) 는 B를 A에 덮어씌우겠다는 의미.
const deleteAccount = async () => {
signoutHandler();
await axios
.delete(`${process.env.REACT_APP_API_URL}/user/${localUserInfo?.id}`, {
withCredentials: true,
})
.then((res) => console.log(res))
.catch((err) => {
console.log(err);
});
};
const [image, setImage] = useState({});
const fileChangeHandler = (e) => {
// console.log(e);
// console.log(e.target.files["0"]);
setImage(e.target.files["0"]);
🍟 e.target.files[0]인줄 알았는데 안돼서 브라우저 콘솔 찍어보니 e.target.files['0']로 접근해야 하더라 !
};
const onSubmitHandler = () => {
//console.log(image);
let formData = new FormData();
const config = {
header: { "content-type": "multipart/form-data" },
};
formData.set("img", image);
//console.log(image);
if (image) {
axios
.patch(`${process.env.REACT_APP_API_URL}/user/${localUserInfo?.id}/img`, formData, config)
.then((res) => {
dispatch(setUserInfo(res.data.data));
setLocalUserInfo((state) => ({ ...state, ...res.data.data }));
window.location.reload();
})
.catch((err) => {
alert(err);
});
}
};
return(
...
<img src={userInfo?.profile} className="rounded-full w-274 h-274 object-cover object-center" />
<form type="file" name="img" encType="multipart/form-data">
Change profile :
<input type="file" name="img" onChange={fileChangeHandler} />
</form>
<button onClick={onSubmitHandler}>Save</button>
)
server
update_profile: async (req, res) => {
const userId = req.params.userId;
console.log("req.file", req.file.filename);
const newString = process.env.DOMAIN + "/" + req.file.filename;
await models.user.update(
{
profile: newString,
},
{
where: {
id: userId,
},
},
);
const userInfo = await models.user.findOne({
where: {
id: userId,
},
});
res.status(200).json({
data: userInfo,
message: `프로필 사진 업데이트 성공 filename : ${req.file.filename}`,
});
},
const [image, setImage] = useState({});
const [preview, setPreview] = useState("");
const fileChangeHandler = (e) => {
let reader = new FileReader();
if (e.target.files["0"]) {
reader.readAsDataURL(e.target.files["0"]);
}
reader.onloadend = () => {
const previewImgUrl = reader.result;
if (previewImgUrl) {
console.log(previewImgUrl);
setPreview([...preview, previewImgUrl]);
}
}
setImage(e.target.files["0"]);
}
...
return 부분에 다음과 같이 추가해주면 된다.
{preview ? (
<img src={preview} className="rounded-full w-274 h-274 object-cover object-center" />
) : (
<img src={userInfo?.profile} className="rounded-full w-274 h-274 object-cover object-center" />
)}
근데 이제 문제는, 미리보기가 단 한번밖에 안된다는 것.
두번째로 사진을 바꿔 올리면 그때는 미리보기가 안된다.ㅜ
(웹콘솔에 64어쩌구로 된 긴 암호만 나옴 - 공부하기)
localUserInfo?.id
부분.