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

[박소현] week19 #556

Conversation

ParkSohyunee
Copy link
Collaborator

요구사항

기본

  • [프로젝트 전반] https://bootcamp-api.codeit.kr/docs/linkbrary/v1 문서를 참고해 https://bootcamp-api.codeit.kr/api/linkbrary/v1 api를 활용했나요?
  • [프로젝트 전반] api 요청에 TanStack React Query를 활용했나요?
  • [로그인, 회원가입 페이지] 로그인은 POST ‘/auth/sign-in’ 을 활용했나요?
  • [로그인, 회원가입 페이지] 회원가입은 POST ‘/auth/sign-up’ 을 활용했나요?
  • [로그인, 회원가입 페이지] 이메일 중복확인은 POST ‘/users/check-email’ 을 활용했나요?
  • [링크 공유 페이지] 폴더의 정보는 GET ‘/folders/{folderId}’, 폴더 소유자의 정보는 GET ‘/users/{userId}’를 활용했나요?
  • [링크 공유 페이지] 폴더의 링크 데이터는 GET ‘/folders/{folderId}/links’ 를 활용했나요?
  • [링크 공유 페이지] 유효한 access token이 있는 경우 GET ‘/users’ 로 현재 로그인한 유저 정보를 받아 상단 네비게이션 유저 프로필을 보여 주나요?
  • [링크 공유 페이지] 유효한 access token이 없는 경우 “로그인” 버튼을 보여 주나요?
  • [폴더 페이지] 폴더 페이지에서 현재 유저의 폴더 목록 데이터는 GET ‘/folders’ 를 활용했나요?
  • [폴더 페이지] 폴더 페이지에서 전체 링크 데이터를 받아올 때 GET ‘/links’, 특정 폴더의 링크를 받아올 때 GET ‘/folders/{folderId}/links’를 활용했나요?
  • [모달] 폴더 이름 변경은 ‘PUT /folders/{folderId}’를 활용했나요?
  • [모달] 폴더 생성은 ‘POST /folders’를 활용했나요?
  • [모달] 폴더 삭제는 ‘DELETE /folders/{folderId}’를 활용했나요?
  • [모달] 링크 삭제는 ‘DELETE /links/{linkId}’를 활용했나요?
  • [모달] 링크 생성은 ‘POST /links’를 활용했나요?

주요 변경사항

  • 변경된 api 적용
  • week13 과제 요구사항 완료
  • SWR 사용
    • (참고) 기존에 swr로 적용했어서 리액트쿼리로 변경하지 않았습니다.

멘토에게

  • 멘토님, 그동안 상세하게 과제 확인 해주셔서 감사합니다. 덕분에 part3동안 많이 배웠습니다.😊
  • 셀프 코드 리뷰를 통해 질문 이어가겠습니다.

@ParkSohyunee ParkSohyunee self-assigned this Jan 14, 2024
@ParkSohyunee ParkSohyunee added the 매운맛🔥 뒤는 없습니다. 그냥 필터 없이 말해주세요. 책임은 제가 집니다. label Jan 14, 2024
Copy link
Collaborator

@hongjw030 hongjw030 left a comment

Choose a reason for hiding this comment

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

허허 저희팀 플젝은 끝났지만 그래두 소현님 코드는 못참지~!!!!! 궁금해서 보러왔는데 역시 넘 멋지시네용... 👀👀👀🙌 오늘도 배워갑니당 ㅋㅋㅋㅋ !!!

Comment on lines +1 to +9
export interface LinkData {
id: number;
title: string;
url: string;
description: string;
favorite: boolean;
created_at: string;
image_source: string;
}
Copy link
Collaborator

Choose a reason for hiding this comment

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

혹시 이렇게 하면 에러 안 나시나요???
저는 제가 직접 링크 하나 추가하고 보니까 link에 대한 img source랑 description이 없어서 에러가 떴었거든요,
그래서 id랑 url, created at 속성 빼고 다 ? 붙여서 옵셔널로 만들었던... ㅠㅠ

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

@hongjw030

재원님 저는 타입에러는 없었는데요, 링크 중에 이미지 소스가 있지만 이미지를 불러오지 못하는경우(404 에러)가 있어서 이때는 Image 컴포넌트에 onError 콜백함수로 대체 이미지를 주었습니다! (오늘 커밋 추가했습니당 ㅎㅎ)
description이 없는 경우는 아직 없었는데 혹시 테스트해보신 url 공유해주시면 저도 테스트 한번 해보겠습니다!

Copy link
Collaborator

Choose a reason for hiding this comment

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

저도 아무 url이나 추가하다 우연히 넣고 알게된건데... https://www.google.com 링크 추가하시면 image source도 description도 없어서 에러가 나더라구요!!
image

Comment on lines +1 to +12
import { LinkData } from "@/types/link";

export const checkMatchedAllLinks = (keyword: string, links: LinkData[]) => {
const filteredLinks = links.filter((link) => {
return (
(link.title && link.title.includes(keyword)) ||
(link.description && link.description.includes(keyword)) ||
(link.url && link.url.includes(keyword))
);
});
return filteredLinks;
};
Copy link
Collaborator

Choose a reason for hiding this comment

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

오~!!! 이거 좋은 생각이네염 항상 느끼건데 소현님은 코드랑 파일 정리 넘 깔끔하게 잘하시는거 같아요, 부럽부럽....

Copy link
Collaborator

