Skip to content

Conversation

@minkyung5x5
Copy link
Contributor

@minkyung5x5 minkyung5x5 commented Nov 20, 2024

πŸ”– Issue Ticket

Ticket

✍️ Description

  • 약속 μΉ΄λ“œ ui μˆ˜μ •
  • νƒ­ ui μˆ˜μ •
  • detail modal ui μˆ˜μ •

βœ… Checklist

PR

  • Branch Convention 확인

    feat/ 피쳐, fix/ 버그 μˆ˜μ •, refactor/ κ°œμ„ 

  • Base Branch 확인
  • μ μ ˆν•œ Label μ§€μ •
  • Assignee 및 Reviewer μ§€μ •

Test

  • 둜컬 μž‘λ™ 확인

Summary by CodeRabbit

  • μƒˆλ‘œμš΄ κΈ°λŠ₯

    • λͺ¨μž„ 상세 λͺ¨λ‹¬μ˜ μ°Έκ°€μž μ•„μ΄μ½˜ λ³€κ²½ 및 λ‚ μ§œ, μ‹œκ°„ ν‘œμ‹œ 방식 κ°œμ„ .
    • "약속 곡지사항" 헀더 μΆ”κ°€ 및 μ°Έκ°€μž 수 κ°•μ‘°.
    • "λ‚΄κ°€ μ°Έμ—¬ν•œ 약속" 및 "λ‚΄κ°€ λ§Œλ“  약속"으둜 νƒ­ λ ˆμ΄λΈ” λ³€κ²½.
    • λͺ¨μž„ μΉ΄λ“œμ— μœ„μΉ˜ 정보 μΆ”κ°€.
  • 버그 μˆ˜μ •

    • μ—†μŒ.
  • λ¬Έμ„œν™”

    • μ—†μŒ.
  • μŠ€νƒ€μΌ

    • λ ˆμ΄μ•„μ›ƒ 및 μŠ€νƒ€μΌ μ‘°μ •μœΌλ‘œ μ‚¬μš©μž κ²½ν—˜ κ°œμ„ .
  • λ¦¬νŒ©ν† λ§

    • JSX ꡬ쑰 λ‹¨μˆœν™” 및 μ½”λ“œ 정리.

@coderabbitai
Copy link

coderabbitai bot commented Nov 20, 2024

Walkthrough

이번 λ³€κ²½ 사항은 μ—¬λŸ¬ μ»΄ν¬λ„ŒνŠΈμ˜ UI 및 ꡬ쑰λ₯Ό κ°œμ„ ν•˜λŠ” 데 쀑점을 두고 μžˆμŠ΅λ‹ˆλ‹€. GatheringDetailModalPresenterμ—μ„œ μ°Έκ°€μž μ•„μ΄μ½˜μ„ λ³€κ²½ν•˜κ³  λ‚ μ§œ 및 μ‹œκ°„ ν‘œμ‹œ 방식을 κ°„μ†Œν™”ν•˜μ˜€μœΌλ©°, MyCrewLayout, FavoritePage, MyGatheringLayout λ“±μ—μ„œ λ ˆμ΄μ•„μ›ƒ 및 μŠ€νƒ€μΌμ„ μ‘°μ •ν•˜μ—¬ μ‹œκ°μ  계측을 κ°•ν™”ν–ˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ, formatDate ν•¨μˆ˜μ˜ λ°˜ν™˜ ꡬ쑰λ₯Ό μˆ˜μ •ν•˜κ³ , μ—¬λŸ¬ μ»΄ν¬λ„ŒνŠΈμ—μ„œ μƒˆλ‘œμš΄ location 속성을 μΆ”κ°€ν•˜μ—¬ 데이터 ꡬ쑰λ₯Ό κ°œμ„ ν–ˆμŠ΅λ‹ˆλ‹€.

Changes

파일 경둜 λ³€κ²½ μš”μ•½
src/app/(crew)/crew/detail/[id]/_components/gathering-detail-modal/presenter.tsx μ°Έκ°€μž μ•„μ΄μ½˜μ„ IcoUserμ—μ„œ IcoPerson으둜 λ³€κ²½, λ‚ μ§œ 및 μ‹œκ°„ ν‘œμ‹œλ₯Ό <hgroup>μ—μ„œ <div>둜 μ „ν™˜, μ†Œκ°œ μ„Ήμ…˜μ— 헀더 μΆ”κ°€ 및 λ²„νŠΌ λ ˆμ΄λΈ” ν˜„μ§€ν™”.
src/app/(crew)/my-crew/layout.tsx μ™ΈλΆ€ <div> 클래슀 λ³€κ²½, μƒˆλ‘œμš΄ 제λͺ© <div> μΆ”κ°€ 및 ν•˜μœ„ μ»¨ν…Œμ΄λ„ˆμ˜ λ§ˆμ§„ μ‘°μ •.
src/app/(crew)/my-favorite/page.tsx μ™ΈλΆ€ <div> 클래슀 λ³€κ²½, μƒˆλ‘œμš΄ 제λͺ© <div> μΆ”κ°€.
src/app/(crew)/my-gathering/_component/gathering-list-with-date.tsx getDayOfWeek ν•¨μˆ˜ 제거, formatDate ν•¨μˆ˜λ‘œ μš”μΌ ν‘œμ‹œ 둜직 λ³€κ²½.
src/app/(crew)/my-gathering/layout.tsx νƒ­ λ ˆμ΄λΈ” μ—…λ°μ΄νŠΈ, 메인 μ»¨ν…Œμ΄λ„ˆμ˜ νŒ¨λ”© μ‘°μ • 및 μƒˆλ‘œμš΄ 제λͺ© <div> μΆ”κ°€.
src/app/(crew)/my-page/_components/review-tabs.tsx Tabs μ»΄ν¬λ„ŒνŠΈμ˜ JSX ꡬ쑰 κ°„μ†Œν™”.
src/components/common/gathering-card/presenter.tsx formatDate ν•¨μˆ˜μ˜ 좜λ ₯에 dayOfWeek μΆ”κ°€, λ‚ μ§œ ν‘œμ‹œ 둜직 μ—…λ°μ΄νŠΈ.
src/components/common/gathering-card/scheduled-gathering-card/presenter.tsx data prop νƒ€μž… μ—…λ°μ΄νŠΈ 및 λ‚ μ§œ 및 μš”μΌ κ²°ν•©ν•˜μ—¬ ν‘œμ‹œ.
src/components/common/gathering-card/scheduled-gathering-card/scheduled-gathering.stories.tsx 두 μŠ€ν† λ¦¬μ— location 속성 μΆ”κ°€.
src/components/common/tab/index.tsx Tabs μ»΄ν¬λ„ŒνŠΈμ˜ μŠ€νƒ€μΌ 및 λ ˆμ΄μ•„μ›ƒ κ°„μ†Œν™”.
src/components/gathering-list/liked-list-presenter.tsx μ™ΈλΆ€ <div>μ—μ„œ px-4 클래슀 제거.
src/types/gathering-data.d.ts GatheringCardProps μΈν„°νŽ˜μ΄μŠ€μ— location 속성 μΆ”κ°€.
src/utils/format-date.ts formatDate ν•¨μˆ˜ μˆ˜μ •ν•˜μ—¬ dayOfWeek μΆ”κ°€ 및 getDayOfWeek ν•¨μˆ˜ 제거.

