Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor: 검색 결과 페이지 리팩토링 #265

Merged
merged 25 commits into from
Dec 22, 2024
Merged

Conversation

areumH
Copy link
Collaborator

@areumH areumH commented Dec 16, 2024

💡 작업 내용

  • 톡픽 검색 결과 아이템에 이미지가 있을 때만 이미지가 보이도록 수정
  • 톡픽 검색 결과 내용에 검색어 컬러 처리 오류 수정
  • 톡픽 검색 결과 아이템 클릭 시 해당 톡픽 페이지로 이동되도록 수정
  • 밸런스게임 검색 api 엔드 포인트 수정 및 카드에 잘못 전달되던 게임 아이디 수정
  • 검색 서치 바에 텍스트 입력 후 엔터 키를 눌러도 버튼 클릭과 같은 함수가 실행되도록 수정
  • 검색 결과 페이지의 page 쿼리 값을 1부터 시작되도록 수정
  • 톡픽 조회 페이지에서 상세 내용에 줄바꿈이 적용되도록 수정
  • 모바일 상태로 톡픽 상세 조회 시 투표 바 버튼이 블러로 완전히 가려지지 않던 오류 수정

💡 자세한 설명

✅ SearchTalkPickItem

  • 해당 아이템 클릭 시 톡픽 상세 페이지로 이동되도록 props에 함수를 추가했습니다.
  • 검색 결과에 이미지가 존재할 때만 이미지가 보여지도록 수정했습니다.
  • 검색 결과 내용의 display: flex 스타일 때문에 톡픽의 내용이 한 줄로 출력되지 않던 문제를 display: inline으로 수정하여 해결했습니다.

✅ 게임 검색 관련

  • 밸런스게임 검색의 엔드 포인트를 games에서 game-sets로 수정해두었습니다.
  • ContentsButton를 클릭할 때 넘겨주는 함수의 게임 아이디가 gameSetId가 아닌 id로 되어있어 이를 수정했습니다.

✅ TalkPickSection

  • 톡픽 내용에 줄바꿈이 반영되지 않던 문제를 해결했습니다.
  • 페이지의 가로 길이를 줄였을 때 투표 바의 블러 처리가 왼쪽으로 쏠리던 현상이 있어 이를 수정했습니다.

✅ usePagination

  • url에 page 쿼리 값이 0부터 시작되도록 되어있어 이를 1부터 시작되도록 수정하였고, 이를 톡앤픽 플레이스에도 훅을 사용하도록 반영했습니다.
-.Clipchamp.4.mp4

📗 참고 자료 (선택)

📢 리뷰 요구 사항 (선택)

🚩 후속 작업 (선택)

✅ 셀프 체크리스트

  • PR 제목을 형식에 맞게 작성했나요?
  • 브랜치 전략에 맞는 브랜치에 PR을 올리고 있나요? (master/main이 아닙니다.)
  • 이슈는 close 했나요?
  • Reviewers, Labels, Projects를 등록했나요?
  • 작업 도중 문서 수정이 필요한 경우 잘 수정했나요?
  • 테스트는 잘 통과했나요?
  • 불필요한 코드는 제거했나요?

closes #260

Summary by CodeRabbit

  • 신규 기능

    • 검색 바에서 'Enter' 키 입력 시 검색 기능 활성화.
    • 클릭 시 탐색 기능을 추가한 SearchTalkPickItem 컴포넌트.
    • SearchTalkPickListSearchGameList의 데이터 구조 변경 및 상호작용 개선.
  • 버그 수정

    • 이미지 URL이 제공되지 않을 경우 빈 이미지 컨테이너 렌더링 방지.
  • 스타일

    • 다양한 컴포넌트의 스타일 수정으로 레이아웃 및 가독성 향상.
    • 모바일 화면에 맞춘 CategoryButton의 패딩 및 테두리 반경 조정.
  • 문서화

    • 스토리북에서 샘플 데이터 및 라우팅 기능 추가.

@areumH areumH added ✔︎pull requests pull requests 코드 체크 요청 ✨feature 구현, 개선 사항 관련 부분 👩🏻‍💻 frontend 프론트엔드 작업 🪄refactor 리팩토링 labels Dec 16, 2024
@areumH areumH requested review from WonJuneKim and alwubin December 16, 2024 17:51
@areumH areumH self-assigned this Dec 16, 2024
Copy link
Contributor

coderabbitai bot commented Dec 16, 2024

개요

워크스루

이 풀 리퀘스트는 검색 결과 페이지와 관련된 여러 컴포넌트의 리팩토링을 포함합니다. 주요 변경 사항은 검색 바의 엔터 키 핸들링, 톡픽 및 게임 검색 결과 아이템의 타입 변경, 페이지네이션 로직 업데이트, 그리고 일부 컴포넌트의 스타일 및 네비게이션 로직 개선을 포함합니다.

변경 사항

파일 변경 요약
SearchBar.tsx 엔터 키 핸들러 추가
SearchTalkPickItem.tsx 클릭 이벤트 및 이미지 조건부 렌더링 추가
SearchGameList.tsx 게임 리스트 타입 및 네비게이션 로직 변경
SearchTalkPickList.tsx 톡픽 리스트 네비게이션 기능 추가
api.ts 게임 검색 엔드포인트 변경
usePagination.ts 페이지네이션 로직 업데이트
search.ts 검색 관련 타입 리팩토링

평가 (연결된 이슈 대비)

