-
Notifications
You must be signed in to change notification settings - Fork 79
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
[김보미] sprint11 #670
The head ref may contain hidden characters: "Next.js-\uAE40\uBCF4\uBBF8-sprint11"
[김보미] sprint11 #670
Changes from all commits
016f847
bbb8b6d
aa7c6a7
c4a9dfc
358bb04
6198fb2
399dc64
76c942f
37ac08b
bcb1f56
0964c90
02ebb7a
429dbd0
a18ba75
d1022fe
8ad9474
ffe2c50
a695419
90f8377
c8a1e4b
aa189e9
e42f9d7
690b18c
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
This file was deleted.
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -26,6 +26,7 @@ yarn-error.log* | |
|
||
# local env files | ||
.env*.local | ||
.env | ||
|
||
# vercel | ||
.vercel | ||
|
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -1,11 +1,16 @@ | ||||||||||||||||||||||
import instance from "@/lib/axios"; | ||||||||||||||||||||||
import axiosGetInstance from "@/lib/axiosGetInstance"; | ||||||||||||||||||||||
|
||||||||||||||||||||||
// GET | ||||||||||||||||||||||
// 페이지네이션을 위한 전체 게시글 수 | ||||||||||||||||||||||
export async function getTotalPosts() { | ||||||||||||||||||||||
try { | ||||||||||||||||||||||
const { data } = await instance.get( | ||||||||||||||||||||||
"/articles?&pageSize=10000&orderBy=recent", | ||||||||||||||||||||||
); | ||||||||||||||||||||||
const params = new URLSearchParams({ | ||||||||||||||||||||||
pageSize: "10000", | ||||||||||||||||||||||
orderBy: "recent", | ||||||||||||||||||||||
}); | ||||||||||||||||||||||
|
||||||||||||||||||||||
const { data } = await axiosGetInstance.get("/articles?", { params }); | ||||||||||||||||||||||
return data.list.length; | ||||||||||||||||||||||
} catch (error) { | ||||||||||||||||||||||
console.error("getTotalPosts 함수에서 오류 발생:", error); | ||||||||||||||||||||||
|
@@ -26,7 +31,9 @@ export async function getPosts({ | |||||||||||||||||||||
page: page.toString(), | ||||||||||||||||||||||
pageSize: pageSize.toString(), | ||||||||||||||||||||||
}); | ||||||||||||||||||||||
const { data } = await instance.get(`/articles?${params.toString()}`); | ||||||||||||||||||||||
const { data } = await axiosGetInstance.get( | ||||||||||||||||||||||
`/articles?${params.toString()}`, | ||||||||||||||||||||||
); | ||||||||||||||||||||||
return data.list; | ||||||||||||||||||||||
} catch (error) { | ||||||||||||||||||||||
console.error("getPosts 함수에서 오류 발생:", error); | ||||||||||||||||||||||
|
@@ -36,8 +43,13 @@ export async function getPosts({ | |||||||||||||||||||||
|
||||||||||||||||||||||
export async function getBestPosts({ pageSize = 3 }) { | ||||||||||||||||||||||
try { | ||||||||||||||||||||||
const { data } = await instance.get( | ||||||||||||||||||||||
`/articles?&pageSize=${pageSize}&orderBy=like`, | ||||||||||||||||||||||
const params = new URLSearchParams({ orderBy: "like" }); | ||||||||||||||||||||||
|
||||||||||||||||||||||
const { data } = await axiosGetInstance.get( | ||||||||||||||||||||||
`/articles?&pageSize=${pageSize}`, | ||||||||||||||||||||||
{ | ||||||||||||||||||||||
params, | ||||||||||||||||||||||
}, | ||||||||||||||||||||||
Comment on lines
+48
to
+52
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
|
||||||||||||||||||||||
); | ||||||||||||||||||||||
return data.list; | ||||||||||||||||||||||
} catch (error) { | ||||||||||||||||||||||
|
@@ -48,7 +60,7 @@ export async function getBestPosts({ pageSize = 3 }) { | |||||||||||||||||||||
|
||||||||||||||||||||||
export async function getPostsDetail(articleId: string) { | ||||||||||||||||||||||
try { | ||||||||||||||||||||||
const { data } = await instance.get(`/articles/${articleId}`); | ||||||||||||||||||||||
const { data } = await axiosGetInstance.get(`/articles/${articleId}`); | ||||||||||||||||||||||
return data; | ||||||||||||||||||||||
} catch (error) { | ||||||||||||||||||||||
console.error("getPostsDetail 함수에서 오류 발생:", error); | ||||||||||||||||||||||
|
@@ -58,12 +70,71 @@ export async function getPostsDetail(articleId: string) { | |||||||||||||||||||||
|
||||||||||||||||||||||
export async function getPostsComments(articleId: string) { | ||||||||||||||||||||||
try { | ||||||||||||||||||||||
const { data } = await instance.get( | ||||||||||||||||||||||
`/articles/${articleId}/comments?limit=100`, | ||||||||||||||||||||||
const params = new URLSearchParams({ limit: "100" }); | ||||||||||||||||||||||
const { data } = await axiosGetInstance.get( | ||||||||||||||||||||||
`/articles/${articleId}/comments?`, | ||||||||||||||||||||||
{ | ||||||||||||||||||||||
params, | ||||||||||||||||||||||
}, | ||||||||||||||||||||||
); | ||||||||||||||||||||||
return data.list; | ||||||||||||||||||||||
} catch (error) { | ||||||||||||||||||||||
console.error("getPostsComments 함수에서 오류 발생:", error); | ||||||||||||||||||||||
throw error; | ||||||||||||||||||||||
} | ||||||||||||||||||||||
} | ||||||||||||||||||||||
|
||||||||||||||||||||||
// POST | ||||||||||||||||||||||
export async function postImages(formData: FormData, token: string) { | ||||||||||||||||||||||
try { | ||||||||||||||||||||||
const response = await instance.post("/images/upload", formData, { | ||||||||||||||||||||||
headers: { | ||||||||||||||||||||||
"Content-Type": "multipart/form-data", | ||||||||||||||||||||||
Authorization: `Bearer ${token}`, | ||||||||||||||||||||||
}, | ||||||||||||||||||||||
}); | ||||||||||||||||||||||
Comment on lines
+91
to
+95
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. 여기만
|
||||||||||||||||||||||
return response.data.url; | ||||||||||||||||||||||
} catch (error) { | ||||||||||||||||||||||
console.error("postImages 함수에서 오류 발생:", error); | ||||||||||||||||||||||
} | ||||||||||||||||||||||
} | ||||||||||||||||||||||
|
||||||||||||||||||||||
type PostData = { | ||||||||||||||||||||||
title: string; | ||||||||||||||||||||||
content: string; | ||||||||||||||||||||||
image?: string; | ||||||||||||||||||||||
}; | ||||||||||||||||||||||
|
||||||||||||||||||||||
export async function postArticles(postData: PostData, token: string) { | ||||||||||||||||||||||
try { | ||||||||||||||||||||||
const response = await instance.post("/articles", postData, { | ||||||||||||||||||||||
headers: { | ||||||||||||||||||||||
"Content-Type": "application/json", | ||||||||||||||||||||||
Authorization: `Bearer ${token}`, | ||||||||||||||||||||||
}, | ||||||||||||||||||||||
}); | ||||||||||||||||||||||
return response.data; | ||||||||||||||||||||||
} catch (error) { | ||||||||||||||||||||||
console.error("postArticles 함수에서 오류 발생:", error); | ||||||||||||||||||||||
} | ||||||||||||||||||||||
} | ||||||||||||||||||||||
|
||||||||||||||||||||||
export async function postArticleComments( | ||||||||||||||||||||||
articleId: string, | ||||||||||||||||||||||
content: string, | ||||||||||||||||||||||
token: string, | ||||||||||||||||||||||
) { | ||||||||||||||||||||||
try { | ||||||||||||||||||||||
await instance.post( | ||||||||||||||||||||||
`/articles/${articleId}/comments`, | ||||||||||||||||||||||
{ content }, | ||||||||||||||||||||||
{ | ||||||||||||||||||||||
headers: { | ||||||||||||||||||||||
Authorization: `Bearer ${token}`, | ||||||||||||||||||||||
}, | ||||||||||||||||||||||
}, | ||||||||||||||||||||||
); | ||||||||||||||||||||||
} catch (error) { | ||||||||||||||||||||||
console.error("postArticleComments 함수에서 오류 발생:", error); | ||||||||||||||||||||||
} | ||||||||||||||||||||||
Comment on lines
+137
to
+139
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. 오잉? 이렇게 되면 함수 반환타입이
|
} catch (error) { | |
console.error("postArticleComments 함수에서 오류 발생:", error); | |
} | |
} catch (error) { | |
console.error("postArticleComments 함수에서 오류 발생:", error); | |
throw error; | |
} |
만약 에러가 발생하면 컴포넌트에서 캐치하여 처리해야하지 않을까요?
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -21,21 +21,25 @@ export default function Header() { | |
|
||
useEffect(() => { | ||
const token = localStorage.getItem("accessToken"); | ||
setAccessToken(token); | ||
}, []); | ||
if (token) { | ||
setAccessToken(token); | ||
} | ||
}, [router.pathname]); | ||
Comment on lines
22
to
+27
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. 전에 로그인 후 바로 적용이 안 되는 이슈가 있어서 reload()를 썼었는데 의존성 배열에 router.pathname을 넣으면 바로 반영되도록 수정했습니다. 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 handleProfileClick = () => { | ||
setIsLogoutBoxVisible(!isLogoutBoxVisible); | ||
}; | ||
|
||
const logout = () => { | ||
localStorage.removeItem("accessToken"); | ||
localStorage.removeItem("refreshToken"); | ||
setAccessToken(null); | ||
setIsLogoutBoxVisible(false); | ||
router.push("/"); | ||
window.location.reload(); | ||
}; | ||
|
||
return ( | ||
<div className="fixed top-0 z-50 flex h-16 w-full items-center justify-between gap-4 bg-white px-[24px] py-0 lg:gap-12 lg:px-48 lg:py-4"> | ||
<div className="fixed top-0 z-50 flex h-16 w-full items-center justify-between gap-4 bg-white px-6 py-0 lg:gap-12 lg:px-12 lg:py-4"> | ||
<div className="flex items-center gap-4"> | ||
<div | ||
onClick={goToMain} | ||
|
@@ -55,18 +59,18 @@ export default function Header() { | |
<nav className="flex flex-row gap-2 text-lg font-bold md:gap-8"> | ||
<Link | ||
href="/boards" | ||
className={`hover:text-[--main] ${ | ||
className={`hover:text-main ${ | ||
pathName.includes("/boards") || pathName.includes("/addBoards") | ||
? "text-[--main]" | ||
? "text-blue-500" | ||
: "" | ||
}`} | ||
> | ||
자유게시판 | ||
</Link> | ||
<Link | ||
href="/items" | ||
className={`hover:text-[--main] ${ | ||
pathName === "/items" ? "text-[--main]" : "" | ||
className={`hover:text-main ${ | ||
pathName === "/items" ? "text-main" : "" | ||
}`} | ||
> | ||
중고마켓 | ||
|
@@ -85,11 +89,8 @@ export default function Header() { | |
/> | ||
)} | ||
{isLogoutBoxVisible && ( | ||
<div className="absolute right-5 top-14 z-50 rounded-lg bg-white px-4 py-2 shadow-md lg:right-12 lg:top-3"> | ||
<button | ||
className="text-gray-700 hover:text-[--main]" | ||
onClick={logout} | ||
> | ||
<div className="absolute right-5 top-14 z-50 rounded-lg bg-white px-4 py-2 shadow-md lg:right-12 lg:top-16"> | ||
<button className="text-gray-700 hover:text-main" onClick={logout}> | ||
로그아웃 | ||
</button> | ||
</div> | ||
|
@@ -98,7 +99,7 @@ export default function Header() { | |
<button | ||
id="btn_small" | ||
onClick={goToSignin} | ||
className="inline-flex h-[42px] w-[128px] cursor-pointer items-center justify-center rounded-[0.5rem] border-none bg-[--btn1] px-[0.5rem] py-[1.5rem] text-white hover:bg-[--btn2]" | ||
className="inline-flex cursor-pointer items-center justify-center rounded-md border-none bg-main px-6 py-2 text-white hover:bg-btn-2" | ||
> | ||
로그인 | ||
</button> | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,4 @@ | ||
import React from "react"; | ||
import React, { useMemo } from "react"; | ||
|
||
type PaginationProps = { | ||
currentPage: number; | ||
|
@@ -19,13 +19,10 @@ export default function Pagination({ | |
onPageChange(currentPage + 1); | ||
}; | ||
|
||
const pages = []; | ||
|
||
for (let i = 1; i <= totalPages; i++) { | ||
pages.push(i); | ||
} | ||
// console.log(pages); | ||
// console.log(currentPage, totalPages); | ||
const pages = useMemo( | ||
() => Array.from({ length: totalPages }, (_, i) => i + 1), | ||
[totalPages], | ||
); | ||
|
||
Comment on lines
+22
to
+25
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. 멘토님께서 저번 미션 때 메모이제이션을 추천해주셔서 처음으로 사용해봤습니다. 사실, 메모이제이션에 대해 깊이 이해하지는 못했고, 리액트도 아직 익숙하지 않아서 메모이제이션이 다소 어렵게 느껴졌습니다. 언제 사용하는 것이 좋을지 판단하는 것도 쉽지 않네요..ㅎㅎ.. 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. ㅎㅎㅎ 그쵸. 다음 아티클을 읽어보세요 !
|
||
return ( | ||
<div className="mt-8 flex items-center justify-center gap-4"> | ||
|
@@ -41,8 +38,8 @@ export default function Pagination({ | |
<div | ||
key={i} | ||
className={`flex h-10 w-10 cursor-pointer items-center justify-center rounded-full border border-gray-300 font-bold ${ | ||
currentPage === i ? "bg-[--btn1] text-white" : "" | ||
} hover:bg-[--btn1] hover:text-white`} | ||
currentPage === i ? "bg-btn-1 text-white" : "" | ||
} hover:bg-btn-1 hover:text-white`} | ||
onClick={() => onPageChange(i)} | ||
> | ||
{i} | ||
|
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.
굳굳 ! 훨신 깔끔해졌네요 😊
위와 같이
?
는 지워도 될 것으로 보여요 !