Choose a reason for hiding this comment

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

왕.... 코드 진짜루 깔끔 그잡채... ㅋㅋ ㅠㅠ 오늘도 배워갑니당 허허

@ParkSohyunee
Copy link
Collaborator Author

ParkSohyunee commented Jan 15, 2024

허허 저희팀 플젝은 끝났지만 그래두 소현님 코드는 못참지~!!!!! 궁금해서 보러왔는데 역시 넘 멋지시네용... 👀👀👀🙌 오늘도 배워갑니당 ㅋㅋㅋㅋ !!!

과제에서 재원님 보니 더 반갑네요😋 프로젝트 기억이 새록새록 ㅎㅎ
수정해야 할 부분이 너무 많은데.. 좋은 피드백 주시고, 시간내서 리뷰 해주셔서 감사합니다!!!

Comment on lines +1 to +6
import type { StorybookConfig } from "@storybook/nextjs";

const config: StorybookConfig = {
stories: ["../src/**/*.mdx", "../src/**/*.stories.@(js|jsx|mjs|ts|tsx)"],
addons: [
"@storybook/addon-links",
Copy link
Collaborator Author

@ParkSohyunee ParkSohyunee Jan 17, 2024

Choose a reason for hiding this comment

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

@kimjngyun

📌 멘토님, 이번주 스토리북 수강하면서 실습을 과제에서 하느라 요구사항 외 코드가 추가되었는데요,
이와 관련된 .storybook폴더 / components/story 폴더, src/stories 폴더는 스토리북 공부한 코드입니다!(리뷰x)
참고 부탁드립니다. 😆

Copy link
Collaborator

@kimjngyun kimjngyun left a comment

Choose a reason for hiding this comment

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

소현님 고생 많으셨습니다! 팀장님 덕분에 파트3 저도 많이 도움받은 것 같아요. 감사합니다 😊
마지막까지 파이팅입니다! 🔥🔥🔥

const [accessToken, setAccessToken] = useState<string | null>();
const [folderName, setFolderName] = useState("");

const fetcher = async (url: string, name: string) => {
Copy link
Collaborator

Choose a reason for hiding this comment

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

여기서 POST 요청 후에 재검증이 필요한 값이 없나요?

import { DOMAIN_URL } from "@/common/constants";
import { SubmitFormData } from "@/types/form";

const headers = { "Content-Type": "application/json; charset=utf-8" };
Copy link
Collaborator

Choose a reason for hiding this comment

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

자주 쓰이는 header들을 const 파일에 두고 쓰면 좋을 것 같아요.

Comment on lines +12 to +13
"@tanstack/react-query": "^5.17.9",
"@tanstack/react-query-devtools": "^5.17.9",
Copy link
Collaborator

Choose a reason for hiding this comment

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

react-query가 사용되지는 않는것 같은데 추가하신 이유가 있을까요?

@@ -51,7 +50,7 @@ export default function FolderUI(props: FolderUIProps) {
)}
<S.MenuContainer>
<Categories
categories={[DEFAULT, ...props.folderNames]}
categories={["전체", ...props.folderNames]}
Copy link
Collaborator

Choose a reason for hiding this comment

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

혹시 상수에서 이렇게 다시 바꿔주신 이유가 있을까요?

{!isLoading && links.length === 0 ? (
<S.Blank>저장된 링크가 없습니다</S.Blank>
) : (
<CardList links={filteredLinks} />
Copy link
Collaborator

Choose a reason for hiding this comment

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

filteredLinks를 state로 두지 않는 것이 조금 더 괜찮을 것 같습니다.

Suggested change
<CardList links={filteredLinks} />
<CardList links={checkMatchedAllLinks(keyword, links)} />

alt="link"
className={cardStyle}
fill
onError={handleImageError}
Copy link
Collaborator

Choose a reason for hiding this comment

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

Image 컴포넌트에 이런 기능도 있었군요! 👍

export default function DeleteFolder({ selectedItem, linkId, label, onClose }: DeleteFolderProps) {
const router = useRouter();
const folderId = router.query.id;
const [accessToken, setAccessToken] = useState<string | null>();
Copy link
Collaborator

Choose a reason for hiding this comment

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

accessToken을 로컬스토리지에서 가져오기 위해 useEffect를 활용한 로직이 모달 컴포넌트에 공통되는데 훅으로 만들어쓰면 좋을 것 같아요!

const router = useRouter();
const folderId = router.query.id;

const [accessToken, setAccessToken] = useState<string | null>();
Copy link
Collaborator

Choose a reason for hiding this comment

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

👀

export default function AddLink({ link }: AddLinkProps) {
const { folderNameList } = useContext(FolderContext);
export default function AddLink({ link, onClose }: AddLinkProps) {
const [accessToken, setAccessToken] = useState<string | null>();
Copy link
Collaborator

Choose a reason for hiding this comment

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

👀

});

export function FolderContextProvider({ children }: Props) {
const DEFAULT = "전체";
Copy link
Collaborator

Choose a reason for hiding this comment

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

위에서 언급한 코멘트랑 관련하여 DEFAULT 값을 따로 빼서 공유하면 좋을 것 같아요!

@kimjngyun kimjngyun merged commit dc87338 into codeit-bootcamp-frontend:part3-박소현 Jan 17, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
매운맛🔥 뒤는 없습니다. 그냥 필터 없이 말해주세요. 책임은 제가 집니다.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants