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

강원대 FE_허윤수 4주차 과제 STEP1 #26

Open
wants to merge 44 commits into
base: sugoring
Choose a base branch
from

Conversation

sugoring
Copy link

@sugoring sugoring commented Jul 17, 2024

멘토님 안녕하세요!

  • 0단계 PR 링크입니다.
  • STEP1을 진행하면서 어려운 점이 많아 질문을 남깁니다. 상품 상세 페이지 및 상품 결제하기 폼 구현이 1단계의 목표입니다.

피드백을 위해 시간을 내주셔서 감사합니다!


질문 사항

  1. 상품 옵션 데이터 출력 문제
  • 네트워크 탭에서 /v1/products/{productId}/options API 호출이 성공하고 데이터가 정상적으로 수신되는 것을 확인했습니다. @/components/features/ProductDetail/ProductOptions 컴포넌트의 로직을 살펴보았으나, API 응답 데이터를 화면에 렌더링하는 부분에서 문제가 발생하는 것으로 추측됩니다.
  • @/pages/ProductDetail에서 productDetailData?.detail로 데이터를 불러왔으나, productOptionsData의 경우 productOptionsData.options로 설정하려고 했을 때 타입에 맞지 않는다고 나옵니다. 여러 타입 정의를 다시 세워봤지만 정확한 방법을 모르겠습니다.
  1. 로딩 관련 문제
  • @/pages/ProductDetail에서 데이터를 기다리는 시간이 오래 걸립니다. 이를 개선할 수 있는 방법이 있을지 조언 부탁드립니다.
  1. 페이지 이동 관련 문제 해결하였습니다.
    상품 상세 페이지 (@/pages/ProductDetail)에서 주문 결제 페이지 (@/pages/Payment)로 이동하며, productId를 전달하는 과정에서 문제가 발생합니다.
    @/pages/ProductDetail에서 다음과 같이 설정하였으나, 메인 화면으로 돌아가는 현상이 발생합니다. 이 부분에서 어디가 잘못되었는지 조언 부탁드립니다.

1단계 - 상품 상세 페이지 & 상품 결제하기 폼 구현

  • UI 프레임워크: chakra-ui 또는 직접 구현한 UI 컴포넌트만 사용 (외부 라이브러리 사용 금지)

  • 폼 상태 관리: React 기본 기능 (form, ref, state)으로 폼 상태 관리 (외부 라이브러리 사용 금지)

  • 상품 상세 페이지 (@/pages/ProductDetail):

    • /components/features/Theme/ThemeGoodsSection 또는 /components/features/Home/GoodsRankingSection/List에서 상품 ID (productId)를 전달받아 페이지 이동
    • 유효하지 않은 productId일 경우 메인 페이지 (/)로 리다이렉트
    • 상품 정보 표시:
      • /v1/products/{productId}/detail API 호출하여 데이터 불러오기
        • 상품 ID (id)
        • 상품명 (name)
        • 이미지 URL (imageURL)
        • 브랜드 정보 (brand)
        • 기본 가격 (basicPrice)
    • 상품 옵션 선택:
      • /v1/products/{productId}/options API 호출하여 데이터 불러오기
        • 옵션 목록 (optionId, optionName, optionPrice, subOptions)
    • "나에게 선물하기" 버튼:
      • 로그인 상태: 주문 결제 페이지 (@/pages/Payment)로 이동하며, productId 전달
      • 비로그인 상태: 로그인 페이지 (@/pages/Login)로 이동
  • 상품 결제 페이지(@/pages/Payment):

    • "선물과 함께 보낼 메세지" 입력란
    • /v1/products/{productId}/detail API 호출하여 주문 상품 정보 표시 (이미지, 브랜드, 이름)
    • 결제 정보 입력 (현금영수증, 소득공제 등)
    • 최종 결제 금액 표시
    • "결제하기" 버튼 (클릭 시 "주문이 완료되었습니다" 알림)

yuni added 30 commits July 17, 2024 05:02
- 상세 요구사항은 각 단계에서 정리 할 예정
- API 응답 데이터 구조 변경에 따른 상품 상세 정보 접근 방식 수정 (productDetail.detail)
- 상품 및 옵션 정보 로딩 상태 및 에러 처리 로직 추가
- React Query 활용 방식 개선: 데이터 fetching 함수 분리 및 경로 함수 추가
- enabled 옵션 추가를 통해 productId 값 유효성 검사 후 쿼리 실행하여 불필요한 API 호출 방지
yuni added 12 commits July 17, 2024 21:46
- '@/components/common/Button'에서 가져온 커스텀 버튼 컴포넌트를 사용하여 결제 버튼 대체
- '@/components/common/Form/Input/UnderlineTextField'에서 가져온 커스텀 입력 필드 컴포넌트를 사용하여 영수증 번호 입력 필드 대체
- 결제 페이지 레이아웃을 2열 구조로 수정하여 선물 메시지 및 선물 내역을 좌측에, 결제 정보를 우측에 배치
- 각 섹션에 borderWidth, padding, borderRadius, background, boxShadow 스타일 적용
Copy link

@danmin20 danmin20 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 18 to 25
interface ProductDetail {
productDetailInfo: {
announcements: Announcement[];
};
productDescription: {
displayImage: string;
};
}

Choose a reason for hiding this comment

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

ProductDetailData 타입에 정의되어 있는 것들이랑 겹치는 것 같아요. 동일한 필드는 재활용할 수 있게 써보는 건 어떨까요? Pick을 써서 필드를 가져와 써도 좋을 것 같고요~

Choose a reason for hiding this comment

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

추가로, interface와 type을 혼용하신 이유가 있으실까요?

Comment on lines 20 to 23
const [message, setMessage] = useState('');
const [receipt, setReceipt] = useState(false);
const [receiptType, setReceiptType] = useState('personal');
const [receiptNumber, setReceiptNumber] = useState('');

Choose a reason for hiding this comment

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

입력 값들이 많은 화면이라면, form을 사용해보는 것도 좋을 것 같아요!

@danmin20
Copy link

컨플릭트 해결 후 직접 머지해주셔도 될 것 같아요~

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants