Skip to content
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

[신승헌] sprint10 #632

Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
14ab44a
refactor: api 호출 함수 부분 useEffect 내부로 이동
AdamSeungheonShin Jun 4, 2024
c68a248
refactor: 검색 input 핸들러 함수에 불필요한 함수 호출 제거
AdamSeungheonShin Jun 4, 2024
a9c3fe8
refactor: 드롭다운 클릭 범위 수정, 포인터 옵션 수정
AdamSeungheonShin Jun 4, 2024
287eaaa
refactor: 인기게시물 조건부 렌더링 부분 수정
AdamSeungheonShin Jun 4, 2024
d35d413
refactor: 추상적인 타입명 구체적으로 수정
AdamSeungheonShin Jun 4, 2024
fedc2ae
refactor[pages/boards/index.tsx]: 불필요한 재할당 부분 삭제
AdamSeungheonShin Jun 4, 2024
e65364d
feat: SSG -> SSR 변경
AdamSeungheonShin Jun 5, 2024
096204e
feat: 초기 데이터 로딩 SSR로 변경
AdamSeungheonShin Jun 5, 2024
8ce5d26
feat: 게시글 작성 기본 ui 제작
AdamSeungheonShin Jun 6, 2024
cdd40ad
feat: 제목, 내용 작성 인풋 제작
AdamSeungheonShin Jun 6, 2024
e9e552d
feat: 파일인풋 제작, 새게시물 작성 폼 일부 수정, 타입선언 빠트린 부분 수정
AdamSeungheonShin Jun 6, 2024
1230632
feat: 파일인풋 이미지 미리보기, 이미지 삭제하기 기능 추가
AdamSeungheonShin Jun 6, 2024
ba764dd
feat: 파일인풋, 이미지인풋 css 작성
AdamSeungheonShin Jun 6, 2024
0a764eb
feat: 페이지 라우팅 Link 경로 수정
AdamSeungheonShin Jun 6, 2024
5137cb2
feat: 게시글 상세 페이지 기본 ui 작성
AdamSeungheonShin Jun 7, 2024
9941c08
feat: 게시글 상세 데이터 호출부 작성
AdamSeungheonShin Jun 7, 2024
f818ee2
feat: 게시글 상세 페이지 이미지 박스, 디폴트 이미지 추가
AdamSeungheonShin Jun 7, 2024
7826d77
refactor: 파일명 수정, 임포트한 파일 변수명 수정
AdamSeungheonShin Jun 7, 2024
e1211cc
refactor: 게시물 상세 이미지 잘림 오류 css 수정
AdamSeungheonShin Jun 7, 2024
369410b
feat: 댓글 리스트 컴포넌트 기본 ui 작성
AdamSeungheonShin Jun 7, 2024
1bfe187
feat: 댓글 api 호출 부분 작성, Type추가, props 지정
AdamSeungheonShin Jun 7, 2024
24601a3
feat: 지난 시간 카운트 유틸함수 작성
AdamSeungheonShin Jun 7, 2024
1e00784
feat: 댓글 등록버튼 추가, form태그로 수정 및 이벤트 함수 추가
AdamSeungheonShin Jun 7, 2024
9ebe7c8
feat: 댓글 등록 버튼 유효성 검사 옵션 추가
AdamSeungheonShin Jun 7, 2024
c3e8b44
feat: 게시글 작성 버튼 유효성 검사 옵션 추가
AdamSeungheonShin Jun 7, 2024
12a4711
feat: 게시글 작성 submit 함수 수정, post 함수 작성
AdamSeungheonShin Jun 7, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 29 additions & 17 deletions components/Boards/CommentList.tsx
Original file line number Diff line number Diff line change
@@ -1,23 +1,35 @@
import ProfileDefault from "@/public/images/profile_default.png";
import EmptyComments from "@/public/images/Img_reply_empty.png";
import { Comment } from "@/types";
import formatDate from "@/utils/formatDate";
import Image from "next/image";

