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

[김정현] Sprint12 #330

Conversation

kjh9852
Copy link
Collaborator

@kjh9852 kjh9852 commented Sep 30, 2024

요구사항

기본

중고마켓

  • ‘상품 등록하기’ 버튼을 누르면 “/additem” 로 이동합니다.
  • 각 상품 클릭 시 상품 상세 페이지로 이동합니다.
  • 상품 상세 페이지 주소는 “/items/{productId}” 입니다.

상품 상세

  • 내가 등록한 상품일 경우 상품 수정, 삭제가 가능합니다.
  • 문의하기 input창에 값을 입력 후 ‘등록’ 버튼을 누르면 댓글이 등록됩니다.
  • 내가 등록한 댓글은 수정, 삭제가 가능합니다.

상품 등록

  • 이미지를 제외하고 input 에 모든 값을 입력하면 ‘등록' 버튼이 활성화 됩니다.
  • 활성화된 ‘등록' 버튼을 누르면 상품 등록이 완료됩니다.
  • 등록이 완료되면 해당 상품 상세 페이지로 이동합니다.

주요 변경사항

  • react query로 아직 마이그레이션이 덜 되었습니다
  • 로그인 input하고 상품등록이나 댓글등록 input컴포넌트를 분리해 제작했습니다

스크린샷

멘토에게

  • 수정을 할 때 캐시가 남아있어서 바로 바로 상품의 value 값을 못 받아오는 것 같습니다. 빈 공간으로 보이거나 다른 상품의 input value 값이 보이는데 어떻게 해야 할까용??
  • 첫 렌더링 시 AllProduct 컴포넌트에 있는 if (itemList.length === 0) return <div>상품이 없습니다.</div>; 이 구문이 계속 보입니다 ㅠ
  • 이미지를 제외하고 input 에 모든 값을 입력하면 이 미션 내용인데 post를 보낼 시에 image도 required 값으로 되 있어서 오류가 나는데 이럴 때는 기본 값으로 어떻게 줘야 할까요??

@kjh9852 kjh9852 self-assigned this Sep 30, 2024
@kjh9852 kjh9852 added 매운맛🔥 뒤는 없습니다. 그냥 필터 없이 말해주세요. 책임은 제가 집니다. 미완성🫠 죄송합니다.. labels Sep 30, 2024
Copy link
Collaborator

@lisarnjs lisarnjs left a comment

Choose a reason for hiding this comment

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

  • 수정을 할 때 캐시가 남아있어서 바로 바로 상품의 value 값을 못 받아오는 것 같습니다. 빈 공간으로 보이거나 다른 상품의 input value 값이 보이는데 어떻게 해야 할까용??
  • 수정이 필요한 타이밍을 감지해서 refetch 해줘야 하는 타이밍을 지정해주시면 좋을 거 같아요!
  • 첫 렌더링 시 AllProduct 컴포넌트에 있는 if (itemList.length === 0) return
    상품이 없습니다.
    ; 이 구문이 계속 보입니다 ㅠ
  • itemList의 초기값이 어떻게 불러와지는지 확인해보세요! 빈 배열이 아닌데 처음에만 잠깐 빈 배열로 넘어오는거라면 임의적으로 시간 텀을 줘서 itemList가 제대로 부여된 뒤에 보여질 수 있도록 조작해주시면 됩니다 👍
  • 이미지를 제외하고 input 에 모든 값을 입력하면 이 미션 내용인데 post를 보낼 시에 image도 required 값으로 되 있어서 오류가 나는데 이럴 때는 기본 값으로 어떻게 줘야 할까요??
  • 필수값이라면 image로 넘겨줘야 하는 타입에 맞게 임의로 빈 스트링 혹은 빈 배열과 같은 초기값을 넘겨줘야해요!

정현님 미션까지 진행하시다니.. 완전 부지런하셔요 진짜!
마지막 파트까지 힘내서 달려봅시다!

const INITIAL_VALUES: FormInitialValues = {
imgFile: null,
title: "",
images: "",
Copy link
Collaborator

Choose a reason for hiding this comment

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

const INITIAL_VALUES: FormInitialValues = {
images: [], // 이 부분을 [] 빈 배열로 변경해보세요
name: "",
description: "",
price: "",
tags: [],
};

formValues?.images[0] 처럼 대부분의 Images는 배열로 값을 넣어주고 있어서 초기값 자체를 빈 배열로 해주면 좋을 거 같아요!

const submitActive: boolean =
title.trim() !== "" &&
name.trim() !== "" &&
description.trim() !== "" &&
price !== "" &&
Copy link
Collaborator

Choose a reason for hiding this comment

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

Number(price) > 0 이라는 조건을 추가해주면 가격이 - 일 경우를 방지할 수 있을 거 같아요 👍

}

export default function ErrorComponent({ message, isOpen }: ErrorType) {
const [fade, setFade] = useState({ fadeAnimation: "fadeIn" });
Copy link
Collaborator

Choose a reason for hiding this comment

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

이게 fadeAnimation 하나만 사용되는거라면 state 값을 단순 string으로 가져가는게 좋을거 같아보여요!

return () => clearTimeout(timer);
}, [isOpen, message]);

useEffect(() => {
Copy link
Collaborator

Choose a reason for hiding this comment

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

단순히 닫힐 때 fadeOut을 원하는 거라면 이 useEffect는 불필요할 거 같고 위에 쓰인 useEffect로 충분해보입니다!

export default function ErrorComponent({ message, isOpen }: ErrorType) {
const [fade, setFade] = useState({ fadeAnimation: "fadeIn" });

useEffect(() => {
Copy link
Collaborator

Choose a reason for hiding this comment

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

여기에 아래 코드를 추가해주면 isOpen이 빠르게 변화했을 때 예기치 못한 동작을 발생시킬 수 있는 걸 방지할 수 있을 것 같아요!
예상치 못하게 에니메이션이 겹치는 타이밍이 생길 수 있을 것 같아서요 👍

if (!isOpen) {
    setFade("fadeOut"); 
    return;
  }

onSuccess: (res) => {
setIsLoggedIn(true);
localStorage.setItem("userId", res.user.id);
localStorage.setItem("token", res.accessToken);
Copy link
Collaborator

Choose a reason for hiding this comment

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

이제 이 토큰을 보안상 httponly cookie에 저장할 수 있도록 해보세요! 혹은 로그인 유지 기능이 필요없다면 적어도 sessionStorage를 이용해보시는 것도 좋을 거 같구요!

const params = useParams();
const navigate = useNavigate();
const { data, isPending: getDataIsPending } = useQuery({
queryKey: ["products", params.productid],
Copy link
Collaborator

Choose a reason for hiding this comment

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

params.productid가 반복적으로 사용되는 것 같아요!
const productId = parseInt(params.productId, 10); 로 변수로 저장하고 재사용하시는 게 좋을거 같아용

{...(register ? register(name, rules) : {})}
/>
<div className={styles.visibleIcon} onClick={togglePasswordVisibility}>
{isPassword && hideBtn ? (
Copy link
Collaborator

Choose a reason for hiding this comment

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

isPassword && hideBtn && <img /> 로 사용하시는 것이 더 좋아보여요 :)

@lisarnjs lisarnjs merged commit cd74338 into codeit-bootcamp-frontend:React-김정현 Oct 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