목표 달성 여부 설명
톡픽 검색 결과 아이템 클릭 시 페이지 이동 톡픽 리스트에 네비게이션 로직 추가
톡픽 검색 결과 아이템 이미지 UI 개선 이미지 조건부 렌더링 추가
검색 바 엔터 키 핸들링 엔터 키 이벤트 핸들러 구현

가능성 있는 관련 PR

제안된 라벨

✅feature

제안된 리뷰어

  • hsgh085
  • alwubin
  • WonJuneKim

시퀀스 다이어그램

sequenceDiagram
    participant User
    participant SearchBar
    participant SearchResultPage
    participant NavigationService

    User->>SearchBar: 검색어 입력
    User->>SearchBar: Enter 키 누름
    SearchBar->>SearchResultPage: 검색 요청
    SearchResultPage->>NavigationService: 결과 페이지로 이동
    SearchResultPage->>User: 검색 결과 표시
Loading

시 (토끼의 노래)

검색의 바다를 항해하며
엔터 키는 마법의 노 되어
결과의 세계를 열어가네
코드의 토끼 춤추듯
새로운 길을 만들어가네 🐰✨

Tip

CodeRabbit's docstrings feature is now available as part of our Early Access Program! Simply use the command @coderabbitai generate docstrings to have CodeRabbit automatically generate docstrings for your pull request. We would love to hear your feedback on Discord.


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

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

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

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

CodeRabbit Commands (Invoked using PR comments)

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

Other keywords and placeholders

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

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.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🧹 Nitpick comments (4)
src/components/molecules/VotePrototype/VotePrototype.tsx (1)

Line range hint 28-143: 컴포넌트 구조 개선을 위한 제안

현재 컴포넌트가 다음과 같은 여러 책임을 가지고 있습니다:

  • 로그인/비로그인 상태 관리
  • 투표 상태 관리
  • 로컬 스토리지 관리
  • UI 렌더링

다음과 같은 리팩토링을 제안드립니다:

  1. 투표 로직을 별도의 커스텀 훅으로 분리
  2. 로그인 상태 관련 로직을 별도의 컴포넌트로 분리
  3. UI 렌더링 부분만 남기는 방향으로 개선

예시 코드를 생성해드릴까요?

src/components/atoms/SearchBar/SearchBar.tsx (1)

27-34: 검색 중 상태 처리를 고려해보세요.

검색 실행 시 로딩 상태를 표시하면 사용자 경험을 더욱 개선할 수 있습니다.

