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

실험실 - 다중 판매 문구 변경 #273

Open
wants to merge 3 commits into
base: main
Choose a base branch
from

Conversation

HoberMin
Copy link

@HoberMin HoberMin commented Jan 10, 2025

💡 기능

  • 실험실 다중 판매를 이용하는 과정에서, 실패하지 않았음에도 xx마리 판매 실패 라는 문구가 등장하며 사용자에게 혼란을 제공
  • 판매 성공 여부에 따라 등장 하는 문구를 조정 , 모두 실패했을 경우 판매액에 대한 정보를 제공하지 않음

🔎 기타

  • 판매 상태에 대한 다이얼로그가 화면에 떠있는 시간이 굉장히 짧음, 등장 타임을 조정 or 버튼을 통해 사용자가 직접 끌 수 있도록 조정

Summary by CodeRabbit

  • 새로운 기능
    • 반려동물 판매 결과를 표시하는 새로운 DropPetsResult 컴포넌트 추가
    • 판매 성공 및 실패에 대한 상세 정보를 사용자에게 직관적으로 보여줌
    • 판매 결과의 시각화 및 정보 제공 개선
    • 한국어 지원 추가: 판매 성공, 실패 및 총 판매 금액에 대한 메시지 번역
  • 문서화
    • 영어 및 한국어 메시지 파일에 새로운 키 추가 및 기존 키 수정

Copy link

coderabbitai bot commented Jan 10, 2025

워크스루

이 변경사항은 DropPetsResult라는 새로운 기능 컴포넌트를 도입하여 펫 판매 결과를 렌더링합니다. 컴포넌트는 성공적인 판매와 오류를 추적하고, 사용자에게 판매 결과를 명확하게 표시합니다. onSell 함수가 간소화되었으며, 결과 표시 로직이 별도의 컴포넌트로 캡슐화되었습니다.

변경 사항

파일 변경 요약
apps/web/src/app/[locale]/laboratory/property-pet-sell/page.tsx - DropPetsResult 컴포넌트 추가
- onSell 함수 리팩토링
- 결과 표시 로직 분리
apps/web/messages/en_US.json - "saleSuccess", "saleFail", "totalAmount" 키 추가
- "count" 키에 쉼표 추가
apps/web/messages/ko_KR.json - "title""description" 키 업데이트
- "saleSuccess", "saleFail", "totalAmount" 키 추가

가능한 관련 PR

제안된 라벨

area: Web, diff: L, area: UI

제안된 리뷰어

  • sumi-0011
  • hyesungoh

시퀀스 다이어그램

sequenceDiagram
    participant User
    participant OnSellFunction
    participant DropPetsResult
    
    User->>OnSellFunction: 펫 판매 요청
    OnSellFunction->>DropPetsResult: 성공/실패 결과 전달
    DropPetsResult-->>User: 판매 결과 표시
Loading

토끼의 시 🐰

펫들아, 안녕! 판매의 날
성공과 실패를 한눈에 보자
컴포넌트의 마법으로
깔끔하게 정리했네
코드의 춤, 토끼의 노래! 🎉


📜 Recent review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between c364cae and 251a443.