export default function CommentList() {
export default function CommentList({ comments }: { comments: Comment[] }) {
return (
<div className="flex flex-col gap-6 mb-6">
<div>Content</div>
<div className="flex items-center gap-2">
<Image
src={ProfileDefault}
width={32}
height={32}
alt="댓글프로필이미지"
/>
<div>
<p className="text-gray-600">nickname</p>
<p className="text-gray-400">times ago</p>
</div>
</div>
<hr className="h-[1px] bg-gray-200" />
</div>
<>
{comments &&
comments.map((comment) => {
return (
<div className="flex flex-col gap-6 mb-6" key={comment.id}>
<div>{comment.content}</div>
<div className="flex items-center gap-2">
<Image
src={ProfileDefault}
width={32}
height={32}
alt="댓글프로필이미지"
/>
<div>
<p className="text-gray-600">{comment.writer.nickname}</p>
<p className="text-gray-400">
{formatDate(comment.updatedAt)}
</p>
</div>
</div>
<hr className="h-[1px] bg-gray-200" />
</div>
);
})}
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  {    comments?.map((comment) => (
            <div className="flex flex-col gap-6 mb-6" key={comment.id}>
              <div>{comment.content}</div>
              <div className="flex items-center gap-2">
                <Image
                  src={ProfileDefault}
                  width={32}
                  height={32}
                  alt="댓글프로필이미지"
                />
                <div>
                  <p className="text-gray-600">{comment.writer.nickname}</p>
                  <p className="text-gray-400">
                    {formatDate(comment.updatedAt)}
                  </p>
                </div>
              </div>
              <hr className="h-[1px] bg-gray-200" />
            </div>
          );
        )}

</>
);
}
25 changes: 20 additions & 5 deletions pages/boards/[id].tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,23 +7,38 @@ import Image from "next/image";
import Link from "next/link";
import instance from "@/lib/axios";
import { GetServerSidePropsContext } from "next";
import { Article } from "@/types";
import { Article, Comment } from "@/types";
import formatDate from "@/utils/formatDate";
import CommentList from "@/components/Boards/CommentList";

const COMMENTS_MAX = 5;

export async function getServerSideProps(context: GetServerSidePropsContext) {
const id = context.query.id;

const res = await instance.get(`/articles/${id}`);
const article = res.data ?? [];
const articlesRes = await instance.get(`/articles/${id}`);
const commentsRes = await instance.get(
`/articles/${id}/comments?limit=${COMMENTS_MAX}`
);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

위와같이 async함수에 여러개의 await구문이 들어간다면 해당 함수는 await구문마다 해당 비동기 함수가 끝날때까지 기다리게 됩니다.
이는 async함수 전체의 waterfall을 초래하게 되는데요
이는 모든 await함수의 결과가 나와야 async함수가 끝나기 때문에 성능적으로 좋지 않습니다.
모든 비동기 함수가 병렬적으로 실행될 수 있게 하려면 Promise.all을 활용해보시는걸 추천드립니다 ㅎ
Promise.all
Promise.allSettled


const article: Article = articlesRes.data ?? {};
const comments: Comment[] = commentsRes.data.list ?? [];

return {
props: {
article,
comments,
},
};
}

export default function Article({ article }: { article: Article }) {
export default function Article({
article,
comments,
}: {
article: Article;
comments: Comment[];
}) {
return (
<div className="flex flex-col gap-8">
<div className="flex flex-col gap-4">
Expand Down Expand Up @@ -83,7 +98,7 @@ export default function Article({ article }: { article: Article }) {
name="comment"
/>
</div>
<CommentList />
<CommentList comments={comments} />
<Link
className="w-60 h-12 bg-blue-default rounded-full flex justify-center items-center gap-2 mx-auto"
href="/boards"
Expand Down
16 changes: 15 additions & 1 deletion types/apiResponses.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,17 @@
export interface ResponseBody {
export interface ArticlesResponseBody {
list: [];
totalCount: number;
}

export interface CommentsResponseBody {
list: [];
nextCursor: number | null;
}

export interface Writer {
id: number;
nickname: string;
image: string | null;
}

export interface Article {
Expand All @@ -19,3 +25,11 @@ export interface Article {
writer: Writer;
isLiked: boolean;
}

export interface Comment {
id: number;
content: string;
createdAt: string;
updatedAt: string;
writer: Writer;
}