다음과 같은 개선을 제안합니다:

 interface SearchBarProps extends ComponentPropsWithoutRef<'input'> {
   onSearchClick: () => void;
   onInputChange: (e: React.ChangeEvent<HTMLInputElement>) => void;
+  isSearching?: boolean;
 }

 const SearchBar = (
-  { onSearchClick, onInputChange, ...props }: SearchBarProps,
+  { onSearchClick, onInputChange, isSearching = false, ...props }: SearchBarProps,
   ref: ForwardedRef<HTMLInputElement>,
 ) => {
       <input
         ref={ref}
         css={S.inputStyling}
         placeholder="궁금한 키워드를 입력해주세요!"
         onChange={onInputChange}
         onKeyDown={handleInputKeyDown}
+        disabled={isSearching}
         {...props}
       />
-      <Button size="large" variant="circle" onClick={onSearchClick}>
+      <Button size="large" variant="circle" onClick={onSearchClick} disabled={isSearching}>
         <Search />
       </Button>
src/components/atoms/SearchTalkPickItem/SearchTalkPickItem.tsx (1)

26-26: 접근성과 사용자 경험이 개선되었습니다.

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

  • div에서 button으로 변경하여 접근성이 향상됨
  • 이미지가 있을 때만 렌더링하도록 최적화됨

하나 제안드리고 싶은 점이 있습니다:

버튼에 aria-label을 추가하여 스크린 리더 사용자를 위한 접근성을 더욱 향상시킬 수 있습니다:

-    <button type="button" css={S.searchTalkPickItemStyle} onClick={onClick}>
+    <button
+      type="button"
+      css={S.searchTalkPickItemStyle}
+      onClick={onClick}
+      aria-label={`${title} 토픽 열기`}
+    >

Also applies to: 53-53

src/components/organisms/TalkPickSection/TalkPickSection.style.ts (1)

76-82: 텍스트 스타일링 구조가 개선되었습니다!

컨테이너와 텍스트 스타일링을 분리하고, whiteSpace: 'pre-wrap'을 추가하여 줄바꿈이 올바르게 적용되도록 개선한 것이 좋습니다. 다만, 다음과 같은 개선사항을 고려해보시면 좋겠습니다:

export const talkPickContent = css({
  width: '100%',
  paddingTop: '40px',
-  paddingLeft: '173px',
-  paddingRight: '173px',
+  padding: '40px 173px 0',
  borderTop: '1px solid #F4F4F4',
});

Also applies to: 84-88

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 955bc16 and 1003465.

📒 Files selected for processing (15)
  • src/components/atoms/SearchBar/SearchBar.tsx (1 hunks)
  • src/components/atoms/SearchTalkPickItem/SearchTalkPickItem.style.ts (2 hunks)
  • src/components/atoms/SearchTalkPickItem/SearchTalkPickItem.tsx (3 hunks)
  • src/components/molecules/SearchGameList/SearchGameList.tsx (4 hunks)
  • src/components/molecules/SearchTalkPickList/SearchTalkPickList.tsx (2 hunks)
  • src/components/molecules/VotePrototype/VotePrototype.style.ts (1 hunks)
  • src/components/molecules/VotePrototype/VotePrototype.tsx (2 hunks)
  • src/components/organisms/TalkPickSection/TalkPickSection.style.ts (1 hunks)
  • src/components/organisms/TalkPickSection/TalkPickSection.tsx (1 hunks)
  • src/constants/api.ts (1 hunks)
  • src/hooks/search/usePagination.ts (2 hunks)
  • src/pages/SearchResultsPage/SearchGamePage.tsx (2 hunks)
  • src/pages/SearchResultsPage/SearchTalkPickPage.tsx (2 hunks)
  • src/pages/TalkPickPlacePage/TalkPickPlacePage.tsx (3 hunks)
  • src/types/search.ts (2 hunks)
🔇 Additional comments (22)
src/components/molecules/VotePrototype/VotePrototype.style.ts (1)

42-43: 스타일 변경이 적절히 이루어졌습니다.

컨테이너의 중앙 정렬이 transform을 사용하여 올바르게 구현되었습니다. zIndex 값의 타입을 문자열로 통일한 것도 좋은 변경입니다.

Also applies to: 48-48

src/components/molecules/VotePrototype/VotePrototype.tsx (1)

4-4: 경로 상수 사용으로 코드 품질이 향상되었습니다.

하드코딩된 문자열 대신 PATH 상수를 사용함으로써 유지보수성이 향상되었습니다. 이는 라우팅 관리에 있어 일관성을 제공합니다.

Also applies to: 75-75

src/constants/api.ts (1)

65-65: 엔드포인트 변경이 적절해 보입니다.

게임 검색 엔드포인트를 /search/game에서 /search/game-sets로 변경한 것이 다음과 같은 이유로 적절해 보입니다:

  • 기존 BOOKMARK_GAME_DONE, BOOKMARK_GAME 등의 엔드포인트에서 사용하는 패턴과 일관성이 있습니다
  • 게임 세트 ID를 사용하는 방식으로의 전환이 자연스럽습니다

다음 스크립트를 실행하여 게임 세트 관련 엔드포인트들의 일관성을 확인해보겠습니다:

✅ Verification successful

엔드포인트 변경이 코드베이스 전반에 걸쳐 일관되게 적용되었습니다.

검증 결과 다음과 같은 사항들이 확인되었습니다:

  • /search/game-sets 엔드포인트가 다른 게임 세트 관련 엔드포인트들(/bookmarks/game-sets, /games/${gameSetId} 등)과 일관된 패턴을 따르고 있습니다
  • 타입 정의와 컴포넌트 인터페이스에서 gameSetId가 일관되게 사용되고 있습니다
  • 레거시 /games/${gameId} 패턴은 더 이상 검색 관련 기능에서 사용되지 않습니다
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# 설명: 게임 세트 관련 엔드포인트들의 일관성 확인

# 게임 세트 관련 엔드포인트 검색
echo "게임 세트 관련 엔드포인트 패턴 확인:"
rg "game-sets?" src/

# 이전 게임 ID 사용 패턴 검색
echo "\n레거시 게임 ID 사용 패턴 확인:"
rg "/games/\$\{gameId\}" src/

Length of output: 537


Script:

#!/bin/bash
# 게임 관련 모든 엔드포인트 패턴을 확인하기 위한 더 넓은 검색

echo "모든 게임 관련 엔드포인트 패턴:"
rg -i "(/games?|/game-sets?)" src/constants/api.ts -A 1 -B 1

echo "\n타입 정의에서 gameSetId 사용 확인:"
rg "gameSetId" src/ -A 1 -B 1

echo "\n게임 ID 관련 타입 정의 확인:"
ast-grep --pattern 'interface $_ {
  $$$
  gameSetId: $_
  $$$
}'

Length of output: 25779

src/types/search.ts (2)

4-4: 식별자 이름이 더 명확해졌습니다!

id에서 gameSetId로의 변경은 해당 필드의 목적을 더 명확하게 표현합니다.


Line range hint 13-19: SearchTalkPickItem 인터페이스가 잘 구성되었습니다.

필요한 모든 필드가 포함되어 있으며, 각 필드의 타입이 명확하게 정의되어 있습니다.

src/hooks/search/usePagination.ts (2)

19-19: 페이지 설정 로직이 단순화되었습니다.

페이지 설정 로직이 더 간단하고 직관적으로 변경되었습니다.


4-8: 페이지네이션 기본값 변경이 적절합니다.

0 기반에서 1 기반으로의 변경은 사용자 경험 측면에서 더 직관적입니다.

기존 페이지네이션 구현에 미치는 영향을 확인하기 위해 다음 스크립트를 실행하세요:

✅ Verification successful

페이지네이션 기본값 변경이 안전하게 적용되었습니다.

코드베이스 분석 결과, usePagination 훅의 기본값 변경(0 → 1)은 다음과 같은 이유로 안전합니다:

  • 모든 페이지네이션 구현이 이 훅을 일관되게 사용하고 있습니다
  • 페이지 파라미터를 API로 전달할 때 자동으로 0-based로 변환됩니다 (예: page: currentPage - 1)
  • 검색 파라미터와 UI 표시는 1-based로 일관되게 처리됩니다
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# 페이지네이션 관련 컴포넌트들에서 페이지 번호 처리 방식 확인
rg -A 3 "page(=|\s*:)" --type ts --type tsx

Length of output: 73


Script:

#!/bin/bash
# Search for pagination-related code patterns
rg -t ts "page" -A 3

# Also search for usePagination hook usage
rg -t ts "usePagination" -A 3

Length of output: 76534


Script:

