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

Feat/356 #369

Merged
merged 12 commits into from
Jun 18, 2024
Merged

Feat/356 #369

merged 12 commits into from
Jun 18, 2024

Conversation

devkyoung2
Copy link
Member

#️⃣연관된 이슈

close: #356

📝작업 내용

  • 장바구니 조회 api 연동
  • 선택된 상품데이터 정보만 결제페이지로 이동하는 로직 구현

🙏리뷰 요구사항(선택)

  • 구현하다보니 체크박스로 결제할 상품의 상태관리가 프론트가 아니라 백에서 관리되어야 할 것 같아요. 그래서 선택된 상품을 관리하는 로직이 아마 사라질 수 있을 것 같아요

@devkyoung2 devkyoung2 self-assigned this Jun 18, 2024
Copy link

vercel bot commented Jun 18, 2024

The latest updates on your projects. Learn more about Vercel for Git ↗︎

Name Status Preview Comments Updated (UTC)
kakao-funding ✅ Ready (Inspect) Visit Preview 💬 Add feedback Jun 18, 2024 10:14am

Copy link
Contributor

@uraflower uraflower 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 71 to 108
{isFetched && (
<>
<Header />
<section className={styles.area_cart}>
<MainWrapper>
<div className={styles.wrapper_cart}>
<div className={styles.wrapper_cart_box}>
<CartBoxHeader isItemInCart={isItemInCart} />
{isItemInCart ? (
<ul className={styles.wrapper_item}>
{cartItems!.map((item) => (
<li key={item.cartId}>
<CartBoxItem
item={item}
handleSelect={handleSelect}
isSelected={selectedItems.some(
(selectedItem) =>
selectedItem.productId === item.productId,
)}
/>
</li>
))}
</ul>
) : (
<EmptyCartBoxBody />
)}
<CartBoxFooter isItemInCart={isItemInCart} />
</div>
<CartPay
selectedItems={selectedItems}
totalPayment={totalPayment}
/>
</div>
</MainWrapper>
</section>
</>
)}
{isLoading && <Spinner />}
Copy link
Contributor

@uraflower uraflower Jun 18, 2024

Choose a reason for hiding this comment

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

엘리먼트 구조를 단순하게 표현하면 이런 식인 것 같은데요.

{isFetched && (
  <>
    <Header />
    <section />
  </>
)}
{isLoading && <Spinner />}

보시면 로딩 중일 때에는 헤더가 나타나지 않도록 되어 있습니다.
저는 로딩 중이어서 스피너가 돌아갈 때에도 헤더가 나타나는 게 좋다고 생각해요. 헤더가 없으면 페이지가 지연되는 것처럼 보이거나 일관되지 않는 경험을 줄 것 같아서요.
그래서 헤더를 바깥으로 빼는 건 어떨까요..? 아래처럼요.

<>
  <Header />
  {isFetched && <section />}
  {isLoading && <Spinner />}
</>

Copy link
Member Author

Choose a reason for hiding this comment

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

좋은 의견 같아요! 반영했습니다. 52fdfe6

Comment on lines +36 to +48
setSelectedItems((prevSelectedItems) => {
if (prevSelectedItems.some((item) => item.productId === productId)) {
return prevSelectedItems.filter((item) => item.productId !== productId);
}

const selectedItem = cartItems!.find(
(item) => item.productId === productId,
);

return selectedItem
? [...prevSelectedItems, selectedItem]
: prevSelectedItems;
});
Copy link
Contributor

Choose a reason for hiding this comment

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

아이템 선택/선택해제가 되었을 때를 다루고 있는데, 서로 다른 케이스가 섞여 있는 것 같아요.
예를 들면 37~39줄은 이미 선택했던 아이템을 선택 해제하는 경우이고, 그 이후 줄에서는 아이템을 새롭게 선택하는 경우를 다루고 있어요.
그래서 코드를 읽을 때 하나하나 뜯어봐야 이해가 되는 느낌이에요.
각 케이스에 주석을 달아주면 이해하기 더 쉬울 것 같습니다!

Copy link
Member Author

Choose a reason for hiding this comment

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

맞아요 이미 선택된 아이템을 체크하는 과정과 선택되어있지 않은 아이템을 체크하는 두가지를 한번에 다루는 함수라 헷갈릴 수 있겠네요... 근데 api가 변경된다면 사라질 코드라서 일단 따로 수정하지는 않겠습니다..!

Comment on lines +41 to +47
const selectedItem = cartItems!.find(
(item) => item.productId === productId,
);

return selectedItem
? [...prevSelectedItems, selectedItem]
: prevSelectedItems;
Copy link
Contributor

Choose a reason for hiding this comment

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

cartItems는 장바구니에 등록된 상품 목록을 나타내고, selectedItem은 그 목록 중에 선택된 상품을 나타내는 것 같습니다. 그래서 find()의 결과가 항상 truthy할 것 같은데, 반환부를 보니까 selectedItem이 falsy 값인 경우도 처리해주고 있습니다.

find()했을 때 조건에 맞는 아이템을 찾지 못하는 경우가 있는 건가요?
아니면 혹시 몰라서 falsy 값인 경우도 처리해주신 건가요?
제가 코드를 잘못 이해했을까봐 여쭤봅니다!

Copy link
Member Author

Choose a reason for hiding this comment

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

혹시몰라서 falsy 값을 처리해주긴 했어요 왜냐면 delete 요청을 보냈을때 두개의 상태가 별개로 관리되니까 혹시나 데이터가 꼬일까봐요.... 근데 오늘 회의때 아예 api 수정요청을 드리는것이 나을것 같아요. 그때 되면 selectedItem 상태가 사라져서 사라지는 코드가 되지 않을까 싶습니다...! 이부분은 추후 수정하겠습니다.

Copy link
Contributor

@ohgus ohgus left a comment

Choose a reason for hiding this comment

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

고생하셨습니다!

queryFn: () => getCartItems(),
});

const isItemInCart = cartItems ? cartItems.length > 0 : false;
Copy link
Contributor

Choose a reason for hiding this comment

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

배열이 null, undefined이거나 빈배열인지 검사하는 건가요?

Copy link
Member Author

Choose a reason for hiding this comment

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

상품이 없는 경우라면 헤더푸터가 노란색이미지가 아니라 회색 이미지로 변경되어야 하니까 배열의 길이를 통해 상품이 있는지 없는지 확인하기위한 변수입니다!

@@ -32,6 +32,22 @@ const Cart = () => {

const isItemInCart = cartItems ? cartItems.length > 0 : false;

const handleSelect = (productId: number) => {
setSelectedItems((prevSelectedItems) => {
if (prevSelectedItems.some((item) => item.productId === productId)) {
Copy link
Contributor

Choose a reason for hiding this comment

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

처음 보는 메서드인데 배워갑니다!

@devkyoung2 devkyoung2 merged commit 32b8bf0 into dev Jun 18, 2024
3 checks passed
@devkyoung2 devkyoung2 deleted the feat/356 branch June 18, 2024 10:27
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.

장바구니 조회 API 연동
3 participants