-
Notifications
You must be signed in to change notification settings - Fork 26
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[feat]MyPage React #88
base: jinmo
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,66 @@ | ||
import { useEffect, useState } from "react"; | ||
import CommentElement from "./CommentElement"; | ||
import { createComment, getComments, deleteComment } from "../../apis/api"; | ||
|
||
|
||
const Comment = ({ postId }) => { | ||
const [commentList, setCommentList] = useState([]); // state for comments | ||
const [newContent, setNewContent] = useState(""); // state for new comment | ||
|
||
useEffect(() => { | ||
const getCommentsAPI = async () => { | ||
const comments = await getComments(postId); | ||
setCommentList(comments); | ||
}; | ||
getCommentsAPI(); | ||
}, [postId]); | ||
|
||
const handleCommentSubmit = (e) => { | ||
e.preventDefault(); | ||
setNewContent(""); | ||
createComment({ post: postId, content: newContent }); | ||
}; | ||
|
||
// 과제!! | ||
const handleCommentDelete = async (commentId) => { | ||
const confirmDelete = window.confirm("정말로 댓글을 삭제하시겠습니까?"); | ||
if (confirmDelete) { | ||
await deleteComment(commentId); | ||
window.location.reload(); | ||
} | ||
}; | ||
|
||
return ( | ||
<div className="w-full mt-5 self-start"> | ||
<h1 className="text-3xl font-bold mt-5 mb-3">Comments</h1> | ||
{commentList.map((comment) => { | ||
return ( | ||
<div className="w-full flex flex-row" key={comment.id}> | ||
<CommentElement | ||
comment={comment} | ||
handleCommentDelete={handleCommentDelete} | ||
/> | ||
</div> | ||
); | ||
})} | ||
{/* comment form component */} | ||
<form | ||
className="flex items-center justify-center mt-10 gap-2" | ||
onSubmit={handleCommentSubmit} | ||
> | ||
<input | ||
type="text" | ||
value={newContent} | ||
placeholder="댓글을 입력해주세요" | ||
className="input h-14" | ||
onChange={(e) => setNewContent(e.target.value)} | ||
/> | ||
<button type="submit" className="button"> | ||
comment | ||
</button> | ||
</form> | ||
</div> | ||
); | ||
}; | ||
|
||
export default Comment; |
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,139 @@ | ||||||||||||||||||||||||||||||||||||||||
import { Link } from "react-router-dom"; | ||||||||||||||||||||||||||||||||||||||||
import { useEffect, useState } from "react"; | ||||||||||||||||||||||||||||||||||||||||
import { updateMyInfo } from "../../apis/api"; | ||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||
export const MyPageInput = ({ content }) => { | ||||||||||||||||||||||||||||||||||||||||
const [isEmailEdit, setIsEmailEdit] = useState(false); | ||||||||||||||||||||||||||||||||||||||||
const [isUsernameEdit, setIsUsernameEdit] = useState(false); | ||||||||||||||||||||||||||||||||||||||||
const [isCollegeEdit, setIsCollegeEdit] = useState(false); | ||||||||||||||||||||||||||||||||||||||||
const [isMajorEdit, setIsMajorEdit] = useState(false); | ||||||||||||||||||||||||||||||||||||||||
const [formData, setFormData] = useState(content); | ||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 굳이 |
||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||
const handleChange = (e) => { | ||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||
if (e.target.id === "email" || e.target.id === "username") | ||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||
setFormData({ ...formData, [`user`]: {...formData.user, [e.target.id]: e.target.value} }); | ||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||
else setFormData({ ...formData, [e.target.id]: e.target.value }); | ||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||
Comment on lines
+12
to
+19
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||
const onSubmit = async (e) => { | ||||||||||||||||||||||||||||||||||||||||
e.preventDefault(); | ||||||||||||||||||||||||||||||||||||||||
await updateMyInfo(formData); | ||||||||||||||||||||||||||||||||||||||||
setIsEmailEdit(false); | ||||||||||||||||||||||||||||||||||||||||
setIsUsernameEdit(false); | ||||||||||||||||||||||||||||||||||||||||
setIsCollegeEdit(false); | ||||||||||||||||||||||||||||||||||||||||
setIsMajorEdit(false); | ||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||
Comment on lines
+21
to
+28
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||
const onEmailEditClick = async (e) => { | ||||||||||||||||||||||||||||||||||||||||
setIsEmailEdit(true); | ||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||
const onUsernameEditClick = async (e) => { | ||||||||||||||||||||||||||||||||||||||||
setIsUsernameEdit(true); | ||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||
const onCollegeEditClick = async (e) => { | ||||||||||||||||||||||||||||||||||||||||
setIsCollegeEdit(true); | ||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||
const onMajorEditClick = async (e) => { | ||||||||||||||||||||||||||||||||||||||||
setIsMajorEdit(true); | ||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||
Comment on lines
+30
to
+45
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 우선, 이 부분은 그냥 setState를 활용해서 state를 변경해주는 것이기 때문에 비동기 처리가 아니예요! async를 사용할 필요가 없습니다. 또, 이 부분도
Suggested change
이런식으로요! |
||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||
const onCancelClick = async (e) => { | ||||||||||||||||||||||||||||||||||||||||
setFormData(content); | ||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||
return ( | ||||||||||||||||||||||||||||||||||||||||
<> | ||||||||||||||||||||||||||||||||||||||||
{formData && ( | ||||||||||||||||||||||||||||||||||||||||
<form className="form" onSubmit={onSubmit}> | ||||||||||||||||||||||||||||||||||||||||
<div className="flex w-full gap-x-5"> | ||||||||||||||||||||||||||||||||||||||||
<input | ||||||||||||||||||||||||||||||||||||||||
type="text" | ||||||||||||||||||||||||||||||||||||||||
placeholder="Add Tags.." | ||||||||||||||||||||||||||||||||||||||||
id="email" | ||||||||||||||||||||||||||||||||||||||||
value={formData.user.email} | ||||||||||||||||||||||||||||||||||||||||
className="input grow" | ||||||||||||||||||||||||||||||||||||||||
onChange={handleChange} | ||||||||||||||||||||||||||||||||||||||||
/> | ||||||||||||||||||||||||||||||||||||||||
Comment on lines
+55
to
+63
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 이 부분도 |
||||||||||||||||||||||||||||||||||||||||
<> | ||||||||||||||||||||||||||||||||||||||||
{isEmailEdit ? ( | ||||||||||||||||||||||||||||||||||||||||
<div> | ||||||||||||||||||||||||||||||||||||||||
<button className="small-button w-16">submit</button> | ||||||||||||||||||||||||||||||||||||||||
<button className="small-button w-16" onClick={onCancelClick}>cancel</button> | ||||||||||||||||||||||||||||||||||||||||
</div> | ||||||||||||||||||||||||||||||||||||||||
) : ( | ||||||||||||||||||||||||||||||||||||||||
<button className="small-button w-16" onClick={onEmailEditClick}>edit</button> | ||||||||||||||||||||||||||||||||||||||||
)} | ||||||||||||||||||||||||||||||||||||||||
</> | ||||||||||||||||||||||||||||||||||||||||
</div> | ||||||||||||||||||||||||||||||||||||||||
<div className="flex w-full gap-x-5"> | ||||||||||||||||||||||||||||||||||||||||
<input | ||||||||||||||||||||||||||||||||||||||||
type="text" | ||||||||||||||||||||||||||||||||||||||||
placeholder="Add Tags.." | ||||||||||||||||||||||||||||||||||||||||
id="username" | ||||||||||||||||||||||||||||||||||||||||
value={formData.user.username} | ||||||||||||||||||||||||||||||||||||||||
className="input grow" | ||||||||||||||||||||||||||||||||||||||||
onChange={handleChange} | ||||||||||||||||||||||||||||||||||||||||
/> | ||||||||||||||||||||||||||||||||||||||||
<> | ||||||||||||||||||||||||||||||||||||||||
{isUsernameEdit ? ( | ||||||||||||||||||||||||||||||||||||||||
<div> | ||||||||||||||||||||||||||||||||||||||||
<button className="small-button w-16">submit</button> | ||||||||||||||||||||||||||||||||||||||||
<button className="small-button w-16" onClick={onCancelClick}>cancel</button> | ||||||||||||||||||||||||||||||||||||||||
</div> | ||||||||||||||||||||||||||||||||||||||||
) : ( | ||||||||||||||||||||||||||||||||||||||||
<button className="small-button w-16" onClick={onUsernameEditClick}>edit</button> | ||||||||||||||||||||||||||||||||||||||||
)} | ||||||||||||||||||||||||||||||||||||||||
</> | ||||||||||||||||||||||||||||||||||||||||
</div> | ||||||||||||||||||||||||||||||||||||||||
<div className="flex w-full gap-x-5"> | ||||||||||||||||||||||||||||||||||||||||
<input | ||||||||||||||||||||||||||||||||||||||||
type="text" | ||||||||||||||||||||||||||||||||||||||||
placeholder="Add Tags.." | ||||||||||||||||||||||||||||||||||||||||
id="college" | ||||||||||||||||||||||||||||||||||||||||
value={formData.college} | ||||||||||||||||||||||||||||||||||||||||
className="input grow" | ||||||||||||||||||||||||||||||||||||||||
onChange={handleChange} | ||||||||||||||||||||||||||||||||||||||||
/> | ||||||||||||||||||||||||||||||||||||||||
<> | ||||||||||||||||||||||||||||||||||||||||
{isCollegeEdit ? ( | ||||||||||||||||||||||||||||||||||||||||
<div> | ||||||||||||||||||||||||||||||||||||||||
<button className="small-button w-16">submit</button> | ||||||||||||||||||||||||||||||||||||||||
<button className="small-button w-16" onClick={onCancelClick}>cancel</button> | ||||||||||||||||||||||||||||||||||||||||
</div> | ||||||||||||||||||||||||||||||||||||||||
) : ( | ||||||||||||||||||||||||||||||||||||||||
<button className="small-button w-16" onClick={onCollegeEditClick}>edit</button> | ||||||||||||||||||||||||||||||||||||||||
)} | ||||||||||||||||||||||||||||||||||||||||
</> | ||||||||||||||||||||||||||||||||||||||||
</div> | ||||||||||||||||||||||||||||||||||||||||
<div className="flex w-full gap-x-5"> | ||||||||||||||||||||||||||||||||||||||||
<input | ||||||||||||||||||||||||||||||||||||||||
type="text" | ||||||||||||||||||||||||||||||||||||||||
placeholder="Add Tags.." | ||||||||||||||||||||||||||||||||||||||||
id="major" | ||||||||||||||||||||||||||||||||||||||||
value={formData.major} | ||||||||||||||||||||||||||||||||||||||||
className="input grow" | ||||||||||||||||||||||||||||||||||||||||
onChange={handleChange} | ||||||||||||||||||||||||||||||||||||||||
/> | ||||||||||||||||||||||||||||||||||||||||
<> | ||||||||||||||||||||||||||||||||||||||||
{isMajorEdit ? ( | ||||||||||||||||||||||||||||||||||||||||
<div> | ||||||||||||||||||||||||||||||||||||||||
<button className="small-button w-16">submit</button> | ||||||||||||||||||||||||||||||||||||||||
<button className="small-button w-16" onClick={onCancelClick}>cancel</button> | ||||||||||||||||||||||||||||||||||||||||
</div> | ||||||||||||||||||||||||||||||||||||||||
) : ( | ||||||||||||||||||||||||||||||||||||||||
<button className="small-button w-16" onClick={onMajorEditClick}>edit</button> | ||||||||||||||||||||||||||||||||||||||||
)} | ||||||||||||||||||||||||||||||||||||||||
</> | ||||||||||||||||||||||||||||||||||||||||
</div> | ||||||||||||||||||||||||||||||||||||||||
</form> | ||||||||||||||||||||||||||||||||||||||||
)} | ||||||||||||||||||||||||||||||||||||||||
</> | ||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||
}; |
Original file line number | Diff line number | Diff line change | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,54 @@ | ||||||||||||||||
import { useEffect, useState } from "react"; | ||||||||||||||||
import { useNavigate, useParams } from "react-router-dom"; | ||||||||||||||||
import { SmallPost } from "../components/Posts"; | ||||||||||||||||
import { MyPageInput } from "../components/EditInput"; | ||||||||||||||||
|
||||||||||||||||
import { Link } from "react-router-dom"; | ||||||||||||||||
import { getPosts, getUser, getMyPage } from "../apis/api"; | ||||||||||||||||
import { getCookie } from "../utils/cookie"; | ||||||||||||||||
|
||||||||||||||||
const MyPage = () => { | ||||||||||||||||
const [userProfile, setUserProfile] = useState(); | ||||||||||||||||
|
||||||||||||||||
const [tags, setTags] = useState([]); | ||||||||||||||||
const [searchTags, setSearchTags] = useState([]); | ||||||||||||||||
const [searchValue, setSearchValue] = useState(""); | ||||||||||||||||
const [postList, setPostList] = useState([]); | ||||||||||||||||
|
||||||||||||||||
useEffect(() => { | ||||||||||||||||
// access_token이 있으면 유저 정보 가져옴 | ||||||||||||||||
if (getCookie("access_token")) { | ||||||||||||||||
const getMyPageAPI = async () => { | ||||||||||||||||
const userProfile = await getMyPage(); | ||||||||||||||||
setUserProfile(userProfile); | ||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
이런 식으로요! 그리고 userProfile 변수가 중복 사용된 것 같은데, 아마 문제는 없었을 것 같은데 그래도 최대한 변수명은 다르게 설정해주는게 좋아요! |
||||||||||||||||
}; | ||||||||||||||||
const getPostsAPI = async () => { | ||||||||||||||||
const posts = await getPosts(); | ||||||||||||||||
setPostList(posts); | ||||||||||||||||
}; | ||||||||||||||||
getPostsAPI(); | ||||||||||||||||
getMyPageAPI(); | ||||||||||||||||
} | ||||||||||||||||
}, []); | ||||||||||||||||
|
||||||||||||||||
return ( | ||||||||||||||||
<div> | ||||||||||||||||
{userProfile && (//userProfile을 안 받아왔을 때에 대한 처리. | ||||||||||||||||
<> | ||||||||||||||||
<MyPageInput content={userProfile}></MyPageInput> | ||||||||||||||||
</> | ||||||||||||||||
)} | ||||||||||||||||
<div className="w-full flex-row"> | ||||||||||||||||
{postList.filter((post) => | ||||||||||||||||
post.author.id === userProfile.user.id | ||||||||||||||||
) | ||||||||||||||||
.map((post) => ( | ||||||||||||||||
<SmallPost key={post.id} post={post} /> | ||||||||||||||||
)) | ||||||||||||||||
} | ||||||||||||||||
</div> | ||||||||||||||||
</div> | ||||||||||||||||
); | ||||||||||||||||
}; | ||||||||||||||||
|
||||||||||||||||
export default MyPage; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 부분의 경우
formData
를 처리하는 것처럼 한번에 관리해주는게 좋아요!이런식으로요!