#!/bin/bash
# Search for usePagination hook usage and implementation
rg -t ts "usePagination" -A 3

# Also search for pagination-related state changes
ast-grep --pattern 'const [page, setPage] = useState'

Length of output: 3096

src/components/atoms/SearchBar/SearchBar.tsx (1)

19-23: Enter 키 지원 추가는 좋은 UX 개선입니다.

검색 기능에 Enter 키 지원을 추가한 것은 사용자 경험을 크게 향상시킵니다.

src/components/atoms/SearchTalkPickItem/SearchTalkPickItem.style.ts (2)

6-6: 스타일 리셋 속성이 적절히 추가되었습니다.

버튼 요소의 기본 스타일을 초기화하는 all: 'unset' 속성이 잘 적용되었습니다.


40-42: 콘텐츠 표시 방식 검토 필요

현재 구현된 스타일링에 대해 다음 사항들을 고려해주세요:

  1. display: inline으로 변경하면 레이아웃 흐름에 영향을 줄 수 있습니다.
  2. 고정된 높이(45px)와 overflow: hidden 설정으로 인해 긴 콘텐츠가 잘릴 수 있습니다.

다음 스크립트로 콘텐츠 길이가 긴 케이스를 확인해보세요:

✅ Verification successful

스타일링 구현이 적절합니다

현재 구현된 스타일링이 다음과 같은 이유로 적절한 것으로 확인됩니다:

  1. display: inline과 고정 높이는 의도적인 디자인 선택입니다:

    • 컴포넌트는 searchTalkPickItemStyle에서 flex 레이아웃으로 전체 구조가 잘 정의되어 있습니다
    • contentWrapStyle은 콘텐츠 영역의 2줄 제한을 위한 것으로 보입니다
  2. 콘텐츠 길이 제한은 디자인 요구사항에 맞습니다:

    • 스토리북 예제에서도 짧은 콘텐츠로 테스트되고 있습니다
    • 검색 결과 미리보기 용도로 적절한 구현입니다
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# 콘텐츠 길이가 긴 케이스 검색
rg -l "SearchTalkPickItem.*content.*" 

Length of output: 39


Script:

#!/bin/bash
# SearchTalkPickItem 컴포넌트의 사용 사례 검색
rg -A 5 "SearchTalkPickItem" 

# SearchTalkPickItem 스타일 파일의 전체 내용 확인
fd "SearchTalkPickItem.style" --exec cat {}

Length of output: 12481

src/components/molecules/SearchGameList/SearchGameList.tsx (2)

15-15: 타입 정의가 명확하게 개선되었습니다.

id에서 gameSetId로의 변경은 의미론적으로 더 명확합니다.


27-27: 라우팅 로직이 개선되었으나 검증이 필요합니다.

PATH 상수를 사용한 라우팅 처리와 gameSetId 사용이 적절하게 구현되었습니다. 다만, 이 변경사항이 다른 컴포넌트들과 일관성있게 적용되었는지 확인이 필요합니다.

다음 스크립트로 gameSetId 사용의 일관성을 확인해보세요:

Also applies to: 42-42

✅ Verification successful

Let me analyze the results and generate a final response in Korean.

라우팅 및 게임 ID 처리가 일관되게 구현되었습니다.

검증 결과, gameSetIdPATH.BALANCEGAME의 사용이 전체 코드베이스에서 일관성있게 구현되어 있습니다:

  • PATH.BALANCEGAME은 App.tsx의 라우트 정의와 SearchGameList 컴포넌트에서 동일한 패턴으로 사용됩니다.
  • gameSetId는 타입 정의, API 엔드포인트, 훅, 컴포넌트 등 전반적으로 일관된 방식으로 사용되고 있습니다.
  • 관련 컴포넌트들(BalanceGameBox, BalanceGameSection 등)이 모두 동일한 패턴으로 gameSetId를 props로 받아 처리하고 있습니다.
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# gameSetId 사용 패턴 검색
rg "gameSetId|game\.id" 

# PATH.BALANCEGAME 사용 검색
rg "PATH\.BALANCEGAME"

Length of output: 8760

src/components/molecules/SearchTalkPickList/SearchTalkPickList.tsx (2)

19-23: 네비게이션 기능이 적절히 구현되었습니다.

useNavigate 훅과 PATH 상수를 활용한 라우팅 처리가 잘 구현되었습니다.


30-37: 🛠️ Refactor suggestion

중복된 key prop 제거 필요

key prop이 중복 사용되고 있습니다:

  1. div 요소의 key prop (line 29)
  2. SearchTalkPickItem 컴포넌트의 key prop (line 30)

다음과 같이 수정해주세요:

- <SearchTalkPickItem
-   key={searchItem.title}
+ <SearchTalkPickItem
    id={searchItem.id}
    title={searchItem.title}

Likely invalid or redundant comment.

src/components/atoms/SearchTalkPickItem/SearchTalkPickItem.tsx (1)

8-8: Props 인터페이스가 적절하게 확장되었습니다.

컴포넌트의 재사용성과 타입 안정성이 향상되었습니다. idonClick props의 추가는 컴포넌트의 기능성을 높이는 좋은 변경사항입니다.

Also applies to: 14-14

src/pages/TalkPickPlacePage/TalkPickPlacePage.tsx (3)

11-11: 페이지네이션 로직이 개선되었습니다.

커스텀 훅을 사용하여 페이지네이션 로직을 중앙화했고, 페이지 계산 방식이 더 직관적으로 변경되었습니다. API 호출 시 page - 1로 조정하는 것이 올바른 접근입니다.

