반응형
이제 인증의 마무리단계를 하겠습니다.
사용자는 한번만 좋아요 버튼을 클릭 할 수 있게 버튼 이름을 변경하고 로그인 한 사용자는 이름이 가지고 있으므로 이름이 자동으로 뿌려지도록 하는 작업등을 해 보겠습니다.
ArticlePage.js
import { useState, useEffect } from 'react';
import { useParams } from 'react-router-dom';
import axios from 'axios';
import NotFoundPage from './NotFoundPage';
import CommentsList from '../components/CommentsList';
import AddCommentForm from '../components/AddCommentForm';
import useUser from '../hooks/useUser';
import articles from './article-content';
const ArticlePage = () => {
const [articleInfo, setArticleInfo] = useState({ upvotes: 0, comments: [], canUpvote: false });
const { canUpvote } = articleInfo; // add canUpvote
const { articleId } = useParams();
const { user, isLoading } = useUser();
useEffect(() => {
const loadArticleInfo = async () => {
const token = user && await user.getIdToken();
const headers = token ? { authtoken: token } : {};
const response = await axios.get(`/api/articles/${articleId}`, { headers });
const newArticleInfo = response.data;
setArticleInfo(newArticleInfo);
}
if (isLoading) {
loadArticleInfo();
}
}, [isLoading, user]); // adding user info
const article = articles.find(article => article.name === articleId);
const addUpvote = async () => {
const token = user && await user.getIdToken();
const headers = token ? { authtoken: token } : {};
const response = await axios.put(`/api/articles/${articleId}/upvote`, null, { headers });
const updatedArticle = response.data;
setArticleInfo(updatedArticle);
}
if (!article) {
return <NotFoundPage />
}
return (
<>
<h1>{article.title}</h1>
<div className="upvotes-section">
{user
? <button onClick={addUpvote}>{canUpvote ? 'Upvote' : 'Already Upvoted'}</button>
: <button>Log in to upvote</button>}
<p>This article has {articleInfo.upvotes} upvote(s)</p>
</div>
{article.content.map((paragraph, i) => (
<p key={i}>{paragraph}</p>
))}
{user
? <AddCommentForm
articleName={articleId}
onArticleUpdated={updatedArticle => setArticleInfo(updatedArticle)} />
: <button>Log in to add a comment</button>}
<CommentsList comments={articleInfo.comments} />
</>
);
}
export default ArticlePage;
댓글 작성을 위한 사용자 이름이 뿌려지는 작업을 합니다.
AddCommentForm.js
import { useState } from 'react';
import axios from 'axios';
import useUser from '../hooks/useUser';
const AddCommentForm = ({ articleName, onArticleUpdated }) => {
const [name, setName] = useState('');
const [commentText, setCommentText] = useState('');
const { user } = useUser();
const addComment = async () => {
const token = user && await user.getIdToken();
const headers = token ? { authtoken: token } : {};
const response = await axios.post(`/api/articles/${articleName}/comments`, {
postedBy: name,
text: commentText,
}, {
headers,
});
const updatedArticle = response.data;
onArticleUpdated(updatedArticle);
setName('');
setCommentText('');
}
return (
<div id="add-comment-form">
<h3>Add a Comment</h3>
{user && <p>You are posting as {user.email}</p>}
<textarea
value={commentText}
onChange={e => setCommentText(e.target.value)}
rows="4"
cols="50" />
<button onClick={addComment}>Add Comment</button>
</div>
)
}
export default AddCommentForm;
이제 마지막으로 Firebase auth를 통해 로그인 로그아웃 버튼을 추가하도록 하겠습니다.
NavBar.js
import { Link, useNavigate } from 'react-router-dom';
import { getAuth, signOut } from 'firebase/auth';
import useUser from './hooks/useUser';
const NavBar = () => {
const { user } = useUser();
const navigate = useNavigate();
return (
<nav>
<ul>
<li>
<Link to="/">Home</Link>
</li>
<li>
<Link to="/about">About</Link>
</li>
<li>
<Link to="/articles">Articles</Link>
</li>
</ul>
<div className="nav-right">
{user
? <button onClick={() => {
signOut(getAuth());
}}>Log Out</button>
: <button onClick={() => {
navigate('/login');
}}>Log In</button>}
</div>
</nav>
);
}
export default NavBar;
좋아요버튼, 댓글 그리고 로그인 로그아웃 버튼을 확인한 결과 화면은 다음과 같습니다.
자! 이제 Front End와 Back End에 인증작업을 하므로써 모든 Full Stack 작업을 마쳤습니다!
반응형
'PROGRAMING > FULL STACK' 카테고리의 다른 글
[Host] Setting up hosting for MongoDB (0) | 2024.03.28 |
---|---|
[Host] Preparing an app for release (1) | 2024.03.28 |
[Auth] Making Requests with auth tokens (0) | 2024.03.28 |
[Auth] Protecting the upvote and comment endpoints (0) | 2024.03.26 |
[Auth] Protecting endpoints using auth-tokens (0) | 2024.03.26 |