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

[장용한]Sprint7 #210

Conversation

jangyonghan
Copy link
Collaborator

요구사항

기본

  • 상품 상세 페이지 주소는 “/items/{productId}” 입니다.

  • response 로 받은 아래의 데이터로 화면을 구현합니다.
    => favoriteCount : 하트 개수
    => images : 상품 이미지
    => tags : 상품태그
    => name : 상품 이름
    => description : 상품 설명

  • 목록으로 돌아가기 버튼을 클릭하면 중고마켓 페이지 주소인 “/items” 으로 이동합니다

  • 문의하기에 내용을 입력하면 등록 버튼의 색상은 “3692FF”로 변합니다.

  • response 로 받은 아래의 데이터로 화면을 구현합니다
    => image : 작성자 이미지
    => nickname : 작성자 닉네임
    => content : 작성자가 남긴 문구
    => description : 상품 설명
    => updatedAt : 문의글 마지막 업데이트 시간

멘토에게

  • css 스타일은 시간상 적용하지 못했습니다..!
  • 기본적인 구현만 완료했는데 댓글을 가져오는 api를 제대로 가져온건지 피드백 부탁드립니다..!

DESKTOP-LJCO8JL\장용한 added 3 commits July 5, 2024 01:52
@jangyonghan jangyonghan requested a review from wlgns2223 July 5, 2024 11:06
@jangyonghan jangyonghan added 미완성🫠 죄송합니다.. 매운맛🔥 뒤는 없습니다. 그냥 필터 없이 말해주세요. 책임은 제가 집니다. labels Jul 5, 2024
@jangyonghan jangyonghan changed the title React 장용한 sprint7 [장용한]Sprint7 Jul 5, 2024
Copy link
Collaborator

Choose a reason for hiding this comment

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

itemList를 가져오기 위해서 컨텍스트에서 전역적으로 데이터 fetching을 하셨네요. fetching을 하는건 좋다고 생각하는데 App 파일보다 ProductDetail로 컨텍스트의 범위를 좁히는게 더 나을 것 같아요.
App 파일은 리액트 프로젝트가 시작될때 가장 먼저 실행되는 루트파일이라서 itemList가 필요없는 페이지에서도 데이터를 호출하고 들고있어야 해서 효율적이지 못하다고 생각합니다.

function DetailCard() {
const { id } = useParams();
const itemList = useContext(ItemContext);
const item = itemList.find((item) => item.id === parseInt(id));
Copy link
Collaborator

Choose a reason for hiding this comment

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

컨텍스트에 itemList를 저장해놓고 필터링을 하기보다 API문서에 있는대로 productId를 이용해 id를 가져오는 방법이 더 좋을 것 같아요.
아래의 API를 이용해 필요한 아이템 하나만 가져오세요
https://panda-market-api.vercel.app/docs/#/Product/RetrieveProduct

컨텍스트를 쓴것도 좋다고 한것은 그것도 요구사항을 어떻게든 만족시키는 방법이긴 하지만
정석적으로는 id값을 이용해 하나만 가져와야합니다. ㅎㅎ

Copy link
Collaborator

Choose a reason for hiding this comment

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

const fetchProduct = async (productId) => {
    // fetch product detail
    const response = await fetch(
      `https://panda-market-api.vercel.app/products/${productId}`
    );
    if (!response.ok) {
      throw new Error("제품을 불러오는데 실패했습니다");
    }
    const result = await response.json();
    return result;
  };

Comment on lines +13 to +18
<input
type="text"
value={inputValue}
onChange={handleInputChange}
placeholder="개인정보를 공유 및 요청하거나, 명예 훼손, 무단 광고, 불법 정보 유포시 모니터링 후 삭제될 수 있으며, 이에 대한 민형사상 책임은 게시자에게 있습니다."
/>
Copy link
Collaborator

Choose a reason for hiding this comment

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

댓글작성과 같이 긴 텍스트를 작성해야 할 경우 input 태그보다 textarea 태그를 이용하면 좀 더 요구사항에 맞다고 생각합니다. 한 예로 textarea는 입력인풋의 크기를 조절 할 수 있어 긴 문장을 유저가 한눈에 볼 수 있습니다.

Comment on lines +5 to +26
const timeSince = (date) => {
const now = new Date();
const updatedAt = new Date(date);
const seconds = Math.floor((now - updatedAt) / 1000);

let interval = Math.floor(seconds / 31536000);
if (interval > 1) return `${interval}년 전`;

interval = Math.floor(seconds / 2592000);
if (interval > 1) return `${interval}개월 전`;

interval = Math.floor(seconds / 86400);
if (interval > 1) return `${interval}일 전`;

interval = Math.floor(seconds / 3600);
if (interval > 1) return `${interval}시간 전`;

interval = Math.floor(seconds / 60);
if (interval > 1) return `${interval}분 전`;

return `${Math.floor(seconds)}초 전`;
};
Copy link
Collaborator

Choose a reason for hiding this comment

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

화면의 리렌더링과 관계없는 유틸성함수는 따로 빼주신 점 좋습니다 !!

Comment on lines +40 to +53
const { id } = useParams(); // URL에서 id 값을 가져옴
const [itemList, setItemList] = useState([]);

useEffect(() => {
const fetchAndProcessData = async () => {
try {
const data = await getComments(id);
setItemList(data.list);
} catch (error) {
console.error("데이터를 가져오지 못했습니다", error);
}
};
fetchAndProcessData();
}, [id]);
Copy link
Collaborator

Choose a reason for hiding this comment

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

이렇게 id를 기반으로 댓글을 가져올때 이렇게 하는것이 맞습니다 ~ !! ㅎㅎ
조금 더 도전해서 이 로직을 커스텀훅으로 분리해보는건 어떨까요?

@wlgns2223
Copy link
Collaborator

기본적인 구현만 완료했는데 댓글을 가져오는 api를 제대로 가져온건지 피드백 부탁드립니다..!
const path = `/products/${productId}/comments?`;
  const query = `limit=${limit}`;
  const response = await fetch(
    `https://panda-market-api.vercel.app${path}${query}`
  );

용한님이 하신 방법이 맞습니다 !
또 여기서 path,query 변수를 나누어서 보기좋게 만들어 주신것도 잘 하셨습니다 !

@wlgns2223
Copy link
Collaborator

끝까지 로직을 작성하려고 하신 노력이 보입니다 ! 수고하셨어요 !

@wlgns2223 wlgns2223 merged commit a73f735 into codeit-bootcamp-frontend:React-장용한 Jul 8, 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.

2 participants