Also applies to: 19-19


25-26: useEffect의 의존성이 적절히 업데이트되었습니다.

페이지 변경과 정렬 값 변경 시 스크롤이 상단으로 이동하도록 처리된 것이 사용자 경험 측면에서 좋습니다.


43-44: 페이지네이션 props 전달이 일관성 있게 수정되었습니다.

선택된 페이지와 페이지 변경 핸들러가 적절히 전달되고 있습니다.

src/pages/SearchResultsPage/SearchGamePage.tsx (2)

23-23: 페이지 인덱스 계산이 일관되게 수정되었습니다.

API 호출 시 페이지 인덱스를 0부터 시작하도록 page - 1로 조정한 것이 적절합니다.


39-39: 페이지네이션 props가 일관성 있게 업데이트되었습니다.

다른 컴포넌트들과 동일한 방식으로 페이지네이션이 처리되도록 수정되었습니다.

src/pages/SearchResultsPage/SearchTalkPickPage.tsx (1)

23-23: 페이지네이션 로직이 개선되었습니다!

페이지 번호를 1부터 시작하도록 수정한 변경이 적절합니다. API 호출 시에는 0-based index로 변환하고, UI에는 1-based index를 사용하는 것이 사용자 경험 측면에서 더 자연스럽습니다.

Also applies to: 39-39

src/components/organisms/TalkPickSection/TalkPickSection.tsx (1)

195-197: 컨텐츠 렌더링 방식이 개선되었습니다!

p 태그에서 div 태그로 변경하고 새로운 스타일링을 적용하여 줄바꿈이 올바르게 표시되도록 수정한 것이 적절합니다. 이는 장문의 컨텐츠를 더 읽기 좋게 표시할 수 있게 해줍니다.

Copy link
Collaborator

@alwubin alwubin left a comment

Choose a reason for hiding this comment

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

검색 결과 페이지 리팩토링 하시느라 수고 많으셨습니다!!

Comment on lines +19 to +23
const handleInputKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {
if (e.key === 'Enter') {
onSearchClick();
}
};
Copy link
Collaborator

Choose a reason for hiding this comment

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

검색 시 엔터 키로 실행하도록 수정한 부분은 사용자 편의성에 좋은거 같네용ㅎㅎ

width: '1215px',
height: '260px',
backdropFilter: 'blur(11px)',
backgroundColor: 'rgba(255, 255, 255, 0.01)',
zIndex: 1,
zIndex: '1',
Copy link
Collaborator

Choose a reason for hiding this comment

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

보통 zIndex는 숫자로 사용하는데 string으로 변경하신 이유가 있을까용?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

다른 스타일들과의 통일을 위해 문자열로 수정해주었습니다,, ㅎㅎ 🫢

Copy link
Collaborator

@WonJuneKim WonJuneKim left a comment

Choose a reason for hiding this comment

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

저 대신 해당 부분 리펙토링을 맡아주셔서 정말 감사드려요 ㅠㅠ 꼼꼼한 수정 고생 많으셨습니다 😄

@@ -3,6 +3,7 @@ import color from '@/styles/color';
import typo from '@/styles/typo';