📒 Files selected for processing (1)
  • apps/web/src/app/[locale]/laboratory/property-pet-sell/page.tsx (2 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • apps/web/src/app/[locale]/laboratory/property-pet-sell/page.tsx

Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR. (Beta)
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 0afb443 and 65f6eee.

📒 Files selected for processing (1)
  • apps/web/src/app/[locale]/laboratory/property-pet-sell/page.tsx (2 hunks)

Comment on lines 51 to 89
const DropPetsResult = ({ success, errors }: { success: { givenPoint: number }[]; errors: unknown[] }) => {
const totalPrice = success.reduce((acc, curr) => acc + curr.givenPoint, 0);
const hasSuccess = success.length > 0;
const hasErrors = errors.length > 0;

if (hasSuccess && hasErrors) {
return (
<div>
<p>
{success.length}마리 판매 완료, {errors.length}마리 판매 실패
</p>
<p>총 판매 금액: {totalPrice}P</p>
</div>
);
}

if (hasSuccess) {
return (
<div>
<p>{success.length}마리 판매 완료</p>
<p>총 판매 금액: {totalPrice}P</p>
</div>
);
}

if (hasErrors) {
return (
<div>
<p>{errors.length}마리 판매 실패</p>
</div>
);
}

return (
<div>
<p>0마리 판매 완료, 0마리 판매 실패</p>
</div>
);
};
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

컴포넌트 개선이 필요합니다

다음과 같은 개선사항들이 있습니다:

  1. errors 배열의 타입 안전성이 보장되지 않습니다
  2. 다국어 지원이 누락되었습니다
  3. 가격 포맷팅이 누락되었습니다
  4. 중첩된 div/p 태그들의 접근성 개선이 필요합니다

다음과 같이 개선해보세요:

-const DropPetsResult = ({ success, errors }: { success: { givenPoint: number }[]; errors: unknown[] }) => {
+interface DropPetError {
+  message: string;
+  code: string;
+}
+
+const DropPetsResult = ({ success, errors }: { 
+  success: { givenPoint: number }[]; 
+  errors: DropPetError[] 
+}) => {
+  const t = useTranslations('Laboratory.property-pet-sell');
   const totalPrice = success.reduce((acc, curr) => acc + curr.givenPoint, 0);
   const hasSuccess = success.length > 0;
   const hasErrors = errors.length > 0;
+  
+  const formatPrice = (price: number) => {
+    return new Intl.NumberFormat('ko-KR').format(price);
+  };
+
+  const renderPrice = (price: number) => (
+    <p role="status" aria-label={t('total-amount')}>
+      {t('total-amount-text', { amount: formatPrice(price) })}
+    </p>
+  );

   if (hasSuccess && hasErrors) {
     return (
-      <div>
-        <p>
-          {success.length}마리 판매 완료, {errors.length}마리 판매 실패
-        </p>
-        <p>총 판매 금액: {totalPrice}P</p>
-      </div>
+      <div role="alert">
+        <p>{t('partial-success', { 
+          success: success.length, 
+          errors: errors.length 
+        })}</p>
+        {renderPrice(totalPrice)}
+      </div>
     );
   }
   // ... similar changes for other conditions

번역 키를 추가하세요:

// messages/ko.json
{
  "Laboratory": {
    "property-pet-sell": {
      "total-amount": "총 판매 금액",
      "total-amount-text": "총 판매 금액: {amount}P",
      "partial-success": "{success}마리 판매 완료, {errors}마리 판매 실패"
      // ... other translations
    }
  }
}

<p>총 판매 금액: {totalPrice}P</p>
</div>
),
description: <DropPetsResult success={res.success} errors={res.errors} />,
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

다이얼로그 개선이 필요합니다

다이얼로그에 다음과 같은 개선사항들이 있습니다:

  1. 다이얼로그 제목이 하드코딩되어 있습니다
  2. 판매 중 로딩 상태 표시가 없습니다
  3. API 호출 에러 처리가 누락되었습니다

다음과 같이 개선해보세요:

 const onSell = async (ids: string[]) => {
+  const t = useTranslations('Laboratory.property-pet-sell');
+  try {
+    showDialog({
+      title: t('selling-pets'),
+      description: t('selling-in-progress'),
+      showConfirmButton: false,
+    });
+
     const res = await dropPets({ personaIds: ids });
 
     trackEvent('laboratory', {
       type: '레벨, 타입 같은 펫 한번에 팔기',
     });
 
     queryClient.invalidateQueries({ queryKey: userQueries.allPersonasKey() });
 
     showDialog({
-      title: '펫 판매 완료',
+      title: t('sale-complete'),
       description: <DropPetsResult success={res.success} errors={res.errors} />,
     });
+  } catch (error) {
+    showDialog({
+      title: t('sale-error'),
+      description: t('sale-error-description'),
+    });
+  }
 };

Committable suggestion skipped: line range outside the PR's diff.

Copy link
Member

@hyesungoh hyesungoh left a comment

Choose a reason for hiding this comment

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

안녕하세요~ 기여해주셔서 감사합니다 👍

다만 버그 픽스가 아닌 경우, 이슈를 열어 의견을 먼저 여쭤봐주시면 좋을 거 같다고 생각해요!

왜냐하면 내부적인 로드맵상 PR을 닫거나, 의도가 공유되지 않을 수 있기 때문이에요

예를 들어 해당 실험실 기능을 삭제할 예정이였다면, 이번 작업에 사용하신 시간이 아까우니까요 😢


추가적으로 몇가지 마이너한 리뷰와 요청을 드렸는데, 의견 공유해주시면 감사드리겠습니다 !

감사합니다 ~!

Comment on lines 51 to 59
const DropPetsResult = ({ success, errors }: { success: { givenPoint: number }[]; errors: unknown[] }) => {
const totalPrice = success.reduce((acc, curr) => acc + curr.givenPoint, 0);
const hasSuccess = success.length > 0;
const hasErrors = errors.length > 0;

if (hasSuccess && hasErrors) {
return (
<div>
<p>
Copy link
Member

Choose a reason for hiding this comment

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

얼리 리턴을 적용하신 것은 저도 좋다고 생각해요!

하지만 순서를 바꾸면, totalPrice는 연산을 안해도 될 거 같기도 하네요 ~

읽기 좋은 순서와 연산에 대한 트레이드오프도 고려하셔서 반영해주시면 좋을 거 같은데, 의견이 궁금해요! 👍

Copy link
Author

Choose a reason for hiding this comment

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

남겨주신 코멘트 잘 봤습니다 !

항상 연산을 먼저하고 코드에 구현하는 습관이 있었던 것 같네요 ! 말씀해주신 내용에 대해 고민해봤고, 실제로 얼리 리턴을 적용한다면 연산을 하지 않을 수 있다는 장점이 있겠네요

감사합니다. 해당 내용은 잘 반영해두었습니다.

Comment on lines 62 to 73
<p>총 판매 금액: {totalPrice}P</p>
</div>
);
}

if (hasSuccess) {
return (
<div>
<p>{success.length}마리 판매 완료</p>
<p>총 판매 금액: {totalPrice}P</p>
</div>
);
Copy link
Member

Choose a reason for hiding this comment

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

코드를 보셔서 아시겠지만, 저희 서비스는 i18n 지원을 지향하고 있어요

해당 영역에 대한 기여도 부탁드려도 될까요? 🙏 🙏 🙏

Copy link
Author

Choose a reason for hiding this comment

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

i18n 지원을 적용해놓았습니다. !

'Laboratory.property-pet-sell'

해당 부분에 대한 한국어, 영어 지원을 변경해놓았습니다.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

♻️ Duplicate comments (1)
apps/web/src/app/[locale]/laboratory/property-pet-sell/page.tsx (1)

117-117: 🛠️ Refactor suggestion

다이얼로그 제목을 현지화해주세요.

다이얼로그 제목이 하드코딩되어 있습니다.

       showDialog({
-        title: '펫 판매 완료',
+        title: t('saleComplete'),
         description: <DropPetsResult success={res.success} errors={res.errors} />,
       });
🧹 Nitpick comments (3)
apps/web/messages/en_US.json (1)

144-147: 영문 번역의 대소문자를 일관되게 수정해주세요.

현재 번역:

  • "sale success" -> 소문자
  • "sale fail" -> 소문자
  • "Total Amount" -> 대문자

모든 메시지의 첫 글자는 대문자로 통일하는 것이 좋습니다.

-      "saleSuccess": "sale success",
-      "saleFail": "sale fail",
+      "saleSuccess": "Sale success",
+      "saleFail": "Sale fail",
       "totalAmount": "Total Amount"
apps/web/src/app/[locale]/laboratory/property-pet-sell/page.tsx (2)

76-76: 가격 포맷팅이 필요합니다.

금액을 표시할 때 천 단위 구분자를 사용하면 가독성이 향상됩니다.

+      const formatPrice = (price: number) => {
+        return new Intl.NumberFormat('ko-KR').format(price);
+      };
+
       const totalPrice = success.reduce((acc, curr) => acc + curr.givenPoint, 0);
       
       // ... 사용시
-              {t('totalAmount')}: {totalPrice}P
+              {t('totalAmount')}: {formatPrice(totalPrice)}P

Also applies to: 86-87, 99-101


57-61: 접근성 개선이 필요합니다.

결과를 표시하는 div에 적절한 ARIA 속성이 없습니다.

-          <div>
+          <div role="alert" aria-live="polite">

Also applies to: 67-73, 80-89, 93-102

📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 65f6eee and c364cae.

📒 Files selected for processing (3)
  • apps/web/messages/en_US.json (1 hunks)
  • apps/web/messages/ko_KR.json (1 hunks)
  • apps/web/src/app/[locale]/laboratory/property-pet-sell/page.tsx (2 hunks)
🔇 Additional comments (2)
apps/web/messages/ko_KR.json (1)

144-149: 번역이 명확하고 일관성이 있습니다!

판매 상태 메시지에 대한 번역이 사용자 친화적이며 PR의 목적에 잘 부합합니다.

apps/web/src/app/[locale]/laboratory/property-pet-sell/page.tsx (1)

52-54: 🛠️ Refactor suggestion

타입 안전성 개선이 필요합니다.

errors 배열의 타입이 unknown[]으로 되어있어 타입 안전성이 보장되지 않습니다.

-    const DropPetsResult = ({ success, errors }: { success: { givenPoint: number }[]; errors: unknown[] }) => {
+    interface DropPetError {
+      message: string;
+      code: string;
+    }
+
+    const DropPetsResult = ({ success, errors }: { 
+      success: { givenPoint: number }[]; 
+      errors: DropPetError[] 
+    }) => {

Likely invalid or redundant comment.

@HoberMin
Copy link
Author

갑자기 PR이 올라와 당황하셨을 것 같습니다.

git animals를 사용하고 있던 과정에서 기여를 하고싶다는 마음에 이슈를 먼저 올려야겠다는 생각을 차마 하지 못한 것 같습니다 🥲
당황하셨을텐데도, 실제로 리뷰와 코멘트 남겨주셔서 해당 부분에 대한 수정을 진행해두었습니다.

혹시나 추가적인 개선이 필요하다면 코멘트 남겨주세요. 감사합니다.

Comment on lines 68 to 71
<p>
{errors.length}
{t('count')} {t('saleFail')}
</p>
Copy link
Member

Choose a reason for hiding this comment

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

const errorCount = error.length;
const  = t('count');
const 실패 = t('saleFail');

...
return <p>{errorCount}{} {실패}</p>

이런 형태는 어떻게 생각하시나요?

  • errorLength

    • 현재는 단순히 배열의 길이로 판단하고 있지만, 이후 API 스펙이 변경되어 성공 객체의 특정 프로퍼티 기준으로 분기를 나눠야할 경우 대처가 쉬워진다고 생각하고 && 미약하지만 매번 프로토타입 체이닝을 하는 것보다 성능상 우위를 가질 수 있어요
  • const 개 = t('count');

    • 읽기 좋은 코드에 가까워진다고도 생각이 들며, 위와 마찬가지로 매번 접근하는 것보다 성능상 우위가 있다고 생각해요

단순히 제 생각뿐이며, 의견 부탁드려요 ~ 👍

Copy link
Author

Choose a reason for hiding this comment

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

코드 가독성면에서 고려를 하지 못했네요 ,, 성능적인 부분에 있어서는 우위가 있다는걸 처음알게 되었습니다. !
덕분에 많은 내용을 배우고 있습니다. 감사합니다.

해당 부분은 count saleSuccess saleFail totalAmount네가지로 변수 선언해서 재사용했습니다. 👍

Copy link
Member

@hyesungoh hyesungoh Jan 13, 2025

Choose a reason for hiding this comment

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

작업해주셔서 제가 더 감사드리죠! 👍

추가적으로 궁금한 점이, 제가 영어에 약해서 그런지 몰라도 count 중 읽기 자연스러운 건 라고 생각이 드는데요

저보다 더 많이 고민해보셨을, 작업자 분께서 영어로 네이밍하신 이유가 궁금해요!

Copy link
Author

Choose a reason for hiding this comment

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

변수명을 한글로 선언하는게 습관이 안되어있어서 라고 남겨주셨음에도 count를 선택했습니다. 혹시 코드컨벤션이나 이런것들을 고려했을 때 라는 변수명을 사용하는것이 더 직관적이실까요??

Copy link
Member

Choose a reason for hiding this comment

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

제가 읽었을 때에는 한글이 더 읽기 쉬운데, 이 부분은 작업자분께서 판단해주세요 ~

일단 어푸루부 남길게요
작업 완료하시면 댓글 부탁드려요 👍

Copy link
Author

Choose a reason for hiding this comment

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

의도했던 작업은 모두 완료된 것 같습니다 👍
혹시, 또 다른 이슈를 발견하면 이슈에 남기고 기여를 요청드려도 괜찮을까요 ??
현재 기여를 계속 받을 계획이 있으신지에 대해 알려주신다면 감사하겠습니다.

Copy link
Author

Choose a reason for hiding this comment

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

@hyesungoh 혹시 추가작업 필요한게 있을까요 ??

Copy link
Member

Choose a reason for hiding this comment

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

아 제가 정신이 없어서 요즘, 이제야 봤네요 ㅎ

네 추가 기여는 너무 감사드리죠!

현재 PR에서 추가 작업이 필요해 보이는 건 없고, @sumi-0011 님이 확인해주신 후 머지 부탁드려요!

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