refactor: /archive 탭을 위시리스트·내 토너먼트 페이지로 분리#347
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
Discord 스레드 연동용 메타데이터입니다. discord-pr-bot 워크플로가 자동 생성하며, 수정·삭제하면 PR 과 Discord 알림 연동이 끊깁니다. |
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Repository UI Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (2)
🚧 Files skipped from review as they are similar to previous changes (1)
📝 WalkthroughWalkthrough기존 Changes보관함 라우트 분리
위시리스트 UI 및 작업 흐름
공유 인텐트 위시 등록
라우트 소비자 및 리다이렉트 갱신
Estimated code review effort: 4 (Complex) | ~60 minutes Sequence Diagram(s)sequenceDiagram
participant ShareBottomSheet
participant WebBridge
participant ShareIntent
participant WishRegistration
ShareBottomSheet->>WebBridge: /archive/wish 공유 경로 전달
WebBridge->>ShareIntent: 공유 intent payload 전달
ShareIntent->>WishRegistration: 추출한 URL로 위시 등록
WishRegistration->>ShareIntent: URL별 중복 처리 상태 갱신
Possibly related issues
Possibly related PRs
Suggested reviewers: 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
Actionable comments posted: 6
🧹 Nitpick comments (13)
apps/web/src/app/archive/_common/_components/ArchivePageLayout.tsx (2)
26-27: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win아카이브 본문을
<main>landmark로 감싸 주세요.현재
{children}이 직접 렌더링되어 페이지의 본문 landmark가 보장되지 않습니다.WishContentClient는div를 반환하고, 토너먼트 화면의<main>은 fallback에만 존재합니다.As per coding guidelines,
apps/web/src/**/*.{ts,tsx}에서는<main>,<h1>,<h2>같은 semantic HTML 태그를 사용해야 합니다.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@apps/web/src/app/archive/_common/_components/ArchivePageLayout.tsx` around lines 26 - 27, Wrap the `{children}` content in ArchivePageLayout with a semantic `<main>` landmark, preserving the existing layout container and child rendering while ensuring the archive page body always has a main element.Source: Coding guidelines
3-6: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winprops 타입명을 컴포넌트명 기반으로 바꿔 주세요.
type Props대신ArchivePageLayoutProps를 사용해야 타입의 소유 컴포넌트가 명확해집니다.As per coding guidelines, 컴포넌트 props 타입은
{ComponentName}Props형식을 사용해야 합니다.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@apps/web/src/app/archive/_common/_components/ArchivePageLayout.tsx` around lines 3 - 6, Rename the props type associated with the ArchivePageLayout component from Props to ArchivePageLayoutProps, and update all references to use the new component-specific type name.Source: Coding guidelines
apps/web/src/app/archive/wish/page.tsx (1)
1-2: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win프로젝트 모듈 import를
@/절대 경로로 통일해 주세요.두 import 모두 현재 파일과 동일 디렉터리가 아닌 경로를 상대 import하고 있습니다. 다음처럼 변경해 주세요.
@/app/archive/_common/_components/ArchivePageLayout@/app/archive/wish/_components/WishContentAs per coding guidelines,
apps/web/src/**/*.{ts,tsx}에서는 프로젝트 모듈에@/*절대 경로를 사용하고 상대 경로는 같은 디렉터리 파일에만 사용해야 합니다.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@apps/web/src/app/archive/wish/page.tsx` around lines 1 - 2, Update the imports in the archive wish page to use the `@/` absolute paths for `ArchivePageLayout` and `WishContent`, referencing `@/app/archive/_common/_components/ArchivePageLayout` and `@/app/archive/wish/_components/WishContent` instead of relative project-module paths.Source: Coding guidelines
apps/web/src/app/archive/tournament/_components/TournamentHistoryList.tsx (1)
8-10: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value컴포넌트별 props 타입명을 사용하세요.
apps/web/src/app/archive/tournament/_components/TournamentHistoryList.tsx#L8-L10:TournamentHistoryListProps로 변경하세요.apps/web/src/app/archive/tournament/_components/TournamentStatusTab.tsx#L7-L10:TournamentStatusTabProps로 변경하세요.As per coding guidelines, “Use TypeScript
typedeclarations instead ofinterface; appendTto shared type names and use{ComponentName}Propsfor component props.”🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@apps/web/src/app/archive/tournament/_components/TournamentHistoryList.tsx` around lines 8 - 10, Rename the props type in TournamentHistoryList.tsx from Props to TournamentHistoryListProps, and rename the corresponding props type in TournamentStatusTab.tsx from Props to TournamentStatusTabProps. Update each component’s type references consistently while keeping the existing type declaration style.Source: Coding guidelines
apps/web/src/app/archive/tournament/page.tsx (1)
1-1: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win상위 디렉터리 상대 import를
@/alias로 바꾸세요. 현재 파일과 다른 디렉터리의 모듈을 상대 경로로 가져오고 있습니다.
apps/web/src/app/archive/tournament/page.tsx#L1-L1:@/app/archive/tournament/_components/TournamentHistoryContent를 사용하세요.apps/web/src/app/archive/tournament/_components/ArchiveTournamentClient.tsx#L8-L8:@/app/archive/_common/_components/ArchivePageLayout를 사용하세요.수정 예시
-import TournamentHistoryContent from './_components/TournamentHistoryContent'; +import TournamentHistoryContent from '`@/app/archive/tournament/_components/TournamentHistoryContent`'; -import ArchivePageLayout from '../../_common/_components/ArchivePageLayout'; +import ArchivePageLayout from '`@/app/archive/_common/_components/ArchivePageLayout`';As per coding guidelines, “Use
@/*absolute imports forapps/web/src, and use relative imports for files in the same directory.”🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@apps/web/src/app/archive/tournament/page.tsx` at line 1, Replace the parent-directory relative imports with `@/` aliases: update TournamentHistoryContent in page.tsx to use its absolute app path, and update ArchivePageLayout in ArchiveTournamentClient.tsx to use the archive common-components alias.Source: Coding guidelines
apps/web/src/app/archive/tournament/_components/ArchiveTournamentClient.tsx (1)
12-15: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value마지막 배열·객체 항목에 ES5 후행 쉼표를 추가하세요.
apps/web/src/app/archive/tournament/_components/ArchiveTournamentClient.tsx#L12-L15:completed상태 배열 뒤에 쉼표를 추가하세요.apps/web/src/app/archive/tournament/_components/TournamentStatusTab.tsx#L12-L15: 마지막 탭 객체 뒤에 쉼표를 추가하세요.As per coding guidelines, “Use semicolons, single quotes, a print width of 100, ES5 trailing commas, and omit parentheses for single-argument arrow functions.”
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@apps/web/src/app/archive/tournament/_components/ArchiveTournamentClient.tsx` around lines 12 - 15, Update STATUS_BY_TAB in apps/web/src/app/archive/tournament/_components/ArchiveTournamentClient.tsx:12-15 by adding an ES5 trailing comma after the final completed status array. Also add a trailing comma after the final tab object in apps/web/src/app/archive/tournament/_components/TournamentStatusTab.tsx:12-15.Source: Coding guidelines
apps/web/src/app/archive/wish/_apis/deleteWishes.ts (1)
6-8: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value세미콜론을 추가하세요.
Line 8의 다중 행 호출을 세미콜론으로 끝내세요.
수정안
const { data } = await clientApi.delete<ApiResponseT<null>>( ENDPOINTS.WISHLISTS + `?ids=${wishIds.join(',')}` - ); + );As per coding guidelines, "Use semicolons" 규칙을 따르세요.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@apps/web/src/app/archive/wish/_apis/deleteWishes.ts` around lines 6 - 8, Update the multi-line clientApi.delete call in the wish deletion flow to end with a semicolon, following the project’s semicolon coding guideline.Source: Coding guidelines
apps/web/src/app/archive/wish/_components/FabMenu.tsx (1)
18-18: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win현재 동작과 맞지 않는 TODO를 정리해 주세요.
onAddItem은 이미WishContentClient에서WishAddDialog를 여는 동작으로 연결되어 있으므로 “추가 페이지가 생기면 연결”이라는 주석은 오래된 상태입니다. 실제 동작을 설명하는 주석으로 바꾸거나 삭제해 주세요.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@apps/web/src/app/archive/wish/_components/FabMenu.tsx` at line 18, Remove the outdated TODO comment near the add-item action in FabMenu, since onAddItem already opens WishAddDialog through WishContentClient; either leave the code without a comment or replace it with a brief comment describing that existing dialog behavior.apps/web/src/app/archive/wish/_components/WishFab.tsx (1)
33-45: 🎯 Functional Correctness | 🔵 Trivial | 🏗️ Heavy lift열린 FAB 메뉴에 키보드 및 팝오버 접근성 처리가 필요합니다.
현재 backdrop은 시각적으로 modal처럼 동작하지만
aria-expanded/aria-haspopup가 없고, Escape로 닫거나 메뉴를 닫은 뒤 trigger로 focus를 복귀시키는 로직도 없습니다. 키보드 사용자가 dimmed layer 뒤의 콘텐츠로 이동할 수 있으므로, ARIA 상태·Escape 처리·focus 복귀를 추가하거나 접근 가능한 popover/dialog primitive을 사용해 주세요.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@apps/web/src/app/archive/wish/_components/WishFab.tsx` around lines 33 - 45, WishFab의 FAB trigger와 열린 메뉴 흐름에 접근 가능한 popover/dialog 동작을 추가하세요. trigger에 aria-expanded와 적절한 aria-haspopup 상태를 연결하고, 열린 상태에서 Escape로 닫히도록 처리하며 메뉴가 닫히면 trigger로 포커스를 복귀시키세요. backdrop 뒤 콘텐츠로 키보드 포커스가 이동하지 않도록 기존 FabMenu 또는 접근 가능한 popover/dialog primitive의 포커스 관리 기능을 활용하세요.apps/web/src/components/common/wish-card/index.tsx (1)
21-21: 🚀 Performance & Scalability | 🔵 Trivial | ⚡ Quick win
sizes에 실제 2열 카드 폭을 전달해야 합니다.
WishGrid가grid-cols-2를 사용하므로 현재 값은 카드 한 장이 아니라 grid 전체 폭에 가깝습니다. 이 상태에서는 약 2배 큰 이미지 후보를 받아 네트워크와 디코딩 비용이 증가할 수 있습니다.수정 예시
- sizes="(max-width: 480px) calc(100vw - 40px - 8px), 216px" + sizes="(max-width: 480px) calc((100vw - 40px - 8px) / 2), 216px"🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@apps/web/src/components/common/wish-card/index.tsx` at line 21, Update the `sizes` prop in the wish-card image configuration to represent one card’s rendered width under the two-column `WishGrid` layout, including the grid gap and container padding. Replace the current near-full-grid mobile calculation while preserving the desktop width behavior.apps/web/src/app/archive/wish/_components/WishContentClient.tsx (1)
5-6: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win프로젝트 모듈 import를 절대 경로로 통일해주세요.
../_hooks/...는 같은 디렉터리 import가 아니므로@/app/archive/wish/_hooks/...로 변경해야 합니다.수정 예시
-import { useDeleteWishes } from '../_hooks/useDeleteWishes'; -import { useShareIntentWish } from '../_hooks/useShareIntentWish'; +import { useDeleteWishes } from '`@/app/archive/wish/_hooks/useDeleteWishes`'; +import { useShareIntentWish } from '`@/app/archive/wish/_hooks/useShareIntentWish`';As per coding guidelines:
apps/web/src/**/*.{ts,tsx}프로젝트 모듈은@/*절대 경로를 사용하고 상대 경로는 동일 디렉터리 파일에만 사용해야 합니다.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@apps/web/src/app/archive/wish/_components/WishContentClient.tsx` around lines 5 - 6, Update the useDeleteWishes and useShareIntentWish imports in WishContentClient to use the `@/app/archive/wish/_hooks/`... absolute paths, keeping relative imports only for files in the same directory.Source: Coding guidelines
apps/web/src/app/archive/wish/_components/WishAddDialog.tsx (1)
6-9: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win컴포넌트 props 타입명을 명확히 해주세요.
Props대신WishAddDialogProps를 사용해 컴포넌트와 타입의 관계를 드러내야 합니다.수정 예시
-type Props = { +type WishAddDialogProps = { open: boolean; onOpenChange: (open: boolean) => void; }; -function WishAddDialog({ open, onOpenChange }: Props) { +function WishAddDialog({ open, onOpenChange }: WishAddDialogProps) {As per coding guidelines: 컴포넌트 props 타입은
{ComponentName}Props형식으로 명명해야 합니다.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@apps/web/src/app/archive/wish/_components/WishAddDialog.tsx` around lines 6 - 9, Rename the props type `Props` used by the WishAddDialog component to `WishAddDialogProps`, and update the component’s type annotation references accordingly while preserving the existing prop fields and behavior.Source: Coding guidelines
apps/web/src/app/archive/wish/_components/WishlistBottomBar.tsx (1)
16-17: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win모바일 UI의 고정 폭을 제거해주세요.
w-[168px]는 모바일 화면과 선택 개수 텍스트에 불필요한 고정 제약을 만듭니다. 좌우 padding과whitespace-nowrap로 콘텐츠 기반 폭을 사용하세요.수정 예시
-<div className="flex h-[68px] w-[168px] items-center justify-center rounded-full bg-bg-layer-default shadow-[0px_0px_8px_0px_rgba(0,0,0,0.04)]"> +<div className="flex h-[68px] items-center justify-center whitespace-nowrap rounded-full bg-bg-layer-default px-5 shadow-[0px_0px_8px_0px_rgba(0,0,0,0.04)]">As per coding guidelines: 모바일 UI에서는 고정 폭 대신
w-full,px-5,max-w-*패턴을 선호해야 합니다.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@apps/web/src/app/archive/wish/_components/WishlistBottomBar.tsx` around lines 16 - 17, WishlistBottomBar의 선택 개수 컨테이너에서 고정 폭 클래스 w-[168px]를 제거하고, 콘텐츠 기반 폭이 사용되도록 좌우 패딩과 whitespace-nowrap을 적용하세요. 기존 높이·정렬·스타일은 유지하고, 선택된 개수 텍스트가 줄바꿈되지 않도록 span의 표시를 보장하세요.Source: Coding guidelines
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@apps/web/src/app/archive/wish/_components/FabMenu.tsx`:
- Line 11: Update the FabMenu container’s width styling to use a fluid width
with w-full and cap it at 184px via max-w-[184px], replacing the fixed w-[184px]
class while preserving the remaining layout and styling classes.
In `@apps/web/src/app/archive/wish/_components/wish-grid/WishFailedCard.tsx`:
- Line 7: Update the status text in WishFailedCard.tsx to “가져오는 데 실패했어요” and the
corresponding status text in WishProcessingCard.tsx to “상품을 담는 중...”.
In `@apps/web/src/app/archive/wish/_components/WishCardSkeleton.tsx`:
- Around line 5-11: Update WishCardSkeleton to match WishCard’s aspect-[0.765]
card sizing and flex-1 image-area behavior instead of using the fixed h-[143px]
skeleton height. Preserve the existing content placeholders while ensuring the
skeleton and real card have identical dimensions to prevent layout shifts.
In `@apps/web/src/app/archive/wish/_hooks/useShareIntentWish.ts`:
- Around line 32-47: Update handleShareIntent in useShareIntentWish so
processing state is tracked per shared URL rather than with the single permanent
hasProcessedRef boolean. Allow subsequent different URLs to call
postWishLinkMutation while still ignoring duplicate shares of the same URL, and
preserve the existing invalid-URL toast behavior.
In `@apps/web/src/components/bottom-tab-bar/index.tsx`:
- Around line 46-47: Update the archive tab active-path condition in the bottom
tab bar to use the same boundary-aware matching as getRouteType.ts’s
matchesPath: accept only an exact ROUTES.WISHLIST or ROUTES.TOURNAMENT_HISTORY
path, or a path prefixed by that route followed by “/”. Remove the unrestricted
startsWith checks while preserving the existing tab selection behavior.
In `@apps/web/src/components/get-item-dialog/ByLinkDialog.tsx`:
- Around line 58-60: Remove the local onSuccess callback and useRouter
dependency from ByLinkDialog.tsx, relying on usePostWishLink for conditional
wishlist navigation. In apps/web/src/hooks/usePostWishOCR.ts at line 26, use
usePathname and only call router.push(ROUTES.WISHLIST) when the current pathname
differs from ROUTES.WISHLIST.
---
Nitpick comments:
In `@apps/web/src/app/archive/_common/_components/ArchivePageLayout.tsx`:
- Around line 26-27: Wrap the `{children}` content in ArchivePageLayout with a
semantic `<main>` landmark, preserving the existing layout container and child
rendering while ensuring the archive page body always has a main element.
- Around line 3-6: Rename the props type associated with the ArchivePageLayout
component from Props to ArchivePageLayoutProps, and update all references to use
the new component-specific type name.
In `@apps/web/src/app/archive/tournament/_components/ArchiveTournamentClient.tsx`:
- Around line 12-15: Update STATUS_BY_TAB in
apps/web/src/app/archive/tournament/_components/ArchiveTournamentClient.tsx:12-15
by adding an ES5 trailing comma after the final completed status array. Also add
a trailing comma after the final tab object in
apps/web/src/app/archive/tournament/_components/TournamentStatusTab.tsx:12-15.
In `@apps/web/src/app/archive/tournament/_components/TournamentHistoryList.tsx`:
- Around line 8-10: Rename the props type in TournamentHistoryList.tsx from
Props to TournamentHistoryListProps, and rename the corresponding props type in
TournamentStatusTab.tsx from Props to TournamentStatusTabProps. Update each
component’s type references consistently while keeping the existing type
declaration style.
In `@apps/web/src/app/archive/tournament/page.tsx`:
- Line 1: Replace the parent-directory relative imports with `@/` aliases: update
TournamentHistoryContent in page.tsx to use its absolute app path, and update
ArchivePageLayout in ArchiveTournamentClient.tsx to use the archive
common-components alias.
In `@apps/web/src/app/archive/wish/_apis/deleteWishes.ts`:
- Around line 6-8: Update the multi-line clientApi.delete call in the wish
deletion flow to end with a semicolon, following the project’s semicolon coding
guideline.
In `@apps/web/src/app/archive/wish/_components/FabMenu.tsx`:
- Line 18: Remove the outdated TODO comment near the add-item action in FabMenu,
since onAddItem already opens WishAddDialog through WishContentClient; either
leave the code without a comment or replace it with a brief comment describing
that existing dialog behavior.
In `@apps/web/src/app/archive/wish/_components/WishAddDialog.tsx`:
- Around line 6-9: Rename the props type `Props` used by the WishAddDialog
component to `WishAddDialogProps`, and update the component’s type annotation
references accordingly while preserving the existing prop fields and behavior.
In `@apps/web/src/app/archive/wish/_components/WishContentClient.tsx`:
- Around line 5-6: Update the useDeleteWishes and useShareIntentWish imports in
WishContentClient to use the `@/app/archive/wish/_hooks/`... absolute paths,
keeping relative imports only for files in the same directory.
In `@apps/web/src/app/archive/wish/_components/WishFab.tsx`:
- Around line 33-45: WishFab의 FAB trigger와 열린 메뉴 흐름에 접근 가능한 popover/dialog 동작을
추가하세요. trigger에 aria-expanded와 적절한 aria-haspopup 상태를 연결하고, 열린 상태에서 Escape로 닫히도록
처리하며 메뉴가 닫히면 trigger로 포커스를 복귀시키세요. backdrop 뒤 콘텐츠로 키보드 포커스가 이동하지 않도록 기존 FabMenu
또는 접근 가능한 popover/dialog primitive의 포커스 관리 기능을 활용하세요.
In `@apps/web/src/app/archive/wish/_components/WishlistBottomBar.tsx`:
- Around line 16-17: WishlistBottomBar의 선택 개수 컨테이너에서 고정 폭 클래스 w-[168px]를 제거하고,
콘텐츠 기반 폭이 사용되도록 좌우 패딩과 whitespace-nowrap을 적용하세요. 기존 높이·정렬·스타일은 유지하고, 선택된 개수 텍스트가
줄바꿈되지 않도록 span의 표시를 보장하세요.
In `@apps/web/src/app/archive/wish/page.tsx`:
- Around line 1-2: Update the imports in the archive wish page to use the `@/`
absolute paths for `ArchivePageLayout` and `WishContent`, referencing
`@/app/archive/_common/_components/ArchivePageLayout` and
`@/app/archive/wish/_components/WishContent` instead of relative project-module
paths.
In `@apps/web/src/components/common/wish-card/index.tsx`:
- Line 21: Update the `sizes` prop in the wish-card image configuration to
represent one card’s rendered width under the two-column `WishGrid` layout,
including the grid gap and container padding. Replace the current near-full-grid
mobile calculation while preserving the desktop width behavior.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI
Review profile: CHILL
Plan: Pro Plus
Run ID: 4e045270-57b6-433d-b220-46f7e470b947
📒 Files selected for processing (48)
apps/app/app/+native-intent.tsapps/app/components/ShareBottomSheet.tsxapps/app/hooks/useShareIntent.tsapps/web/next.config.mjsapps/web/src/apis/getWishlist.tsapps/web/src/app/archive/_common/_components/ArchivePageLayout.tsxapps/web/src/app/archive/_components/WishTab.tsxapps/web/src/app/archive/_components/tournament-history-content/client.tsxapps/web/src/app/archive/_types/wish.tsapps/web/src/app/archive/page.tsxapps/web/src/app/archive/tournament/_components/ArchiveTournamentClient.tsxapps/web/src/app/archive/tournament/_components/TournamentHistoryContent.tsxapps/web/src/app/archive/tournament/_components/TournamentHistoryList.tsxapps/web/src/app/archive/tournament/_components/TournamentStatusTab.tsxapps/web/src/app/archive/tournament/page.tsxapps/web/src/app/archive/wish/[id]/_hooks/useDeleteWish.tsapps/web/src/app/archive/wish/[id]/_hooks/usePatchWish.tsapps/web/src/app/archive/wish/[id]/layout.tsxapps/web/src/app/archive/wish/_apis/deleteWishes.tsapps/web/src/app/archive/wish/_components/FabMenu.tsxapps/web/src/app/archive/wish/_components/WishAddDialog.tsxapps/web/src/app/archive/wish/_components/WishCardSkeleton.tsxapps/web/src/app/archive/wish/_components/WishContent.tsxapps/web/src/app/archive/wish/_components/WishContentClient.tsxapps/web/src/app/archive/wish/_components/WishFab.tsxapps/web/src/app/archive/wish/_components/WishGridContent.tsxapps/web/src/app/archive/wish/_components/WishlistBottomBar.tsxapps/web/src/app/archive/wish/_components/WishlistFabArea.tsxapps/web/src/app/archive/wish/_components/WishlistList.tsxapps/web/src/app/archive/wish/_components/wish-grid/WishFailedCard.tsxapps/web/src/app/archive/wish/_components/wish-grid/WishProcessingCard.tsxapps/web/src/app/archive/wish/_components/wish-grid/index.tsxapps/web/src/app/archive/wish/_hooks/useDeleteWishes.tsapps/web/src/app/archive/wish/_hooks/useShareIntentWish.tsapps/web/src/app/archive/wish/page.tsxapps/web/src/app/notification/_utils/getNotificationRoute.tsapps/web/src/app/tournament/[id]/create/by-wish/_components/WishSelectCard.tsxapps/web/src/components/bottom-tab-bar/index.tsxapps/web/src/components/common/wish-card/index.tsxapps/web/src/components/get-item-dialog/ByLinkDialog.tsxapps/web/src/components/tournament-error-dialog/index.tsxapps/web/src/consts/route.tsapps/web/src/hooks/useNotificationSSE.tsapps/web/src/hooks/usePostWishLink.tsapps/web/src/hooks/usePostWishOCR.tsapps/web/src/types/wish.tsapps/web/src/utils/getRouteType.tsapps/web/src/utils/pushNotificationRoute.ts
💤 Files with no reviewable changes (4)
- apps/web/src/app/archive/_components/tournament-history-content/client.tsx
- apps/web/src/app/archive/_components/WishTab.tsx
- apps/web/src/app/archive/page.tsx
- apps/web/src/app/archive/_types/wish.ts
There was a problem hiding this comment.
Caution
Inline review comments failed to post. This is likely due to GitHub's internal server error or limits when posting large numbers of comments. If you are seeing this consistently it is likely a permissions issue. Please check "Moderation" -> "Code review limits" under your organization settings.
Actionable comments posted: 6
🧹 Nitpick comments (13)
apps/web/src/app/archive/_common/_components/ArchivePageLayout.tsx (2)
26-27: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win아카이브 본문을
<main>landmark로 감싸 주세요.현재
{children}이 직접 렌더링되어 페이지의 본문 landmark가 보장되지 않습니다.WishContentClient는div를 반환하고, 토너먼트 화면의<main>은 fallback에만 존재합니다.As per coding guidelines,
apps/web/src/**/*.{ts,tsx}에서는<main>,<h1>,<h2>같은 semantic HTML 태그를 사용해야 합니다.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@apps/web/src/app/archive/_common/_components/ArchivePageLayout.tsx` around lines 26 - 27, Wrap the `{children}` content in ArchivePageLayout with a semantic `<main>` landmark, preserving the existing layout container and child rendering while ensuring the archive page body always has a main element.Source: Coding guidelines
3-6: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winprops 타입명을 컴포넌트명 기반으로 바꿔 주세요.
type Props대신ArchivePageLayoutProps를 사용해야 타입의 소유 컴포넌트가 명확해집니다.As per coding guidelines, 컴포넌트 props 타입은
{ComponentName}Props형식을 사용해야 합니다.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@apps/web/src/app/archive/_common/_components/ArchivePageLayout.tsx` around lines 3 - 6, Rename the props type associated with the ArchivePageLayout component from Props to ArchivePageLayoutProps, and update all references to use the new component-specific type name.Source: Coding guidelines
apps/web/src/app/archive/wish/page.tsx (1)
1-2: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win프로젝트 모듈 import를
@/절대 경로로 통일해 주세요.두 import 모두 현재 파일과 동일 디렉터리가 아닌 경로를 상대 import하고 있습니다. 다음처럼 변경해 주세요.
@/app/archive/_common/_components/ArchivePageLayout@/app/archive/wish/_components/WishContentAs per coding guidelines,
apps/web/src/**/*.{ts,tsx}에서는 프로젝트 모듈에@/*절대 경로를 사용하고 상대 경로는 같은 디렉터리 파일에만 사용해야 합니다.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@apps/web/src/app/archive/wish/page.tsx` around lines 1 - 2, Update the imports in the archive wish page to use the `@/` absolute paths for `ArchivePageLayout` and `WishContent`, referencing `@/app/archive/_common/_components/ArchivePageLayout` and `@/app/archive/wish/_components/WishContent` instead of relative project-module paths.Source: Coding guidelines
apps/web/src/app/archive/tournament/_components/TournamentHistoryList.tsx (1)
8-10: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value컴포넌트별 props 타입명을 사용하세요.
apps/web/src/app/archive/tournament/_components/TournamentHistoryList.tsx#L8-L10:TournamentHistoryListProps로 변경하세요.apps/web/src/app/archive/tournament/_components/TournamentStatusTab.tsx#L7-L10:TournamentStatusTabProps로 변경하세요.As per coding guidelines, “Use TypeScript
typedeclarations instead ofinterface; appendTto shared type names and use{ComponentName}Propsfor component props.”🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@apps/web/src/app/archive/tournament/_components/TournamentHistoryList.tsx` around lines 8 - 10, Rename the props type in TournamentHistoryList.tsx from Props to TournamentHistoryListProps, and rename the corresponding props type in TournamentStatusTab.tsx from Props to TournamentStatusTabProps. Update each component’s type references consistently while keeping the existing type declaration style.Source: Coding guidelines
apps/web/src/app/archive/tournament/page.tsx (1)
1-1: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win상위 디렉터리 상대 import를
@/alias로 바꾸세요. 현재 파일과 다른 디렉터리의 모듈을 상대 경로로 가져오고 있습니다.
apps/web/src/app/archive/tournament/page.tsx#L1-L1:@/app/archive/tournament/_components/TournamentHistoryContent를 사용하세요.apps/web/src/app/archive/tournament/_components/ArchiveTournamentClient.tsx#L8-L8:@/app/archive/_common/_components/ArchivePageLayout를 사용하세요.수정 예시
-import TournamentHistoryContent from './_components/TournamentHistoryContent'; +import TournamentHistoryContent from '`@/app/archive/tournament/_components/TournamentHistoryContent`'; -import ArchivePageLayout from '../../_common/_components/ArchivePageLayout'; +import ArchivePageLayout from '`@/app/archive/_common/_components/ArchivePageLayout`';As per coding guidelines, “Use
@/*absolute imports forapps/web/src, and use relative imports for files in the same directory.”🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@apps/web/src/app/archive/tournament/page.tsx` at line 1, Replace the parent-directory relative imports with `@/` aliases: update TournamentHistoryContent in page.tsx to use its absolute app path, and update ArchivePageLayout in ArchiveTournamentClient.tsx to use the archive common-components alias.Source: Coding guidelines
apps/web/src/app/archive/tournament/_components/ArchiveTournamentClient.tsx (1)
12-15: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value마지막 배열·객체 항목에 ES5 후행 쉼표를 추가하세요.
apps/web/src/app/archive/tournament/_components/ArchiveTournamentClient.tsx#L12-L15:completed상태 배열 뒤에 쉼표를 추가하세요.apps/web/src/app/archive/tournament/_components/TournamentStatusTab.tsx#L12-L15: 마지막 탭 객체 뒤에 쉼표를 추가하세요.As per coding guidelines, “Use semicolons, single quotes, a print width of 100, ES5 trailing commas, and omit parentheses for single-argument arrow functions.”
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@apps/web/src/app/archive/tournament/_components/ArchiveTournamentClient.tsx` around lines 12 - 15, Update STATUS_BY_TAB in apps/web/src/app/archive/tournament/_components/ArchiveTournamentClient.tsx:12-15 by adding an ES5 trailing comma after the final completed status array. Also add a trailing comma after the final tab object in apps/web/src/app/archive/tournament/_components/TournamentStatusTab.tsx:12-15.Source: Coding guidelines
apps/web/src/app/archive/wish/_apis/deleteWishes.ts (1)
6-8: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value세미콜론을 추가하세요.
Line 8의 다중 행 호출을 세미콜론으로 끝내세요.
수정안
const { data } = await clientApi.delete<ApiResponseT<null>>( ENDPOINTS.WISHLISTS + `?ids=${wishIds.join(',')}` - ); + );As per coding guidelines, "Use semicolons" 규칙을 따르세요.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@apps/web/src/app/archive/wish/_apis/deleteWishes.ts` around lines 6 - 8, Update the multi-line clientApi.delete call in the wish deletion flow to end with a semicolon, following the project’s semicolon coding guideline.Source: Coding guidelines
apps/web/src/app/archive/wish/_components/FabMenu.tsx (1)
18-18: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win현재 동작과 맞지 않는 TODO를 정리해 주세요.
onAddItem은 이미WishContentClient에서WishAddDialog를 여는 동작으로 연결되어 있으므로 “추가 페이지가 생기면 연결”이라는 주석은 오래된 상태입니다. 실제 동작을 설명하는 주석으로 바꾸거나 삭제해 주세요.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@apps/web/src/app/archive/wish/_components/FabMenu.tsx` at line 18, Remove the outdated TODO comment near the add-item action in FabMenu, since onAddItem already opens WishAddDialog through WishContentClient; either leave the code without a comment or replace it with a brief comment describing that existing dialog behavior.apps/web/src/app/archive/wish/_components/WishFab.tsx (1)
33-45: 🎯 Functional Correctness | 🔵 Trivial | 🏗️ Heavy lift열린 FAB 메뉴에 키보드 및 팝오버 접근성 처리가 필요합니다.
현재 backdrop은 시각적으로 modal처럼 동작하지만
aria-expanded/aria-haspopup가 없고, Escape로 닫거나 메뉴를 닫은 뒤 trigger로 focus를 복귀시키는 로직도 없습니다. 키보드 사용자가 dimmed layer 뒤의 콘텐츠로 이동할 수 있으므로, ARIA 상태·Escape 처리·focus 복귀를 추가하거나 접근 가능한 popover/dialog primitive을 사용해 주세요.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@apps/web/src/app/archive/wish/_components/WishFab.tsx` around lines 33 - 45, WishFab의 FAB trigger와 열린 메뉴 흐름에 접근 가능한 popover/dialog 동작을 추가하세요. trigger에 aria-expanded와 적절한 aria-haspopup 상태를 연결하고, 열린 상태에서 Escape로 닫히도록 처리하며 메뉴가 닫히면 trigger로 포커스를 복귀시키세요. backdrop 뒤 콘텐츠로 키보드 포커스가 이동하지 않도록 기존 FabMenu 또는 접근 가능한 popover/dialog primitive의 포커스 관리 기능을 활용하세요.apps/web/src/components/common/wish-card/index.tsx (1)
21-21: 🚀 Performance & Scalability | 🔵 Trivial | ⚡ Quick win
sizes에 실제 2열 카드 폭을 전달해야 합니다.
WishGrid가grid-cols-2를 사용하므로 현재 값은 카드 한 장이 아니라 grid 전체 폭에 가깝습니다. 이 상태에서는 약 2배 큰 이미지 후보를 받아 네트워크와 디코딩 비용이 증가할 수 있습니다.수정 예시
- sizes="(max-width: 480px) calc(100vw - 40px - 8px), 216px" + sizes="(max-width: 480px) calc((100vw - 40px - 8px) / 2), 216px"🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@apps/web/src/components/common/wish-card/index.tsx` at line 21, Update the `sizes` prop in the wish-card image configuration to represent one card’s rendered width under the two-column `WishGrid` layout, including the grid gap and container padding. Replace the current near-full-grid mobile calculation while preserving the desktop width behavior.apps/web/src/app/archive/wish/_components/WishContentClient.tsx (1)
5-6: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win프로젝트 모듈 import를 절대 경로로 통일해주세요.
../_hooks/...는 같은 디렉터리 import가 아니므로@/app/archive/wish/_hooks/...로 변경해야 합니다.수정 예시
-import { useDeleteWishes } from '../_hooks/useDeleteWishes'; -import { useShareIntentWish } from '../_hooks/useShareIntentWish'; +import { useDeleteWishes } from '`@/app/archive/wish/_hooks/useDeleteWishes`'; +import { useShareIntentWish } from '`@/app/archive/wish/_hooks/useShareIntentWish`';As per coding guidelines:
apps/web/src/**/*.{ts,tsx}프로젝트 모듈은@/*절대 경로를 사용하고 상대 경로는 동일 디렉터리 파일에만 사용해야 합니다.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@apps/web/src/app/archive/wish/_components/WishContentClient.tsx` around lines 5 - 6, Update the useDeleteWishes and useShareIntentWish imports in WishContentClient to use the `@/app/archive/wish/_hooks/`... absolute paths, keeping relative imports only for files in the same directory.Source: Coding guidelines
apps/web/src/app/archive/wish/_components/WishAddDialog.tsx (1)
6-9: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win컴포넌트 props 타입명을 명확히 해주세요.
Props대신WishAddDialogProps를 사용해 컴포넌트와 타입의 관계를 드러내야 합니다.수정 예시
-type Props = { +type WishAddDialogProps = { open: boolean; onOpenChange: (open: boolean) => void; }; -function WishAddDialog({ open, onOpenChange }: Props) { +function WishAddDialog({ open, onOpenChange }: WishAddDialogProps) {As per coding guidelines: 컴포넌트 props 타입은
{ComponentName}Props형식으로 명명해야 합니다.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@apps/web/src/app/archive/wish/_components/WishAddDialog.tsx` around lines 6 - 9, Rename the props type `Props` used by the WishAddDialog component to `WishAddDialogProps`, and update the component’s type annotation references accordingly while preserving the existing prop fields and behavior.Source: Coding guidelines
apps/web/src/app/archive/wish/_components/WishlistBottomBar.tsx (1)
16-17: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win모바일 UI의 고정 폭을 제거해주세요.
w-[168px]는 모바일 화면과 선택 개수 텍스트에 불필요한 고정 제약을 만듭니다. 좌우 padding과whitespace-nowrap로 콘텐츠 기반 폭을 사용하세요.수정 예시
-<div className="flex h-[68px] w-[168px] items-center justify-center rounded-full bg-bg-layer-default shadow-[0px_0px_8px_0px_rgba(0,0,0,0.04)]"> +<div className="flex h-[68px] items-center justify-center whitespace-nowrap rounded-full bg-bg-layer-default px-5 shadow-[0px_0px_8px_0px_rgba(0,0,0,0.04)]">As per coding guidelines: 모바일 UI에서는 고정 폭 대신
w-full,px-5,max-w-*패턴을 선호해야 합니다.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@apps/web/src/app/archive/wish/_components/WishlistBottomBar.tsx` around lines 16 - 17, WishlistBottomBar의 선택 개수 컨테이너에서 고정 폭 클래스 w-[168px]를 제거하고, 콘텐츠 기반 폭이 사용되도록 좌우 패딩과 whitespace-nowrap을 적용하세요. 기존 높이·정렬·스타일은 유지하고, 선택된 개수 텍스트가 줄바꿈되지 않도록 span의 표시를 보장하세요.Source: Coding guidelines
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@apps/web/src/app/archive/wish/_components/FabMenu.tsx`:
- Line 11: Update the FabMenu container’s width styling to use a fluid width
with w-full and cap it at 184px via max-w-[184px], replacing the fixed w-[184px]
class while preserving the remaining layout and styling classes.
In `@apps/web/src/app/archive/wish/_components/wish-grid/WishFailedCard.tsx`:
- Line 7: Update the status text in WishFailedCard.tsx to “가져오는 데 실패했어요” and the
corresponding status text in WishProcessingCard.tsx to “상품을 담는 중...”.
In `@apps/web/src/app/archive/wish/_components/WishCardSkeleton.tsx`:
- Around line 5-11: Update WishCardSkeleton to match WishCard’s aspect-[0.765]
card sizing and flex-1 image-area behavior instead of using the fixed h-[143px]
skeleton height. Preserve the existing content placeholders while ensuring the
skeleton and real card have identical dimensions to prevent layout shifts.
In `@apps/web/src/app/archive/wish/_hooks/useShareIntentWish.ts`:
- Around line 32-47: Update handleShareIntent in useShareIntentWish so
processing state is tracked per shared URL rather than with the single permanent
hasProcessedRef boolean. Allow subsequent different URLs to call
postWishLinkMutation while still ignoring duplicate shares of the same URL, and
preserve the existing invalid-URL toast behavior.
In `@apps/web/src/components/bottom-tab-bar/index.tsx`:
- Around line 46-47: Update the archive tab active-path condition in the bottom
tab bar to use the same boundary-aware matching as getRouteType.ts’s
matchesPath: accept only an exact ROUTES.WISHLIST or ROUTES.TOURNAMENT_HISTORY
path, or a path prefixed by that route followed by “/”. Remove the unrestricted
startsWith checks while preserving the existing tab selection behavior.
In `@apps/web/src/components/get-item-dialog/ByLinkDialog.tsx`:
- Around line 58-60: Remove the local onSuccess callback and useRouter
dependency from ByLinkDialog.tsx, relying on usePostWishLink for conditional
wishlist navigation. In apps/web/src/hooks/usePostWishOCR.ts at line 26, use
usePathname and only call router.push(ROUTES.WISHLIST) when the current pathname
differs from ROUTES.WISHLIST.
---
Nitpick comments:
In `@apps/web/src/app/archive/_common/_components/ArchivePageLayout.tsx`:
- Around line 26-27: Wrap the `{children}` content in ArchivePageLayout with a
semantic `<main>` landmark, preserving the existing layout container and child
rendering while ensuring the archive page body always has a main element.
- Around line 3-6: Rename the props type associated with the ArchivePageLayout
component from Props to ArchivePageLayoutProps, and update all references to use
the new component-specific type name.
In `@apps/web/src/app/archive/tournament/_components/ArchiveTournamentClient.tsx`:
- Around line 12-15: Update STATUS_BY_TAB in
apps/web/src/app/archive/tournament/_components/ArchiveTournamentClient.tsx:12-15
by adding an ES5 trailing comma after the final completed status array. Also add
a trailing comma after the final tab object in
apps/web/src/app/archive/tournament/_components/TournamentStatusTab.tsx:12-15.
In `@apps/web/src/app/archive/tournament/_components/TournamentHistoryList.tsx`:
- Around line 8-10: Rename the props type in TournamentHistoryList.tsx from
Props to TournamentHistoryListProps, and rename the corresponding props type in
TournamentStatusTab.tsx from Props to TournamentStatusTabProps. Update each
component’s type references consistently while keeping the existing type
declaration style.
In `@apps/web/src/app/archive/tournament/page.tsx`:
- Line 1: Replace the parent-directory relative imports with `@/` aliases: update
TournamentHistoryContent in page.tsx to use its absolute app path, and update
ArchivePageLayout in ArchiveTournamentClient.tsx to use the archive
common-components alias.
In `@apps/web/src/app/archive/wish/_apis/deleteWishes.ts`:
- Around line 6-8: Update the multi-line clientApi.delete call in the wish
deletion flow to end with a semicolon, following the project’s semicolon coding
guideline.
In `@apps/web/src/app/archive/wish/_components/FabMenu.tsx`:
- Line 18: Remove the outdated TODO comment near the add-item action in FabMenu,
since onAddItem already opens WishAddDialog through WishContentClient; either
leave the code without a comment or replace it with a brief comment describing
that existing dialog behavior.
In `@apps/web/src/app/archive/wish/_components/WishAddDialog.tsx`:
- Around line 6-9: Rename the props type `Props` used by the WishAddDialog
component to `WishAddDialogProps`, and update the component’s type annotation
references accordingly while preserving the existing prop fields and behavior.
In `@apps/web/src/app/archive/wish/_components/WishContentClient.tsx`:
- Around line 5-6: Update the useDeleteWishes and useShareIntentWish imports in
WishContentClient to use the `@/app/archive/wish/_hooks/`... absolute paths,
keeping relative imports only for files in the same directory.
In `@apps/web/src/app/archive/wish/_components/WishFab.tsx`:
- Around line 33-45: WishFab의 FAB trigger와 열린 메뉴 흐름에 접근 가능한 popover/dialog 동작을
추가하세요. trigger에 aria-expanded와 적절한 aria-haspopup 상태를 연결하고, 열린 상태에서 Escape로 닫히도록
처리하며 메뉴가 닫히면 trigger로 포커스를 복귀시키세요. backdrop 뒤 콘텐츠로 키보드 포커스가 이동하지 않도록 기존 FabMenu
또는 접근 가능한 popover/dialog primitive의 포커스 관리 기능을 활용하세요.
In `@apps/web/src/app/archive/wish/_components/WishlistBottomBar.tsx`:
- Around line 16-17: WishlistBottomBar의 선택 개수 컨테이너에서 고정 폭 클래스 w-[168px]를 제거하고,
콘텐츠 기반 폭이 사용되도록 좌우 패딩과 whitespace-nowrap을 적용하세요. 기존 높이·정렬·스타일은 유지하고, 선택된 개수 텍스트가
줄바꿈되지 않도록 span의 표시를 보장하세요.
In `@apps/web/src/app/archive/wish/page.tsx`:
- Around line 1-2: Update the imports in the archive wish page to use the `@/`
absolute paths for `ArchivePageLayout` and `WishContent`, referencing
`@/app/archive/_common/_components/ArchivePageLayout` and
`@/app/archive/wish/_components/WishContent` instead of relative project-module
paths.
In `@apps/web/src/components/common/wish-card/index.tsx`:
- Line 21: Update the `sizes` prop in the wish-card image configuration to
represent one card’s rendered width under the two-column `WishGrid` layout,
including the grid gap and container padding. Replace the current near-full-grid
mobile calculation while preserving the desktop width behavior.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI
Review profile: CHILL
Plan: Pro Plus
Run ID: 4e045270-57b6-433d-b220-46f7e470b947
📒 Files selected for processing (48)
apps/app/app/+native-intent.tsapps/app/components/ShareBottomSheet.tsxapps/app/hooks/useShareIntent.tsapps/web/next.config.mjsapps/web/src/apis/getWishlist.tsapps/web/src/app/archive/_common/_components/ArchivePageLayout.tsxapps/web/src/app/archive/_components/WishTab.tsxapps/web/src/app/archive/_components/tournament-history-content/client.tsxapps/web/src/app/archive/_types/wish.tsapps/web/src/app/archive/page.tsxapps/web/src/app/archive/tournament/_components/ArchiveTournamentClient.tsxapps/web/src/app/archive/tournament/_components/TournamentHistoryContent.tsxapps/web/src/app/archive/tournament/_components/TournamentHistoryList.tsxapps/web/src/app/archive/tournament/_components/TournamentStatusTab.tsxapps/web/src/app/archive/tournament/page.tsxapps/web/src/app/archive/wish/[id]/_hooks/useDeleteWish.tsapps/web/src/app/archive/wish/[id]/_hooks/usePatchWish.tsapps/web/src/app/archive/wish/[id]/layout.tsxapps/web/src/app/archive/wish/_apis/deleteWishes.tsapps/web/src/app/archive/wish/_components/FabMenu.tsxapps/web/src/app/archive/wish/_components/WishAddDialog.tsxapps/web/src/app/archive/wish/_components/WishCardSkeleton.tsxapps/web/src/app/archive/wish/_components/WishContent.tsxapps/web/src/app/archive/wish/_components/WishContentClient.tsxapps/web/src/app/archive/wish/_components/WishFab.tsxapps/web/src/app/archive/wish/_components/WishGridContent.tsxapps/web/src/app/archive/wish/_components/WishlistBottomBar.tsxapps/web/src/app/archive/wish/_components/WishlistFabArea.tsxapps/web/src/app/archive/wish/_components/WishlistList.tsxapps/web/src/app/archive/wish/_components/wish-grid/WishFailedCard.tsxapps/web/src/app/archive/wish/_components/wish-grid/WishProcessingCard.tsxapps/web/src/app/archive/wish/_components/wish-grid/index.tsxapps/web/src/app/archive/wish/_hooks/useDeleteWishes.tsapps/web/src/app/archive/wish/_hooks/useShareIntentWish.tsapps/web/src/app/archive/wish/page.tsxapps/web/src/app/notification/_utils/getNotificationRoute.tsapps/web/src/app/tournament/[id]/create/by-wish/_components/WishSelectCard.tsxapps/web/src/components/bottom-tab-bar/index.tsxapps/web/src/components/common/wish-card/index.tsxapps/web/src/components/get-item-dialog/ByLinkDialog.tsxapps/web/src/components/tournament-error-dialog/index.tsxapps/web/src/consts/route.tsapps/web/src/hooks/useNotificationSSE.tsapps/web/src/hooks/usePostWishLink.tsapps/web/src/hooks/usePostWishOCR.tsapps/web/src/types/wish.tsapps/web/src/utils/getRouteType.tsapps/web/src/utils/pushNotificationRoute.ts
💤 Files with no reviewable changes (4)
- apps/web/src/app/archive/_components/tournament-history-content/client.tsx
- apps/web/src/app/archive/_components/WishTab.tsx
- apps/web/src/app/archive/page.tsx
- apps/web/src/app/archive/_types/wish.ts
🛑 Comments failed to post (6)
apps/web/src/app/archive/wish/_components/FabMenu.tsx (1)
11-11: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
모바일 메뉴의 폭을 고정하지 말아 주세요.
w-[184px]는 좁은 viewport에서 화면을 넘길 수 있습니다. 유동 폭을 사용하고max-w-[184px]를 상한으로 두는 방식으로 변경해 주세요.수정 예시
- <div className="absolute right-0 bottom-full mb-3 flex w-[184px] flex-col items-start rounded-2xl border border-border-neutral-muted bg-white p-2 shadow-[0_1px_8px_0_rgba(0,0,0,0.10)]"> + <div className="absolute right-0 bottom-full mb-3 flex w-[calc(100vw-40px)] max-w-[184px] flex-col items-start rounded-2xl border border-border-neutral-muted bg-white p-2 shadow-[0_1px_8px_0_rgba(0,0,0,0.10)]">As per coding guidelines:
apps/web/**/*.{tsx,css}에서는 모바일 UI에 고정 폭을 사용하지 말고w-full및max-w-*패턴을 선호해야 합니다.📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.<div className="absolute right-0 bottom-full mb-3 flex w-[calc(100vw-40px)] max-w-[184px] flex-col items-start rounded-2xl border border-border-neutral-muted bg-white p-2 shadow-[0_1px_8px_0_rgba(0,0,0,0.10)]">🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@apps/web/src/app/archive/wish/_components/FabMenu.tsx` at line 11, Update the FabMenu container’s width styling to use a fluid width with w-full and cap it at 184px via max-w-[184px], replacing the fixed w-[184px] class while preserving the remaining layout and styling classes.Source: Coding guidelines
apps/web/src/app/archive/wish/_components/wish-grid/WishFailedCard.tsx (1)
7-7: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
사용자 노출 상태 문구의 띄어쓰기를 수정해 주세요.
두 상태 문구 모두 한국어 띄어쓰기가 어색합니다.
apps/web/src/app/archive/wish/_components/wish-grid/WishFailedCard.tsx#L7-L7:가져오는 데 실패했어요로 수정하세요.apps/web/src/app/archive/wish/_components/wish-grid/WishProcessingCard.tsx#L7-L7:상품을 담는 중...으로 수정하세요.📍 Affects 2 files
apps/web/src/app/archive/wish/_components/wish-grid/WishFailedCard.tsx#L7-L7(this comment)apps/web/src/app/archive/wish/_components/wish-grid/WishProcessingCard.tsx#L7-L7🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@apps/web/src/app/archive/wish/_components/wish-grid/WishFailedCard.tsx` at line 7, Update the status text in WishFailedCard.tsx to “가져오는 데 실패했어요” and the corresponding status text in WishProcessingCard.tsx to “상품을 담는 중...”.apps/web/src/app/archive/wish/_components/WishCardSkeleton.tsx (1)
5-11: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
로딩 카드가 실제 카드와 동일한 크기를 사용해야 합니다.
WishCard는aspect-[0.765]와flex-1이미지 영역을 사용하지만, skeleton은h-[143px]로 고정되어 있습니다. 페이지네이션 중 skeleton이 표시됐다가 실제 카드로 교체될 때 카드 높이가 달라져 레이아웃 시프트가 발생합니다.수정 예시
- <div className="flex flex-col overflow-hidden rounded-2xl bg-white"> - <Skeleton className="h-[143px] w-full" /> + <div className="flex aspect-[0.765] flex-col overflow-hidden rounded-2xl bg-white"> + <Skeleton className="min-h-0 w-full flex-1" />📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.<div className="flex aspect-[0.765] flex-col overflow-hidden rounded-2xl bg-white"> <Skeleton className="min-h-0 w-full flex-1" /> <div className="flex flex-col items-center gap-[9px] px-3 py-3"> <Skeleton className="h-4 w-3/4" /> <Skeleton className="h-5 w-1/2" /> </div> </div>🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@apps/web/src/app/archive/wish/_components/WishCardSkeleton.tsx` around lines 5 - 11, Update WishCardSkeleton to match WishCard’s aspect-[0.765] card sizing and flex-1 image-area behavior instead of using the fixed h-[143px] skeleton height. Preserve the existing content placeholders while ensuring the skeleton and real card have identical dimensions to prevent layout shifts.apps/web/src/app/archive/wish/_hooks/useShareIntentWish.ts (1)
32-47: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
후속 공유 인텐트가 영구적으로 무시됩니다.
hasProcessedRef가 한 번true가 되면 다시 초기화되지 않습니다. 이미/archive/wish에 있는 상태에서 다음 공유가 들어오면 앱은 새 메시지를 전송하지만, Line 38에서 반환되어 위시 등록이 실행되지 않습니다. URL별로 중복만 막도록 바꾸세요.수정안
-export const useShareIntentWish = () => { - const hasProcessedRef = useRef(false); +export const useShareIntentWish = () => { + const lastProcessedUrlRef = useRef<string | null>(null); const { postWishLinkMutation } = usePostWishLink(); const handleShareIntent = useCallback( (payload: ShareIntentPayloadT) => { - if (hasProcessedRef.current) return; - const url = getUrlFromShareIntent(payload); if (!url) { toast.error('공유된 링크를 찾을 수 없어요'); return; } - hasProcessedRef.current = true; + if (lastProcessedUrlRef.current === url) return; + lastProcessedUrlRef.current = url; postWishLinkMutation(url); }, [postWishLinkMutation] );📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.const lastProcessedUrlRef = useRef<string | null>(null); const { postWishLinkMutation } = usePostWishLink(); const handleShareIntent = useCallback( (payload: ShareIntentPayloadT) => { const url = getUrlFromShareIntent(payload); if (!url) { toast.error('공유된 링크를 찾을 수 없어요'); return; } if (lastProcessedUrlRef.current === url) return; lastProcessedUrlRef.current = url; postWishLinkMutation(url);🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@apps/web/src/app/archive/wish/_hooks/useShareIntentWish.ts` around lines 32 - 47, Update handleShareIntent in useShareIntentWish so processing state is tracked per shared URL rather than with the single permanent hasProcessedRef boolean. Allow subsequent different URLs to call postWishLinkMutation while still ignoring duplicate shares of the same URL, and preserve the existing invalid-URL toast behavior.apps/web/src/components/bottom-tab-bar/index.tsx (1)
46-47: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
보관 탭 활성 판정에 경로 경계를 추가해 주세요.
startsWith(ROUTES.WISHLIST)는/archive/wishlist처럼/archive/wish로 시작하지만 실제 하위 경로가 아닌 URL에서도 탭을 활성화합니다.getRouteType.ts의matchesPath와 동일하게 정확한 경로 또는${basePath}/prefix만 허용해야 합니다.수정 예시
- ? pathname.startsWith(ROUTES.WISHLIST) || - pathname.startsWith(ROUTES.TOURNAMENT_HISTORY) + ? pathname === ROUTES.WISHLIST || + pathname.startsWith(`${ROUTES.WISHLIST}/`) || + pathname === ROUTES.TOURNAMENT_HISTORY || + pathname.startsWith(`${ROUTES.TOURNAMENT_HISTORY}/`)📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.? pathname === ROUTES.WISHLIST || pathname.startsWith(`${ROUTES.WISHLIST}/`) || pathname === ROUTES.TOURNAMENT_HISTORY || pathname.startsWith(`${ROUTES.TOURNAMENT_HISTORY}/`)🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@apps/web/src/components/bottom-tab-bar/index.tsx` around lines 46 - 47, Update the archive tab active-path condition in the bottom tab bar to use the same boundary-aware matching as getRouteType.ts’s matchesPath: accept only an exact ROUTES.WISHLIST or ROUTES.TOURNAMENT_HISTORY path, or a path prefixed by that route followed by “/”. Remove the unrestricted startsWith checks while preserving the existing tab selection behavior.apps/web/src/components/get-item-dialog/ByLinkDialog.tsx (1)
58-60: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash set -euo pipefail printf '\n## ByLinkDialog.tsx\n' cat -n apps/web/src/components/get-item-dialog/ByLinkDialog.tsx | sed -n '1,220p' printf '\n## usePostWishOCR.ts\n' cat -n apps/web/src/hooks/usePostWishOCR.ts | sed -n '1,220p' printf '\n## usePostWishLink.ts\n' cat -n apps/web/src/hooks/usePostWishLink.ts | sed -n '1,220p' printf '\n## search ROUTES.WISHLIST and usePathname\n' rg -n "ROUTES\.WISHLIST|usePathname\(" apps/web/src -g '!**/*.map'Repository: TeamPiKi/client
Length of output: 10698
위시 추가 후 현재 경로와 중복 이동하지 않도록 정리해 주세요.
usePostWishLink가 이미 성공 시ROUTES.WISHLIST로의 조건부 라우팅을 담당하므로,ByLinkDialog.tsx의 로컬onSuccess와useRouter는 제거해 주세요.
또usePostWishOCR.ts도usePathname()으로 현재 경로를 확인해pathname !== ROUTES.WISHLIST일 때만router.push(ROUTES.WISHLIST)하도록 맞춰 주세요.📍 Affects 2 files
apps/web/src/components/get-item-dialog/ByLinkDialog.tsx#L58-L60(this comment)apps/web/src/hooks/usePostWishOCR.ts#L26-L26🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@apps/web/src/components/get-item-dialog/ByLinkDialog.tsx` around lines 58 - 60, Remove the local onSuccess callback and useRouter dependency from ByLinkDialog.tsx, relying on usePostWishLink for conditional wishlist navigation. In apps/web/src/hooks/usePostWishOCR.ts at line 26, use usePathname and only call router.push(ROUTES.WISHLIST) when the current pathname differs from ROUTES.WISHLIST.
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@apps/web/src/app/archive/wish/_hooks/useShareIntentWish.ts`:
- Around line 32-47: Update handleShareIntent and its postWishLinkMutation
callback handling so a URL added to processedUrlsRef is deleted when the share
request fails, including 4xx/5xx and network errors. Use the mutation’s onError
or onSettled path to call processedUrlsRef.current.delete(url), while preserving
the existing duplicate suppression and successful-request behavior.
In `@apps/web/src/components/get-item-dialog/ByLinkDialog.tsx`:
- Around line 50-56: Update the wish submission handling in ByLinkDialog’s
postWishLinkMutation call so the dialog closes via onSuccess only; move
onOpenChange(false) and resetState() out of onSettled, preserving the dialog and
its state when the mutation fails.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI
Review profile: CHILL
Plan: Pro Plus
Run ID: 4fba8ae0-0c63-4588-bb2f-5f77e99d0208
📒 Files selected for processing (4)
apps/web/src/app/archive/wish/_hooks/useShareIntentWish.tsapps/web/src/components/bottom-tab-bar/index.tsxapps/web/src/components/get-item-dialog/ByLinkDialog.tsxapps/web/src/hooks/usePostWishOCR.ts
🚧 Files skipped from review as they are similar to previous changes (2)
- apps/web/src/hooks/usePostWishOCR.ts
- apps/web/src/components/bottom-tab-bar/index.tsx
* refactor: /archive 탭 쿼리 파라미터를 /archive/wish, /archive/tournament 경로로 분리 * refactor: 구버전 /archive(?tab=) 경로를 신규 경로로 리다이렉트 * refactor: 옛 /wish 페이지 잔재 정리 및 archive 콜로케이션 재배치 * fix: 위시 페이지 체류 중 후속 공유 인텐트가 무시되던 문제 수정 * fix: 보관 탭 활성 판정 경로 경계 추가 및 위시 추가 후 중복 라우팅 제거 * fix: 공유 인텐트 실패 URL 잠금 해제 및 링크 담기 실패 시 다이얼로그 유지
작업 요약
/archive?tab=)를 위시리스트(/archive/wish) / 내 토너먼트(/archive/tournament) 두 페이지로 분리했습니다.작업 내용
1.
/archive탭 쿼리 파라미터를 경로로 분리/archive?tab=wish→/archive/wish(위시리스트),/archive?tab=tournament→/archive/tournament(내 토너먼트)로 페이지 분리ROUTES.ARCHIVE_BASE/ROUTES.ARCHIVE(tab)제거 →ROUTES.WISHLIST,ROUTES.TOURNAMENT_HISTORY신설,getRouteType의 MEMBER_ONLY 가드 동기화WishTab) 제거, 헤더 타이틀을 페이지별로 분리 (위시리스트 / 내 토너먼트)TournamentStatusTab), status 파라미터로 토너먼트 목록 필터링2. 구버전
/archive경로 호환 리다이렉트next.config.mjs에redirects()추가:/archive→/archive/wish,/archive?tab=tournament→/archive/tournament(307)/archive?tab=wish하드코딩)와 기발송 딥링크가 404 나지 않도록 유지 — 구버전 앱이 사라지면 제거 예정3. 옛
/wish페이지 잔재 정리 (네이밍 + 콜로케이션)WishlistLayout→ArchivePageLayout— 위시/토너먼트 페이지가 공유하는 레이아웃이라archive/_common/_components/로 이동WishlistTabContent→WishGridContent— 상단 탭 제거에 따른 이름 정리useWishlistDelete→useDeleteWishes— 파일명·API 훅 컨벤션(use+ 함수명) 일치archive/루트 →archive/wish/하위로 콜로케이션 재배치WishCard는 토너먼트 by-wish 페이지와 공유하므로components/common/wish-card/로 이동src/apis/getWishlist.ts가app/archive/_types/를 역참조하던 레이어 꼬임 해소 —WishItemT는src/types/wish.ts로 이동,archive/_types/삭제스크린샷
/archive/wish/archive/tournament연관 이슈
closes #341
Summary by CodeRabbit
/archive/wish,/archive/tournament로 분리되고, 토너먼트에는 ‘진행 중/완료’ 탭 UI가 추가되었습니다.