export const searchTalkPickItemStyle = css({
all: 'unset',
Copy link
Collaborator

Choose a reason for hiding this comment

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

버튼과 관련된 부분에 기본 속성을 제거해주신 부분 좋습니다!

interface GameItem {
id: number;
export interface GameListItem {
gameSetId: number;
Copy link
Collaborator

Choose a reason for hiding this comment

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

밸런스 게임 쪽에서는 제가 이 부분 똑같이 바꿔놨는데 생각이 통했군요...! 직관적이고 이해하기 편리한 수정사항인거 같아요 ㅎㅎ

Comment on lines +11 to +13
const searchTalkPickSample: SearchTalkPickListItem[] = Array.from(
{ length: 10 },
(_, index) => ({
Copy link
Collaborator

Choose a reason for hiding this comment

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

Array로 불필요한 코드량을 줄일 부분 좋은 거 같아요!!

keyword: string;
}

const SearchGameList = ({ gameList, keyword }: SearchGameListProps) => {
const navigate = useNavigate();

const handleItemClick = (gameId: number) => {
navigate(`/balancegame/${gameId}`);
navigate(`/${PATH.BALANCEGAME(gameId)}`);
Copy link
Collaborator

Choose a reason for hiding this comment

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

경로 상수화 처리 감사합니다~

src/constants/api.ts Show resolved Hide resolved
@@ -1,11 +1,11 @@
import { useState, useEffect } from 'react';
import { useSearchParams } from 'react-router-dom';

const usePagination = (defaultPage = 0) => {
const usePagination = (defaultPage = 1) => {
Copy link
Collaborator

Choose a reason for hiding this comment

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

사실 이 부분이 0으로 처리되고, 해당 훅 호출 부에서 +1을 해서 사용하는 방식이 많길래 건들면 파장이 클까바 냅두고 있었어요!
시작 페이지가 1이기 때문에 수정된 방식이 더 직관적인거 같네요~ 아주 좋습니다

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🔭 Outside diff range comments (1)
src/stories/organisms/SearchTalkPickResult.stories.tsx (1)

Line range hint 8-17: 샘플 데이터의 개선이 필요합니다.

현재 모든 아이템의 id가 0으로 고정되어 있습니다. 실제 사용 사례를 더 잘 반영하기 위해 다음과 같이 개선하는 것이 좋겠습니다.

 const SearchTalkPickItems: SearchTalkPickListItem[] = Array.from(
   { length: 4 },
   (_, index) => ({
-    id: 0,
+    id: index + 1,
     title: `톡픽 ${index + 1} - 월클 정국 VS 존잘 차은우`,
     createdAt: '2024.08.26',
     content: '우하하우하하 내용입니다.',
     firstImgUrl: SampleWhole,
     keyword: '정국',
     isLoading: false,
   }),
 );
🧹 Nitpick comments (5)
src/components/molecules/SearchTalkPickList/SearchTalkPickList.tsx (1)

20-22: 클릭 핸들러 구현이 깔끔합니다.

톡픽 아이템 클릭 시 해당 상세 페이지로 이동하는 로직이 명확하게 구현되어 있습니다. 다만, 다음 사항들을 고려해보시면 좋을 것 같습니다:

  1. 잘못된 talkPickId가 전달될 경우에 대한 방어 로직 추가
  2. 페이지 이동 전 사용자 입력 데이터 저장 여부 확인

Also applies to: 34-34

src/components/organisms/SearchGameResult/SearchGameResult.tsx (1)

Line range hint 31-40: 로딩 상태 처리가 적절합니다.

스켈레톤 UI를 사용한 로딩 상태 처리가 사용자 경험을 향상시키는데 도움이 될 것 같습니다. 다만, 스켈레톤 카운트(9개)를 상수로 분리하는 것을 고려해보시면 좋을 것 같습니다.

+ const SKELETON_COUNT = 9;

  if (isLoading) {
    return (
      <div css={S.container}>
        <div css={S.titleWrapper}>
          <div>밸런스게임</div>
          <MoreButton onClick={handleButtonClick} />
        </div>
        <div css={S.contentWRapper}>
-         <SearchResultCardSkeleton count={9} />
+         <SearchResultCardSkeleton count={SKELETON_COUNT} />
        </div>
      </div>
    );
  }
src/stories/organisms/SearchTalkPickListSection.stories.tsx (1)

31-34: 샘플 데이터의 id 값 개선이 필요합니다

현재 모든 샘플 데이터의 id가 0으로 설정되어 있습니다. 실제 사용 사례를 더 잘 반영하기 위해 고유한 id 값을 사용하는 것이 좋습니다.

 const searchTalkPickSample: SearchTalkPickListItem[] = Array.from(
   { length: 20 },
   (_, index) => ({
-    id: 0,
+    id: index + 1,
     title: `톡픽 ${index + 1} - 인기 순위`,
src/components/organisms/SearchTalkPickListSection/SearchTalkPickListSection.tsx (1)

Line range hint 31-45: 로딩 상태의 사용자 경험을 개선할 수 있습니다.

현재 스켈레톤 UI가 고정된 길이(10)로 구현되어 있습니다. 실제 데이터의 예상 길이나 이전 페이지의 데이터 길이를 기반으로 동적으로 조정하는 것이 더 자연스러울 수 있습니다.

-          <SearchResultListSkeleton length={10} />
+          <SearchResultListSkeleton length={Math.min(searchTalkPickList.length || 10, 10)} />
src/stories/molecules/SearchTalkPickList.stories.tsx (1)

58-67: 테스트 케이스를 더 다양화하면 좋을 것 같습니다.

현재 스토리는 기본적인 케이스들을 잘 커버하고 있지만, 다음과 같은 엣지 케이스들을 추가하면 좋을 것 같습니다:

  • 매우 긴 제목이나 내용
  • 이미지가 없는 경우
  • 키워드가 없는 경우

Also applies to: 77-80, 90-90

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 1003465 and f9cca59.

📒 Files selected for processing (14)
  • src/components/atoms/SearchTalkPickItem/SearchTalkPickItem.tsx (3 hunks)
  • src/components/molecules/SearchGameList/SearchGameList.tsx (2 hunks)
  • src/components/molecules/SearchTalkPickList/SearchTalkPickList.tsx (2 hunks)
  • src/components/organisms/SearchGameListSection/SearchGameListSection.tsx (1 hunks)
  • src/components/organisms/SearchGameResult/SearchGameResult.tsx (1 hunks)
  • src/components/organisms/SearchTalkPickListSection/SearchTalkPickListSection.tsx (2 hunks)
  • src/components/organisms/SearchTalkPickResult/SearchTalkPickResult.tsx (2 hunks)
  • src/components/organisms/TalkPickSection/TalkPickSection.tsx (3 hunks)
  • src/stories/molecules/ActionBox.stories.tsx (2 hunks)
  • src/stories/molecules/SearchTalkPickList.stories.tsx (4 hunks)
  • src/stories/organisms/SearchTalkPickListSection.stories.tsx (4 hunks)
  • src/stories/organisms/SearchTalkPickResult.stories.tsx (1 hunks)
  • src/stories/organisms/SideBar.stories.tsx (2 hunks)
  • src/types/search.ts (2 hunks)
🚧 Files skipped from review as they are similar to previous changes (3)
  • src/components/organisms/TalkPickSection/TalkPickSection.tsx
  • src/components/atoms/SearchTalkPickItem/SearchTalkPickItem.tsx
  • src/components/molecules/SearchGameList/SearchGameList.tsx
🔇 Additional comments (16)
src/types/search.ts (3)

3-4: GameItem에서 GameListItem으로의 인터페이스 이름 변경과 idgameSetId로 변경한 것이 적절해 보입니다.

이름이 더 명확해졌고, PR 목표에 언급된 게임 ID 관련 문제를 해결하는데 도움이 될 것 같습니다.


Line range hint 12-18: 인터페이스 이름이 더 명확해졌습니다.

SearchTalkPickItem에서 SearchTalkPickListItem으로의 변경이 컴포넌트의 용도를 더 잘 반영합니다.


22-22: Result 인터페이스들의 content 타입이 새로운 인터페이스명과 일관성있게 업데이트되었습니다.

TalkPickResultGameResult 인터페이스의 변경사항이 전체적인 타입 시스템의 일관성을 잘 유지하고 있습니다.

Also applies to: 27-27

src/stories/molecules/ActionBox.stories.tsx (1)

14-20: Storybook 데코레이터에 라우팅 컨텍스트가 적절히 추가되었습니다.

BrowserRouter 데코레이터 추가로 스토리북 환경에서 라우팅 기능을 테스트할 수 있게 되었습니다.

src/stories/organisms/SearchTalkPickResult.stories.tsx (1)

3-3: 타입 정의가 새로운 인터페이스와 일치하도록 잘 수정되었습니다.

SearchTalkPickListItem 타입으로의 변경이 일관성있게 적용되었습니다.

Also applies to: 8-8

src/components/molecules/SearchTalkPickList/SearchTalkPickList.tsx (1)

2-5: 타입 변경 및 라우팅 구현이 적절합니다.

SearchTalkPickListItem 타입으로의 변경과 라우터 관련 의존성 추가가 검색 결과 페이지 리팩토링의 목적에 잘 부합합니다.

Also applies to: 10-10

src/components/organisms/SearchGameResult/SearchGameResult.tsx (1)

2-2: 타입 변경이 일관성 있게 적용되었습니다.

GameItem에서 GameListItem으로의 타입 변경이 검색 결과 페이지 전반의 리팩토링 방향과 일치합니다.

Also applies to: 12-12

src/components/organisms/SearchTalkPickResult/SearchTalkPickResult.tsx (2)

3-3: 타입 변경이 일관되게 적용되었습니다.

SearchTalkPickItemProps에서 SearchTalkPickListItem으로의 타입 변경이 다른 컴포넌트들과 일관성 있게 적용되었습니다.

Also applies to: 12-12


Line range hint 31-39: 로딩 상태 처리의 일관성 검토가 필요합니다.

SearchGameResult 컴포넌트와 유사하게 스켈레톤 UI를 사용하고 있으나, 스켈레톤의 길이가 다릅니다(4개 vs 9개). 두 컴포넌트 간의 로딩 상태 표시 방식을 일관되게 가져가는 것이 좋을 것 같습니다.

src/stories/organisms/SideBar.stories.tsx (1)

2-2: 라우팅 컨텍스트 추가 구현이 적절합니다

스토리북 컴포넌트에 라우팅 기능을 제공하기 위한 BrowserRouter 데코레이터 추가가 올바르게 구현되었습니다.

Also applies to: 16-22

src/components/organisms/SearchGameListSection/SearchGameListSection.tsx (1)

2-2: 타입 변경의 영향도 확인이 필요합니다

GameItem에서 GameListItem으로의 타입 변경이 적절해 보입니다. 다만, 이 변경이 다른 컴포넌트들에도 영향을 미칠 수 있으므로 확인이 필요합니다.

Also applies to: 13-13

src/stories/organisms/SearchTalkPickListSection.stories.tsx (2)

3-3: 라우팅 컨텍스트 추가가 적절합니다

스토리북 컴포넌트에 BrowserRouter 데코레이터 추가가 올바르게 구현되었습니다.

Also applies to: 15-21


47-47: 키워드 변경이 적절합니다

'예시 키워드'에서 '인기'로의 키워드 변경이 샘플 데이터의 내용과 일관성 있게 구현되었습니다.

src/components/organisms/SearchTalkPickListSection/SearchTalkPickListSection.tsx (1)

3-3: 타입 변경이 일관성 있게 적용되었습니다!

SearchTalkPickItemProps에서 SearchTalkPickListItem으로의 타입 변경이 다른 컴포넌트들과 잘 통일되어 있습니다.

Also applies to: 13-13

src/stories/molecules/SearchTalkPickList.stories.tsx (2)

11-22: 샘플 데이터 생성 방식이 효율적으로 개선되었습니다!

Array.from을 사용한 샘플 데이터 생성 방식이 코드의 간결성과 유지보수성을 높였습니다.


28-34: 스토리 설정이 실제 사용 환경과 잘 통합되었습니다.

BrowserRouter의 추가로 실제 라우팅 동작을 테스트할 수 있게 되었고, 기본 args 설정도 실제 사용 사례를 잘 반영하고 있습니다.

Also applies to: 39-40

Copy link
Contributor

@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: 3

🧹 Nitpick comments (1)
src/components/molecules/ContentsButton/ContentsButton.style.ts (1)

Line range hint 72-75: 키보드 접근성 개선이 잘 되었습니다!

:focus-visible 추가로 키보드 사용자의 접근성이 향상되었습니다. 다만, 더 나은 시각적 피드백을 위해 다음과 같은 개선을 고려해보시는 건 어떨까요?

  &:focus-visible {
-   outline: 1px solid ${color.BK};
+   outline: 2px solid ${color.MAIN};
    outline-offset: 1px;
  }
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between f9cca59 and 07f9f07.

📒 Files selected for processing (4)
  • src/components/atoms/CategoryButton/CategoryButton.style.ts (1 hunks)
  • src/components/atoms/SearchBar/SearchBar.tsx (1 hunks)
  • src/components/molecules/ContentsButton/ContentsButton.style.ts (1 hunks)
  • src/stories/organisms/SideBar.stories.tsx (2 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/components/atoms/SearchBar/SearchBar.tsx
🧰 Additional context used
🪛 eslint
src/stories/organisms/SideBar.stories.tsx

[error] 2-2: 'react-router-dom' imported multiple times.

(import/no-duplicates)

🔇 Additional comments (1)
src/components/molecules/ContentsButton/ContentsButton.style.ts (1)

70-70: 모바일 뷰의 border-radius 조정이 적절합니다!

작은 화면에서 더 세련된 UI를 제공할 수 있는 좋은 변경사항입니다.

Comment on lines 2 to 4
import { BrowserRouter } from 'react-router-dom';
import type { Meta, StoryObj } from '@storybook/react';
import { MemoryRouter } from 'react-router-dom';
Copy link
Contributor

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

중복 import 문을 통합해주세요

react-router-dom에서 가져오는 import를 하나의 구문으로 통합하는 것이 좋습니다.

다음과 같이 수정해주세요:

-import { BrowserRouter } from 'react-router-dom';
import type { Meta, StoryObj } from '@storybook/react';
-import { MemoryRouter } from 'react-router-dom';
+import { BrowserRouter, MemoryRouter } from 'react-router-dom';
📝 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.

Suggested change
import { BrowserRouter } from 'react-router-dom';
import type { Meta, StoryObj } from '@storybook/react';
import { MemoryRouter } from 'react-router-dom';
import { BrowserRouter, MemoryRouter } from 'react-router-dom';
import type { Meta, StoryObj } from '@storybook/react';
🧰 Tools
🪛 eslint

[error] 2-2: 'react-router-dom' imported multiple times.

(import/no-duplicates)


[error] 4-4: 'react-router-dom' imported multiple times.

(import/no-duplicates)

Comment on lines 17 to 23
decorators: [
(Story) => (
<BrowserRouter>
<Story />
</BrowserRouter>
),
],
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

라우터 중복 사용 문제를 해결해주세요

현재 BrowserRouter와 MemoryRouter가 동시에 사용되고 있습니다. Storybook에서는 브라우저 히스토리와 독립적으로 동작하는 MemoryRouter를 사용하는 것이 더 적절합니다.

다음 두 가지 해결 방안 중 하나를 선택해주세요:

  1. BrowserRouter decorator를 제거하고 현재처럼 각 스토리에서 MemoryRouter를 사용:
-  decorators: [
-    (Story) => (
-      <BrowserRouter>
-        <Story />
-      </BrowserRouter>
-    ),
-  ],
  1. 또는 decorator를 MemoryRouter로 변경하고 개별 스토리의 MemoryRouter를 제거:
  decorators: [
    (Story) => (
-      <BrowserRouter>
+      <MemoryRouter>
        <Story />
-      </BrowserRouter>
+      </MemoryRouter>
    ),
  ],

첫 번째 방안을 추천드립니다. 각 스토리가 자체적으로 라우팅 컨텍스트를 제어하는 것이 테스트와 디버깅에 더 용이합니다.

Comment on lines +22 to 24
padding: '5px 45px 14px 45px',
borderRadius: '7px',
border: '0.35px solid #dedede',
Copy link
Contributor

Choose a reason for hiding this comment

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

💡 Codebase verification

디자인 시스템 변수 도입 권장

현재 테마 파일에 border-radius에 대한 디자인 토큰이 정의되어 있지 않습니다. 모바일 뷰의 스타일 변경은 적절해 보이나, 다음과 같은 개선사항을 제안드립니다:

  • border-radius 값(7px)을 포함한 디자인 토큰을 Theme 객체에 추가하여 일관된 스타일 관리
  • 현재 하드코딩된 값들(padding, border width 등)도 디자인 시스템 변수로 관리 권장
🔗 Analysis chain

모바일 뷰의 스타일 변경사항 검토 필요

모바일 화면에서의 카테고리 버튼 스타일 변경이 적절해 보입니다. 다만, 다음 사항들을 확인해 주시면 좋겠습니다:

  • 다양한 모바일 기기에서 시각적 일관성 확인
  • 디자인 시스템과의 정렬성 검토

다음 스크립트를 실행하여 디자인 시스템 변수 사용 여부를 확인해 주세요:


Let's first try to find any design system related files and their content to make a more informed decision about the usage of design tokens or theme variables.


Let's check the theme file content to see if there are any predefined border-radius values that should be used instead of magic numbers.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: 디자인 시스템에서 정의된 border-radius 값들을 검색합니다.

# styles 디렉토리에서 border-radius 관련 상수 검색
rg -i "border.*radius|radius" src/styles/

Length of output: 43


Script:

#!/bin/bash
# Search for any design system or theme related files
fd -e ts -e js "theme|styles|constants" src/

# Then search for border-radius or design tokens in the found files
rg -i "border.*radius|radius|theme" src/ -A 2 -B 2

Length of output: 79331


Script:

#!/bin/bash
# Let's check if there are any design tokens or theme variables for border-radius
cat src/styles/theme.ts

Length of output: 1596

@areumH areumH merged commit a7bac45 into dev Dec 22, 2024
6 of 7 checks passed
@areumH areumH deleted the refactor/260-search-result branch December 22, 2024 17:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
✨feature 구현, 개선 사항 관련 부분 👩🏻‍💻 frontend 프론트엔드 작업 ✔︎pull requests pull requests 코드 체크 요청 🪄refactor 리팩토링
Projects
Status: Done
Development

Successfully merging this pull request may close these issues.

검색 결과 페이지 리팩토링
3 participants