Possibly related PRs

Suggested labels

design, components

Suggested reviewers

  • yulrang
  • HaeJungg

🐰 λ³€ν™”μ˜ 기쁨을 λ…Έλž˜ν•΄μš”,
λͺ¨μž„μ˜ 세상 λ”μš± λΉ›λ‚˜μ£ .
μ•„μ΄μ½˜κ³Ό λ‚ μ§œκ°€ μƒˆλ‘œμ›Œ,
우리 크루와 ν•¨κ»˜ν•΄μš”!
μ•½μ†μ˜ μˆœκ°„μ„ μ¦κ²¨λ΄μš”! 🌟

Warning

There were issues while running some tools. Please review the errors and either fix the tool’s configuration or disable the tool if it’s a critical failure.

πŸ”§ eslint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

src/app/(crew)/crew/detail/[id]/_components/gathering-detail-modal/presenter.tsx

Oops! Something went wrong! :(

ESLint: 8.57.1

ESLint couldn't determine the plugin "react-hooks" uniquely.

  • /node_modules/eslint-plugin-react-hooks/index.js (loaded in ".eslintrc.js")
  • /node_modules/eslint-config-next/node_modules/eslint-plugin-react-hooks/index.js (loaded in ".eslintrc.js Β» eslint-config-next/core-web-vitals Β» /node_modules/eslint-config-next/index.js Β» plugin:react-hooks/recommended")

Please remove the "plugins" setting from either config or remove either plugin installation.

If you still can't figure out the problem, please stop by https://eslint.org/chat/help to chat with the team.


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 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.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

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.

@github-actions
Copy link

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

🧹 Outside diff range and nitpick comments (15)
src/app/(crew)/my-favorite/page.tsx (1)

5-7: μ ‘κ·Όμ„± κ°œμ„ μ΄ ν•„μš”ν•œ λ ˆμ΄μ•„μ›ƒ λ³€κ²½μ‚¬ν•­μž…λ‹ˆλ‹€.

λ ˆμ΄μ•„μ›ƒ 변경사항이 μ „λ°˜μ μœΌλ‘œ 잘 κ΅¬ν˜„λ˜μ—ˆμŠ΅λ‹ˆλ‹€. λ°˜μ‘ν˜• λ””μžμΈμ„ μœ„ν•œ νŒ¨λ”©κ°’ μ‘°μ •κ³Ό ν™”λ©΄ 크기별 헀더 ν‘œμ‹œκ°€ μ μ ˆν•©λ‹ˆλ‹€.

λ‹€λ§Œ, μ ‘κ·Όμ„± ν–₯상을 μœ„ν•΄ λ‹€μŒκ³Ό 같은 κ°œμ„ μ„ μ œμ•ˆλ“œλ¦½λ‹ˆλ‹€:

-      <div className="hidden pb-10 text-3xl font-bold md:block">μ°œν•œ 약속</div>
+      <h1 className="hidden pb-10 text-3xl font-bold md:block">μ°œν•œ 약속</h1>

μ΄λŠ” λ‹€μŒκ³Ό 같은 이점이 μžˆμŠ΅λ‹ˆλ‹€:

  • μ‹œλ§¨ν‹± HTML을 ν†΅ν•œ μ›Ή μ ‘κ·Όμ„± ν–₯상
  • 슀크린 리더 μ‚¬μš©μžλ₯Ό μœ„ν•œ νŽ˜μ΄μ§€ ꡬ쑰 λͺ…ν™•ν™”
  • SEO μ΅œμ ν™”μ— 도움
src/utils/format-date.ts (1)

19-20: λ°˜ν™˜ ꡬ쑰 κ°œμ„ μ΄ 잘 μ΄λ£¨μ–΄μ‘ŒμŠ΅λ‹ˆλ‹€.

λ‚ μ§œμ™€ μš”μΌμ„ λΆ„λ¦¬ν•˜μ—¬ λ°˜ν™˜ν•˜λŠ” ꡬ쑰둜 λ³€κ²½ν•¨μœΌλ‘œμ¨ μ»΄ν¬λ„ŒνŠΈμ—μ„œ 더 μœ μ—°ν•˜κ²Œ μ‚¬μš©ν•  수 있게 λ˜μ—ˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” UI κ΅¬μ„±μ˜ μžμœ λ„λ₯Ό 높이고 μž¬μ‚¬μš©μ„±μ„ ν–₯μƒμ‹œν‚€λŠ” 쒋은 λ³€κ²½μ‚¬ν•­μž…λ‹ˆλ‹€.

μ΄λŸ¬ν•œ κ΅¬μ‘°λŠ” λ‹€μŒκ³Ό 같은 이점이 μžˆμŠ΅λ‹ˆλ‹€:

  • μ»΄ν¬λ„ŒνŠΈμ—μ„œ λ‚ μ§œμ™€ μš”μΌμ„ λ…λ¦½μ μœΌλ‘œ μŠ€νƒ€μΌλ§ κ°€λŠ₯
  • κ΅­μ œν™”(i18n) 적용 μ‹œ 더 μš©μ΄ν•œ ꡬ쑰
  • 데이터 ꡬ쑰의 λͺ…ν™•μ„± ν–₯상
src/components/common/tab/index.tsx (2)

28-28: μ‚¬μš©μž κ²½ν—˜ κ°œμ„ μ„ μœ„ν•œ μ œμ•ˆ

νƒ­μ˜ μƒν˜Έμž‘μš©μ„±μ„ 높이기 μœ„ν•΄ λ‹€μŒκ³Ό 같은 κ°œμ„ μ‚¬ν•­μ„ κ³ λ €ν•΄λ³΄μ„Έμš”:

- className={`${baseStyle} ${isActive ? 'bg-blue-500 text-white' : 'bg-white text-blue-500'}`}
+ className={`${baseStyle} ${
+   isActive 
+     ? 'bg-blue-500 text-white' 
+     : 'bg-white text-blue-500 hover:bg-blue-50 transition-colors'
+ }`}

Also applies to: 39-39


34-40: μ ‘κ·Όμ„± κ°œμ„ μ„ μœ„ν•œ μ œμ•ˆ

슀크린 리더 μ‚¬μš©μžλ₯Ό μœ„ν•΄ aria-label 속성을 μΆ”κ°€ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

 <button
   key={tab.id}
   role="tab"
   type="button"
   aria-selected={isActive}
+  aria-label={`${tab.label} νƒ­ ${isActive ? '선택됨' : ''}`}
   onClick={() => onTabClick(tab.id)}
   className={`${baseStyle} ${isActive ? 'bg-blue-500 text-white' : 'bg-white text-blue-500'}`}
 >
src/app/(crew)/my-gathering/layout.tsx (1)

32-33: λ ˆμ΄μ•„μ›ƒ ꡬ쑰가 κ°œμ„ λ˜μ—ˆμŠ΅λ‹ˆλ‹€λ§Œ, μ ‘κ·Όμ„± κ³ λ €κ°€ ν•„μš”ν•©λ‹ˆλ‹€.

λ°˜μ‘ν˜• λ””μžμΈμ΄ 잘 κ΅¬ν˜„λ˜μ—ˆμœΌλ‚˜, λ‹€μŒ 사항듀을 κ³ λ €ν•΄λ³΄μ‹œκΈ° λ°”λžλ‹ˆλ‹€:

  1. λͺ¨λ°”μΌμ—μ„œ μˆ¨κ²¨μ§„ 제λͺ©μ— λŒ€ν•œ λŒ€μ²΄ ν…μŠ€νŠΈλ‚˜ μš”μ†Œκ°€ ν•„μš”ν•  수 μžˆμŠ΅λ‹ˆλ‹€
  2. κ΅¬λΆ„μ„ μ˜ μ‹œλ§¨ν‹±ν•œ 의미λ₯Ό κ°•ν™”ν•˜κΈ° μœ„ν•΄ <hr /> νƒœκ·Έ μ‚¬μš©μ„ κ³ λ €ν•΄λ³΄μ„Έμš”

λ‹€μŒκ³Ό 같이 μˆ˜μ •ν•΄λ³΄μ‹œλŠ” 것은 μ–΄λ–¨κΉŒμš”?

-      <div className="hidden pb-6 text-3xl font-bold text-gray-900 md:block">λ‚˜μ˜ 약속</div>
+      <h1 className="sr-only md:not-sr-only md:pb-6 md:text-3xl md:font-bold md:text-gray-900">λ‚˜μ˜ 약속</h1>
       <Tabs
         variant="default"
         tabs={myGatheringTabs}
         activeTab={currentTab}
         onTabClick={(id) => handleTabClick(id)}
       />
-      <div className="mt-10 hidden w-full border-t-2 border-gray-200 md:block" />
+      <hr className="mt-10 hidden w-full border-t-2 border-gray-200 md:block" />

Also applies to: 40-40

src/app/(crew)/my-crew/layout.tsx (1)

29-36: νƒ­ μ»΄ν¬λ„ŒνŠΈ κ΅¬ν˜„μ— λŒ€ν•œ μ œμ•ˆ

νƒ­ μ»΄ν¬λ„ŒνŠΈμ˜ κ΅¬ν˜„μ€ 잘 λ˜μ–΄μžˆμ§€λ§Œ, μ ‘κ·Όμ„± ν–₯상을 μœ„ν•œ κ°œμ„ μ΄ ν•„μš”ν•΄ λ³΄μž…λ‹ˆλ‹€.

λ‹€μŒκ³Ό 같은 κ°œμ„ μ‚¬ν•­μ„ μ œμ•ˆλ“œλ¦½λ‹ˆλ‹€:

 <Tabs
   variant="default"
   tabs={myCrewTabs}
   activeTab={currentTab}
+  aria-label="λ‚΄ 크루 λ„€λΉ„κ²Œμ΄μ…˜"
   onTabClick={(id) => {
     handleTabClick(id);
   }}
 />
src/app/(crew)/my-gathering/_component/gathering-list-with-date.tsx (2)

Line range hint 13-21: νƒ€μž… μ•ˆμ „μ„±κ³Ό λ¬Έμ„œν™” κ°œμ„ μ΄ ν•„μš”ν•©λ‹ˆλ‹€.

useMemo μ΅œμ ν™”λŠ” 잘 λ˜μ–΄μžˆμ§€λ§Œ, λ‹€μŒ 사항듀을 κ°œμ„ ν•˜λ©΄ 쒋을 것 κ°™μŠ΅λ‹ˆλ‹€:

  1. λ‚ μ§œ 비ꡐ λ‘œμ§μ— λŒ€ν•œ νƒ€μž… μ•ˆμ „μ„± κ°•ν™”
  2. isNewDate 계산 λ‘œμ§μ— λŒ€ν•œ 주석 μΆ”κ°€

λ‹€μŒκ³Ό 같이 κ°œμ„ ν•΄λ³΄μ„Έμš”:

  const gatheringListWithDateInfo = useMemo(() => {
+   // 각 λͺ¨μž„λ³„λ‘œ 이전 λͺ¨μž„κ³Ό λ‚ μ§œκ°€ λ‹€λ₯Έ 경우 μƒˆλ‘œμš΄ λ‚ μ§œλ‘œ ν‘œμ‹œ
    return gatheringList.map((gathering, index) => {
+     const currentDate = formatDate(gathering.dateTime).date;
+     const previousDate = index > 0 
+       ? formatDate(gatheringList[index - 1].dateTime).date 
+       : null;
      const isNewDate =
-       index === 0 ||
-       formatDate(gathering.dateTime).date !== formatDate(gatheringList[index - 1].dateTime).date;
+       index === 0 || currentDate !== previousDate;
      return { ...gathering, isNewDate };
    });
  }, [gatheringList]);

Line range hint 23-44: μ ‘κ·Όμ„±κ³Ό μ‹œλ§¨ν‹± λ§ˆν¬μ—… κ°œμ„ μ΄ ν•„μš”ν•©λ‹ˆλ‹€.

λ ˆμ΄μ•„μ›ƒ κ΅¬μ‘°λŠ” 잘 λ˜μ–΄μžˆμ§€λ§Œ, λ‹€μŒκ³Ό 같은 μ ‘κ·Όμ„± κ°œμ„ μ‚¬ν•­λ“€μ„ κ³ λ €ν•΄λ³΄μ„Έμš”:

  1. λ‚ μ§œ ꡬ뢄선에 λŒ€ν•œ μŠ€ν¬λ¦°λ¦¬λ” 지원
  2. μ‹œλ§¨ν‹± HTML μš”μ†Œ ν™œμš©

λ‹€μŒκ³Ό 같이 κ°œμ„ ν•΄λ³΄μ„Έμš”:

- <div>
+ <section aria-label="λͺ¨μž„ λͺ©λ‘">
    {gatheringListWithDateInfo.map((gathering) => (
-     <div key={gathering.id} className="md:flex">
+     <article key={gathering.id} className="md:flex">
        <div className="w-1/6">
          {gathering.isNewDate && (
-           <div className="hidden flex-nowrap md:block">
+           <header className="hidden flex-nowrap md:block">
-             <div className="text-lg font-semibold">
+             <time className="text-lg font-semibold" dateTime={gathering.dateTime}>
                {formatDate(gathering.dateTime).date}
-             </div>
+             </time>
              <div className="text-base font-medium text-gray-500">
                {formatDate(gathering.dateTime).dayOfWeek}
              </div>
-           </div>
+           </header>
          )}
        </div>
-       <div className={`${gathering.isNewDate && 'mt-3.5'} relative -mb-3.5 w-0.5 bg-gray-200`}>
+       <div 
+         className={`${gathering.isNewDate && 'mt-3.5'} relative -mb-3.5 w-0.5 bg-gray-200`}
+         role="separator"
+         aria-hidden="true"
+       >
          {gathering.isNewDate && <div className="md:corner-dot" />}
        </div>
        <div className="flex-1 pb-6 md:pl-8">
          <ScheduledGatheringCard key={gathering.id} data={gathering} />
        </div>
-     </div>
+     </article>
    ))}
- </div>
+ </section>
src/components/gathering-list/liked-list-presenter.tsx (1)

Line range hint 41-61: νŽ˜μ΄μ§€λ„€μ΄μ…˜ μŠ€νƒ€μΌ μΆ”μΆœ μ œμ•ˆ

νŽ˜μ΄μ§€λ„€μ΄μ…˜ μŠ€νƒ€μΌμ΄ μ»΄ν¬λ„ŒνŠΈ 내뢀에 직접 μ •μ˜λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. μž¬μ‚¬μš©μ„±μ„ μœ„ν•΄ λ³„λ„μ˜ μƒμˆ˜λ‚˜ μœ ν‹Έλ¦¬ν‹°λ‘œ λΆ„λ¦¬ν•˜λŠ” 것을 κ³ λ €ν•΄λ³΄μ„Έμš”.

λ‹€μŒκ³Ό 같이 μŠ€νƒ€μΌμ„ 뢄리할 수 μžˆμŠ΅λ‹ˆλ‹€:

// constants/styles/pagination.ts
export const PAGINATION_STYLES = {
  classNames: {
    control: cn(
      'data-[active="true"]:text-blue-500 data-[active="true"]:font-bold',
      'border-none bg-transparent hover:bg-transparent',
    ),
  },
  styles: {
    control: {
      '&[data-active]': {
        backgroundColor: 'transparent',
        fontWeight: 'var(--pagination-active-font-weight)',
        color: 'var(--pagination-active-color)',
        boxShadow: 'none',
      },
    },
  },
};
src/components/common/gathering-card/scheduled-gathering-card/presenter.tsx (1)

17-17: 데이터 ꡬ쑰 변경에 λŒ€ν•œ 주석 μΆ”κ°€λ₯Ό μ œμ•ˆλ“œλ¦½λ‹ˆλ‹€.

location ν•„λ“œλ‘œμ˜ 톡합과 dayOfWeek 좔가와 같은 데이터 ꡬ쑰 변경사항에 λŒ€ν•œ μ„€λͺ…을 μ£Όμ„μœΌλ‘œ μΆ”κ°€ν•˜λ©΄ 쒋을 것 κ°™μŠ΅λ‹ˆλ‹€.

+ // location: μ΄μ „μ˜ crewMainLocationκ³Ό crewSubLocation이 ν†΅ν•©λœ ν•„λ“œ
+ // dateTime: YYYY-MM-DD HH:mm:ss ν˜•μ‹μ˜ λ‚ μ§œ λ¬Έμžμ—΄
const { crewTitle, title, dateTime, location, currentCount, totalCount, imageUrl } = data;

Also applies to: 19-19

src/components/common/gathering-card/presenter.tsx (3)

Line range hint 11-24: Props μΈν„°νŽ˜μ΄μŠ€μ— JSDoc λ¬Έμ„œν™” μΆ”κ°€ ν•„μš”

각 prop의 λͺ©μ κ³Ό μ‚¬μš©λ²•μ„ λͺ…ν™•ν•˜κ²Œ 이해할 수 μžˆλ„λ‘ JSDoc λ¬Έμ„œν™”λ₯Ό μΆ”κ°€ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. 특히 isWithin24Hours와 deadlineMessage와 같은 μƒˆλ‘œμš΄ props의 경우 λ¬Έμ„œν™”κ°€ λ”μš± μ€‘μš”ν•©λ‹ˆλ‹€.

μ˜ˆμ‹œ:

 export interface GatheringCardPresenterProps {
+  /** λͺ¨μž„ 고유 μ‹λ³„μž */
   id: number;
+  /** λͺ¨μž„ λŒ€ν‘œ 이미지 URL */
   imageUrl: string;
+  /** λͺ¨μž„ 제λͺ© */
   title: string;
+  /** λͺ¨μž„ λ‚ μ§œ 및 μ‹œκ°„ (ISO λ¬Έμžμ—΄) */
   dateTime: string;
+  /** λͺ¨μž„ μž₯μ†Œ */
   location: string;
+  /** ν˜„μž¬ μ°Έμ—¬μž 수 */
   currentCount: number;
+  /** 총 μ°Έμ—¬ κ°€λŠ₯ 인원 */
   totalCount: number;
+  /** μ’‹μ•„μš” μƒνƒœ */
   isLiked: boolean;
+  /** μ’‹μ•„μš” ν† κΈ€ ν•Έλ“€λŸ¬ */
   onLikeToggle: () => void;
+  /** μΉ΄λ“œ 클릭 ν•Έλ“€λŸ¬ */
   onClick: () => void;
+  /** μ§€λ‚œ λͺ¨μž„ μ—¬λΆ€ */
   isPast: boolean;
+  /** 24μ‹œκ°„ 이내 마감 μ—¬λΆ€ */
   isWithin24Hours?: boolean;
+  /** 마감 μž„λ°• μ‹œ ν‘œμ‹œν•  λ©”μ‹œμ§€ */
   deadlineMessage?: string;
   className?: string;
 }

44-44: λ‚ μ§œ μ •λ³΄μ˜ μ ‘κ·Όμ„± κ°œμ„  ν•„μš”

슀크린 리더 μ‚¬μš©μžλ₯Ό μœ„ν•΄ λ‚ μ§œ 정보에 μ μ ˆν•œ ARIA λ ˆμ΄λΈ”μ„ μΆ”κ°€ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

-              {`${date} ${dayOfWeek}`}
+              <span aria-label={`λͺ¨μž„ λ‚ μ§œ: ${date} ${dayOfWeek}`}>
+                {`${date} ${dayOfWeek}`}
+              </span>

Also applies to: 80-84


Line range hint 52-63: λͺ¨λ°”일 ν™˜κ²½ μ΅œμ ν™” κ²€ν†  ν•„μš”

ν˜„μž¬ μΉ΄λ“œμ˜ 높이가 κ³ μ •κ°’(h-[344px])으둜 μ„€μ •λ˜μ–΄ μžˆμ–΄ λͺ¨λ°”일 κΈ°κΈ°μ—μ„œ μ½˜ν…μΈ κ°€ 잘릴 수 μžˆμŠ΅λ‹ˆλ‹€. λ°˜μ‘ν˜• λ””μžμΈμ„ μœ„ν•΄ λ‹€μŒκ³Ό 같은 κ°œμ„ μ„ κ³ λ €ν•΄λ³΄μ„Έμš”:

-        'relative h-[344px] w-full overflow-hidden rounded-lg border-white bg-white shadow-sm',
+        'relative min-h-[344px] w-full overflow-hidden rounded-lg border-white bg-white shadow-sm',
+        'md:h-[344px]',
         isPast ? 'pointer-events-none cursor-default' : 'cursor-pointer',
src/app/(crew)/crew/detail/[id]/_components/gathering-detail-modal/presenter.tsx (2)

63-71: λ‚ μ§œ/μ‹œκ°„ ν‘œμ‹œ κ°œμ„ μ΄ 잘 λ˜μ—ˆμŠ΅λ‹ˆλ‹€!

λ‚ μ§œμ™€ μš”μΌμ„ ν†΅ν•©ν•˜κ³  μ‹œκ°„μ„ κ΅¬λΆ„μ„ μœΌλ‘œ λΆ„λ¦¬ν•œ λ ˆμ΄μ•„μ›ƒμ΄ 가독성을 λ†’μ—¬μ€λ‹ˆλ‹€. λ‹€λ§Œ, μ ‘κ·Όμ„± ν–₯상을 μœ„ν•œ μž‘μ€ μ œμ•ˆμ΄ μžˆμŠ΅λ‹ˆλ‹€.

μ‹œκ°„ 정보에 λŒ€ν•œ 슀크린 리더 지원을 μœ„ν•΄ λ‹€μŒκ³Ό 같이 μˆ˜μ •ν•˜λŠ” 것을 κ³ λ €ν•΄λ³΄μ„Έμš”:

-<p className="overflow-hidden text-ellipsis whitespace-nowrap text-base font-semibold text-blue-500">
+<p className="overflow-hidden text-ellipsis whitespace-nowrap text-base font-semibold text-blue-500" aria-label={`λͺ¨μž„ μ‹œκ°„: ${formatDate(data?.dateTime).time}`}>
   {formatDate(data?.dateTime).time}
 </p>

82-87: μ°Έμ—¬μž μ„Ήμ…˜ UI κ°œμ„ μ΄ νš¨κ³Όμ μž…λ‹ˆλ‹€!

ν˜„μž¬ μ°Έμ—¬μž 수λ₯Ό κ°•μ‘°ν•˜κ³  전체 ꡬ쑰λ₯Ό κ°œμ„ ν•œ 것이 μ’‹μŠ΅λ‹ˆλ‹€. λ‹€λ§Œ, μ„±λŠ₯ μ΅œμ ν™”λ₯Ό μœ„ν•œ μ œμ•ˆμ‚¬ν•­μ΄ μžˆμŠ΅λ‹ˆλ‹€.

μ°Έκ°€μž λͺ©λ‘μ΄ λ§Žμ„ 경우λ₯Ό λŒ€λΉ„ν•˜μ—¬ λ‹€μŒκ³Ό 같은 μ΅œμ ν™”λ₯Ό κ³ λ €ν•΄λ³΄μ„Έμš”:

-<ScrollArea h={152}>
+<ScrollArea h={152} type="always" scrollbarSize={6}>
   <ul className="grid grid-cols-2 gap-4">
-    {data?.participants.map((participant) => (
+    {data?.participants.slice(0, 20).map((participant) => (
πŸ“œ Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

πŸ“₯ Commits

Reviewing files that changed from the base of the PR and between a16dc81 and addb265.

πŸ“’ Files selected for processing (13)
  • src/app/(crew)/crew/detail/[id]/_components/gathering-detail-modal/presenter.tsx (4 hunks)
  • src/app/(crew)/my-crew/layout.tsx (1 hunks)
  • src/app/(crew)/my-favorite/page.tsx (1 hunks)
  • src/app/(crew)/my-gathering/_component/gathering-list-with-date.tsx (2 hunks)
  • src/app/(crew)/my-gathering/layout.tsx (2 hunks)
  • src/app/(crew)/my-page/_components/review-tabs.tsx (1 hunks)
  • src/components/common/gathering-card/presenter.tsx (2 hunks)
  • src/components/common/gathering-card/scheduled-gathering-card/presenter.tsx (1 hunks)
  • src/components/common/gathering-card/scheduled-gathering-card/scheduled-gathering.stories.tsx (2 hunks)
  • src/components/common/tab/index.tsx (2 hunks)
  • src/components/gathering-list/liked-list-presenter.tsx (1 hunks)
  • src/types/gathering-data.d.ts (1 hunks)
  • src/utils/format-date.ts (1 hunks)
βœ… Files skipped from review due to trivial changes (1)
  • src/app/(crew)/my-page/_components/review-tabs.tsx
πŸ”‡ Additional comments (16)
src/components/common/tab/index.tsx (1)

25-25: μŠ€νƒ€μΌ λ‹¨μˆœν™”κ°€ 잘 λ˜μ—ˆμŠ΅λ‹ˆλ‹€!

λ°˜μ‘ν˜• λ””μžμΈκ³Ό μΌκ΄€λœ μŠ€νƒ€μΌλ§μ΄ 잘 μ μš©λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

src/app/(crew)/my-gathering/layout.tsx (1)

8-9: νƒ­ λ ˆμ΄λΈ” κ°œμ„ μ΄ 잘 μ΄λ£¨μ–΄μ‘ŒμŠ΅λ‹ˆλ‹€!

μ‚¬μš©μž 쀑심적인 λ ˆμ΄λΈ”λ‘œ λ³€κ²½ν•˜μ—¬ 더 직관적인 UIλ₯Ό μ œκ³΅ν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

src/app/(crew)/my-crew/layout.tsx (3)

27-27: λ°˜μ‘ν˜• νŒ¨λ”© κ΅¬ν˜„μ΄ μ μ ˆν•©λ‹ˆλ‹€.

λͺ¨λ°”일(px-3 py-4)μ—μ„œ λ°μŠ€ν¬ν†±(lg:px-11.5)κΉŒμ§€ λ‹¨κ³„μ μœΌλ‘œ νŒ¨λ”©μ„ μ¦κ°€μ‹œν‚€λŠ” 방식이 μ‚¬μš©μž κ²½ν—˜μ„ ν–₯μƒμ‹œν‚΅λ‹ˆλ‹€.


28-28: 제λͺ©μ˜ 쑰건뢀 λ Œλ”λ§μ΄ μ μ ˆν•©λ‹ˆλ‹€.

hidden md:block 클래슀λ₯Ό μ‚¬μš©ν•˜μ—¬ λͺ¨λ°”μΌμ—μ„œλŠ” 제λͺ©μ„ 숨기고 νƒœλΈ”λ¦Ώ μ΄μƒμ—μ„œλ§Œ ν‘œμ‹œν•˜λŠ” 것이 쒋은 μ ‘κ·Όμž…λ‹ˆλ‹€.


37-38: μ‹œκ°μ  ꡬ뢄선과 μ—¬λ°± μ²˜λ¦¬κ°€ μ μ ˆν•©λ‹ˆλ‹€.

ꡬ뢄선(border-t-2)κ³Ό μ—¬λ°±(mt-10)을 톡해 μ½˜ν…μΈ  μ˜μ—­μ„ λͺ…ν™•ν•˜κ²Œ κ΅¬λΆ„ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 특히 ꡬ뢄선을 νƒœλΈ”λ¦Ώ μ΄μƒμ—μ„œλ§Œ ν‘œμ‹œν•˜λŠ” 것이 λͺ¨λ°”일 ν™”λ©΄μ˜ 곡간 ν™œμš©λ„λ₯Ό λ†’μž…λ‹ˆλ‹€.

src/types/gathering-data.d.ts (2)

56-56: νƒ€μž… μ •μ˜κ°€ μ˜¬λ°”λ₯΄κ²Œ μΆ”κ°€λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

GatheringCardProps μΈν„°νŽ˜μ΄μŠ€μ— location 속성을 μΆ”κ°€ν•œ 것이 λ‹€λ₯Έ μΈν„°νŽ˜μ΄μŠ€λ“€μ˜ νŒ¨ν„΄κ³Ό μΌκ΄€μ„±μžˆκ²Œ κ΅¬ν˜„λ˜μ—ˆμŠ΅λ‹ˆλ‹€.


56-56: μ»΄ν¬λ„ŒνŠΈμ—μ„œ location μ†μ„±μ˜ μ‚¬μš©μ„ ν™•μΈν•΄μ£Όμ„Έμš”.

μƒˆλ‘œ μΆ”κ°€λœ location 속성이 κ΄€λ ¨ μ»΄ν¬λ„ŒνŠΈμ—μ„œ μ˜¬λ°”λ₯΄κ²Œ μ‚¬μš©λ˜κ³  μžˆλŠ”μ§€ 확인이 ν•„μš”ν•©λ‹ˆλ‹€.

βœ… Verification successful

location 속성이 μ»΄ν¬λ„ŒνŠΈμ—μ„œ μ μ ˆν•˜κ²Œ μ‚¬μš©λ˜κ³  μžˆμŒμ„ ν™•μΈν–ˆμŠ΅λ‹ˆλ‹€.

검증 κ²°κ³Ό:

  • GatheringCardProps μΈν„°νŽ˜μ΄μŠ€κ°€ μ—¬λŸ¬ μ»΄ν¬λ„ŒνŠΈμ—μ„œ μ˜¬λ°”λ₯΄κ²Œ μž„ν¬νŠΈλ˜μ–΄ μ‚¬μš©λ¨
  • location 속성이 gathering-card μ»΄ν¬λ„ŒνŠΈμ™€ κ΄€λ ¨ μŠ€ν† λ¦¬λΆμ—μ„œ μ μ ˆν•˜κ²Œ μ‚¬μš©λ¨
  • λͺ¨λ“  κ΄€λ ¨ μ»΄ν¬λ„ŒνŠΈμ—μ„œ location 데이터가 μΌκ΄€λ˜κ²Œ 처리되고 있음
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the usage of location prop in gathering card components

# Search for GatheringCardProps usage in components
rg -t tsx -t ts "GatheringCardProps" -A 10

# Search for location prop usage in gathering related components
rg -t tsx "location[\"']?\s*[:=]" --glob "**/*Gathering*.tsx"

Length of output: 164


Script:

#!/bin/bash
# Search for files containing "Gathering" in their name
fd "Gathering" --type file

# Then search for GatheringCardProps type usage
rg "GatheringCardProps"

# Search for location prop usage in files containing "Gathering"
rg "location[\"']?\s*[:=]" $(fd "Gathering" --type file)

Length of output: 9610

src/app/(crew)/my-gathering/_component/gathering-list-with-date.tsx (1)

4-4: λ‚ μ§œ ν¬λ§·νŒ… 둜직이 κ°œμ„ λ˜μ—ˆμŠ΅λ‹ˆλ‹€!

getDayOfWeek μœ ν‹Έλ¦¬ν‹° ν•¨μˆ˜λ₯Ό μ œκ±°ν•˜κ³  formatDate의 dayOfWeek 속성을 μ‚¬μš©ν•˜λ„λ‘ λ³€κ²½ν•œ 것이 쒋은 κ°œμ„ μ‚¬ν•­μž…λ‹ˆλ‹€. 이λ₯Ό 톡해 λ‚ μ§œ ν¬λ§·νŒ… 둜직이 μ€‘μ•™ν™”λ˜μ–΄ μœ μ§€λ³΄μˆ˜κ°€ λ”μš± μš©μ΄ν•΄μ‘ŒμŠ΅λ‹ˆλ‹€.

src/components/common/gathering-card/scheduled-gathering-card/scheduled-gathering.stories.tsx (2)

40-40: μœ„μΉ˜ 정보가 μ μ ˆν•˜κ²Œ μΆ”κ°€λ˜μ—ˆμŠ΅λ‹ˆλ‹€!

location 속성이 crewSubLocationκ³Ό 일관성 있게 μΆ”κ°€λ˜μ–΄ 있으며, λͺ¨μž„ μž₯μ†Œλ₯Ό 더 ꡬ체적으둜 ν‘œμ‹œν•  수 있게 λ˜μ—ˆμŠ΅λ‹ˆλ‹€.


61-61: μœ„μΉ˜ 정보 λ Œλ”λ§ 확인이 ν•„μš”ν•©λ‹ˆλ‹€.

μƒˆλ‘œ μΆ”κ°€λœ location 속성이 UIμ—μ„œ μ˜¬λ°”λ₯΄κ²Œ ν‘œμ‹œλ˜λŠ”μ§€ ν™•μΈν•΄μ£Όμ„Έμš”. 특히 κΈ΄ μœ„μΉ˜ ν…μŠ€νŠΈμ˜ 경우 λ§μ€„μž„ν‘œ(...) μ²˜λ¦¬λ‚˜ μ€„λ°”κΏˆμ΄ 적절히 λ™μž‘ν•˜λŠ”μ§€ 검증이 ν•„μš”ν•©λ‹ˆλ‹€.

λ‹€μŒκ³Ό 같은 κΈ΄ μœ„μΉ˜ ν…μŠ€νŠΈλ‘œλ„ ν…ŒμŠ€νŠΈν•΄λ³΄μ‹œλŠ” 것을 μΆ”μ²œλ“œλ¦½λ‹ˆλ‹€:

-      location: 'ν•œκ°•μ§„μ—­ 1번좜ꡬ',
+      location: 'ν•œκ°•μ§„μ—­ 1번좜ꡬ μŠ€νƒ€λ²…μŠ€ 건물 3μΈ΅ μž…κ΅¬ μ•ž',
src/components/gathering-list/liked-list-presenter.tsx (2)

Line range hint 25-31: λ°˜μ‘ν˜• κ·Έλ¦¬λ“œ λ ˆμ΄μ•„μ›ƒμ΄ 잘 κ΅¬ν˜„λ˜μ—ˆμŠ΅λ‹ˆλ‹€

  • λΈŒλ ˆμ΄ν¬ν¬μΈνŠΈλ³„ 컬럼 수 쑰정이 μ μ ˆν•©λ‹ˆλ‹€
  • μ΅œμ†Œ 높이 μ œμ•½μœΌλ‘œ λ ˆμ΄μ•„μ›ƒ μ‹œν”„νŠΈλ₯Ό λ°©μ§€ν•©λ‹ˆλ‹€
  • gapκ³Ό 정렬이 μΌκ΄€λ˜κ²Œ μ μš©λ˜μ—ˆμŠ΅λ‹ˆλ‹€

24-24: νŒ¨λ”© 제거둜 μΈν•œ λ ˆμ΄μ•„μ›ƒ 일관성 κ²€ν†  ν•„μš”

μˆ˜ν‰ νŒ¨λ”©(px-4)이 μ œκ±°λ˜μ—ˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” 전체적인 λ ˆμ΄μ•„μ›ƒ 일관성에 영ν–₯을 λ―ΈμΉ  수 μžˆμŠ΅λ‹ˆλ‹€.

λ‹€λ₯Έ 리슀트 μ»΄ν¬λ„ŒνŠΈλ“€μ˜ νŒ¨λ”© 섀정을 ν™•μΈν•˜κΈ° μœ„ν•΄ λ‹€μŒ 슀크립트λ₯Ό μ‹€ν–‰ν•˜μ„Έμš”:

βœ… Verification successful

λ ˆμ΄μ•„μ›ƒ 일관성 κ²€ν†  μ™„λ£Œ - νŒ¨λ”© μ œκ±°λŠ” μ μ ˆν•œ λ³€κ²½

검색 κ²°κ³Όλ₯Ό λΆ„μ„ν•΄λ³΄λ‹ˆ max-w-[1200px]λ₯Ό μ‚¬μš©ν•˜λŠ” λ‹€λ₯Έ μ»΄ν¬λ„ŒνŠΈλ“€μ—μ„œλ„ px-4 νŒ¨λ”©μ„ μ‚¬μš©ν•˜μ§€ μ•Šκ³  μžˆμŠ΅λ‹ˆλ‹€. 특히:

  • 헀더 μ»΄ν¬λ„ŒνŠΈ (header/presenter.tsx)
  • μž‘μ„± κ°€λŠ₯ν•œ λͺ¨μž„ μΉ΄λ“œ (writable-gathering-card.tsx)
  • 파일 μž…λ ₯ 래퍼 (file-input-wrap/index.tsx)

μ΄λŠ” ν˜„μž¬μ˜ νŒ¨λ”© μ œκ±°κ°€ 전체적인 λ ˆμ΄μ•„μ›ƒ 일관성을 κ°œμ„ ν•˜λŠ” μ˜¬λ°”λ₯Έ λ³€κ²½μž„μ„ λ³΄μ—¬μ€λ‹ˆλ‹€.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# λ‹€λ₯Έ 리슀트 μ»΄ν¬λ„ŒνŠΈλ“€μ˜ νŒ¨λ”© μ„€μ • 확인
rg -t tsx "className=\".*?max-w-\[1200px\].*?\"" "src/components"

Length of output: 91


Script:

#!/bin/bash
# Search for max-width class usage in all TypeScript and TypeScript React files
rg -t ts -t tsx "className=.*max-w-\[1200px\]" src/components

# Also search for similar max-width patterns that might use different syntax
rg -t ts -t tsx "className=.*max-w-.*1200" src/components

Length of output: 179


Script:

#!/bin/bash
# Search for max-width class usage in all files under src/components
rg "className.*max-w-\[1200px\]" src/components/

# Search for px-4 class usage in all files under src/components
rg "className.*px-4" src/components/

Length of output: 1070

src/components/common/gathering-card/scheduled-gathering-card/presenter.tsx (1)

4-6: νƒ€μž… μ •μ˜μ™€ μž„ν¬νŠΈ ꡬ쑰가 κ°œμ„ λ˜μ—ˆμŠ΅λ‹ˆλ‹€!

GatheringCardProps νƒ€μž…μ„ μ‚¬μš©ν•˜μ—¬ μ½”λ“œμ˜ νƒ€μž… μ•ˆμ •μ„±μ΄ ν–₯μƒλ˜μ—ˆκ³ , μ»΄ν¬λ„ŒνŠΈ μž¬μ‚¬μš©μ„±μ΄ κ°œμ„ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

Also applies to: 9-9

src/components/common/gathering-card/presenter.tsx (1)

Line range hint 86-92: κΈ΄ 제λͺ©κ³Ό μœ„μΉ˜ ν…μŠ€νŠΈ 처리 검증 ν•„μš”

ν˜„μž¬ 제λͺ©κ³Ό μœ„μΉ˜ 정보가 text-ellipsis와 whitespace-nowrap으둜 μ²˜λ¦¬λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. 이 μ²˜λ¦¬κ°€ λ‹€μ–‘ν•œ 길이의 ν…μŠ€νŠΈμ—μ„œ μ˜¬λ°”λ₯΄κ²Œ μž‘λ™ν•˜λŠ”μ§€ 확인이 ν•„μš”ν•©λ‹ˆλ‹€.

βœ… Verification successful

ν…μŠ€νŠΈ μ˜€λ²„ν”Œλ‘œμš° μ²˜λ¦¬κ°€ 적절히 κ΅¬ν˜„λ˜μ–΄ μžˆμŒμ„ 확인

ν˜„μž¬ κ΅¬ν˜„λœ ν…μŠ€νŠΈ μ˜€λ²„ν”Œλ‘œμš° 처리 방식이 μ μ ˆν•©λ‹ˆλ‹€:

  • overflow-hidden, text-ellipsis, whitespace-nowrap 클래슀 μ‘°ν•©μœΌλ‘œ κΈ΄ ν…μŠ€νŠΈλ₯Ό μ˜¬λ°”λ₯΄κ²Œ 처리
  • 제λͺ©(h3)κ³Ό μœ„μΉ˜(p) λͺ¨λ‘ λ™μΌν•œ μ˜€λ²„ν”Œλ‘œμš° 처리 방식 적용
  • λΆ€λͺ¨ μ»¨ν…Œμ΄λ„ˆμ˜ λ„ˆλΉ„μ— 맞좰 μžλ™μœΌλ‘œ λ§μ€„μž„ν‘œ(...) ν‘œμ‹œ

μ΄λŸ¬ν•œ Tailwind CSS 클래슀 쑰합은 ν…μŠ€νŠΈ 길이와 관계없이 UIκ°€ κΉ¨μ§€μ§€ μ•Šλ„λ‘ 보μž₯ν•©λ‹ˆλ‹€.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# 맀우 κΈ΄ 제λͺ©μ΄λ‚˜ μœ„μΉ˜λ₯Ό κ°€μ§„ λͺ¨μž„ 데이터가 μžˆλŠ”μ§€ 확인
ast-grep --pattern 'title: "$_"' | grep -E '.{50,}'
ast-grep --pattern 'location: "$_"' | grep -E '.{30,}'

Length of output: 110


Script:

#!/bin/bash
# μ»΄ν¬λ„ŒνŠΈμ—μ„œ μ‹€μ œ μ‚¬μš©λ˜λŠ” 데이터 μ˜ˆμ‹œ μ°ΎκΈ°
rg -U "title.*location.*" --type tsx -A 5 -B 5

# ν…ŒμŠ€νŠΈ λ°μ΄ν„°λ‚˜ λͺ©μ—… λ°μ΄ν„°μ—μ„œ titleκ³Ό location 검색
fd "mock|test|fixture" -e ts -e tsx -e json --exec rg -U "title.*location" {} \;

# Storybook μŠ€ν† λ¦¬μ—μ„œ μ‚¬μš©λœ 데이터 μ˜ˆμ‹œ 검색
fd "stories" -e tsx --exec rg -U "title.*location" {} \;

Length of output: 222


Script:

#!/bin/bash
# TypeScript/React νŒŒμΌμ—μ„œ titleκ³Ό location이 ν¬ν•¨λœ μ»΄ν¬λ„ŒνŠΈ 검색
rg -t ts -t tsx -U "title.*location.*" -A 5 -B 5

# ν…ŒμŠ€νŠΈ 데이터 검색 (ν™•μž₯자 μˆ˜μ •)
rg -t ts -t tsx -t json "title.*location" ./src --glob "*{test,mock,fixture,stories}*"

# GatheringCard μ»΄ν¬λ„ŒνŠΈμ˜ μ‚¬μš© μ˜ˆμ‹œ 검색
rg -t ts -t tsx "<GatheringCard" -A 10

Length of output: 264

src/app/(crew)/crew/detail/[id]/_components/gathering-detail-modal/presenter.tsx (2)

9-9: μ•„μ΄μ½˜ 변경이 μ μ ˆν•΄ λ³΄μž…λ‹ˆλ‹€!

IcoPerson μ•„μ΄μ½˜μœΌλ‘œμ˜ 변경이 λͺ¨μž„ μ°Έκ°€μžλ₯Ό λ‚˜νƒ€λ‚΄λŠ” λ§₯락에 더 잘 μ–΄μšΈλ¦½λ‹ˆλ‹€.


125-125: λ²„νŠΌ λ ˆμ΄λΈ” 변경이 μ μ ˆν•©λ‹ˆλ‹€!

"약속 μ·¨μ†Œν•˜κΈ°"와 "약속 μ‚­μ œν•˜κΈ°"둜의 변경이 μ‚¬μš©μžμ˜ 행동을 더 λͺ…ν™•ν•˜κ²Œ μ„€λͺ…ν•΄μ€λ‹ˆλ‹€.

Also applies to: 134-134

role="button"
tabIndex={0}
className="relative flex h-44 cursor-pointer items-center space-x-4 rounded-xl bg-white p-6 shadow-xs md:space-x-6 lg:space-x-6"
className="h-80 cursor-pointer items-center rounded-xl bg-white shadow-xs md:flex md:h-44"
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. 클릭 이벀트 처리 κ°œμ„ μ΄ ν•„μš”ν•©λ‹ˆλ‹€:
-      {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events */}
       <div
         onClick={onClick}
         role="button"
         tabIndex={0}
+        onKeyDown={(e) => {
+          if (e.key === 'Enter' || e.key === ' ') {
+            onClick();
+          }
+        }}
         className="h-80 cursor-pointer items-center rounded-xl bg-white shadow-xs md:flex md:h-44"
       >
  1. 슀크린 리더 μ‚¬μš©μžλ₯Ό μœ„ν•œ μΆ”κ°€ 정보가 ν•„μš”ν•©λ‹ˆλ‹€:
-              <Image src={IcoPerson} alt="person icon" width={16} height={16} className="pb-0.5" />
+              <Image src={IcoPerson} alt="μ°Έμ—¬ 인원 μ•„μ΄μ½˜" width={16} height={16} className="pb-0.5" />
  1. λ²„νŠΌ μ»΄ν¬λ„ŒνŠΈμ˜ μ ‘κ·Όμ„± 속성을 μΆ”κ°€ν•˜λ©΄ 쒋을 것 κ°™μŠ΅λ‹ˆλ‹€:
-            <Button className="lg:w-1/ btn-filled w-40 md:w-1/2" onClick={onClick}>
+            <Button 
+              className="lg:w-1/ btn-filled w-40 md:w-1/2" 
+              onClick={onClick}
+              aria-label={`${title} λͺ¨μž„ 상세 정보 보기`}
+            >

Also applies to: 31-31, 34-53

Comment on lines +72 to +79
<h2 className="text-xl font-semibold text-gray-800">{data?.title}</h2>
<h3 className="text-base font-medium text-gray-700">{data?.location}</h3>
<div className="mt-4 w-full border-gray-200">
<p className="text-base font-semibold text-blue-500">약속 곡지사항</p>
<div className="overflow-y-auto text-base font-medium text-gray-700">
{data?.introduce || 'μ†Œκ°œ 정보가 μ—†μŠ΅λ‹ˆλ‹€.'}
</div>
</div>
Copy link

Choose a reason for hiding this comment

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

πŸ’‘ Codebase verification

데이터 μ²˜λ¦¬μ— λŒ€ν•œ λ°©μ–΄ 둜직이 ν•„μš”ν•©λ‹ˆλ‹€

μ½”λ“œ κ²€ν†  κ²°κ³Ό, λ‹€μŒκ³Ό 같은 κ°œμ„ μ΄ ν•„μš”ν•©λ‹ˆλ‹€:

  • data?.location이 undefined일 λ•Œ λŒ€μ²΄ ν…μŠ€νŠΈκ°€ μ—†μŠ΅λ‹ˆλ‹€.
  • λ‹€λ₯Έ ν•„λ“œλ“€(title, dateTime λ“±)은 μ˜΅μ…”λ„ μ²΄μ΄λ‹μœΌλ‘œ μ²˜λ¦¬λ˜μ–΄ μžˆμ§€λ§Œ, 빈 값에 λŒ€ν•œ λŒ€μ²΄ ν…μŠ€νŠΈκ°€ μ—†μŠ΅λ‹ˆλ‹€.

κ°œμ„  μ œμ•ˆ:

<h2 className="text-xl font-semibold text-gray-800">{data?.title || '제λͺ© μ—†μŒ'}</h2>
<h3 className="text-base font-medium text-gray-700">{data?.location || 'μœ„μΉ˜ 정보 μ—†μŒ'}</h3>
πŸ”— Analysis chain

μœ„μΉ˜ 정보와 곡지사항 μ„Ήμ…˜μ΄ 잘 κ΅¬μ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€!

μœ„μΉ˜ 정보 좔가와 곡지사항 μ„Ήμ…˜μ˜ ꡬ쑰화가 잘 λ˜μ—ˆμŠ΅λ‹ˆλ‹€. λ‹€λ§Œ, 데이터 처리 κ΄€λ ¨ 보완이 ν•„μš”ν•΄ λ³΄μž…λ‹ˆλ‹€.

λ‹€μŒ 사항듀을 ν™•μΈν•΄μ£Όμ‹œκΈ° λ°”λžλ‹ˆλ‹€:

  1. location 데이터가 μ—†λŠ” κ²½μš°μ— λŒ€ν•œ 처리
  2. data 객체가 undefined인 κ²½μš°μ— λŒ€ν•œ λ°©μ–΄ 둜직

μ•„λž˜ 슀크립트둜 κ΄€λ ¨ μ½”λ“œλ₯Ό ν™•μΈν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€:

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# location prop의 ν•„μˆ˜ μ—¬λΆ€ 확인
rg -A 5 "location.*:" "src/types/*"

Length of output: 89


Script:

#!/bin/bash
# νƒ€μž… μ •μ˜ 파일 μ°ΎκΈ°
fd "types?.ts" --type f

# 데이터 νƒ€μž… μ •μ˜ 확인
rg -g "*.ts" -g "*.tsx" "type.*Gathering|interface.*Gathering" -A 10

Length of output: 29688


Script:

#!/bin/bash
# λͺ¨λ‹¬ μ»΄ν¬λ„ŒνŠΈμ˜ 데이터 νƒ€μž…κ³Ό κ΅¬ν˜„ 확인
rg -g "*.ts*" "GatheringDetailType" -A 5 "src/app/(crew)/crew/detail/\[id\]/_components/gathering-detail-modal/"

# 데이터 처리 둜직 확인
ast-grep --pattern 'data?.location' -l ts,tsx

Length of output: 383


Script:

#!/bin/bash
# λͺ¨λ‹¬ μ»΄ν¬λ„ŒνŠΈμ˜ 데이터 νƒ€μž…κ³Ό κ΅¬ν˜„ 확인
rg -g "*.tsx" "data\?" -A 2 -B 2 "src/app/(crew)/crew/detail/[id]/_components/gathering-detail-modal/presenter.tsx"

# GatheringDetailType μΈν„°νŽ˜μ΄μŠ€ 확인
rg -g "*.ts" "GatheringDetailType.*{" -A 10

Length of output: 3064

@minkyung5x5 minkyung5x5 self-assigned this Nov 20, 2024
Copy link
Contributor

@yulrang yulrang left a comment

Choose a reason for hiding this comment

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

λ””μžμΈ μˆ˜μ •ν•˜λŠλΌ κ³ μƒλ§ŽμœΌμ…¨μŠ΅λ‹ˆλ‹€~~

@minkyung5x5 minkyung5x5 merged commit 1b2cb0e into develop Nov 20, 2024
3 checks passed
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.

4 participants