Skip to content

Comments

fix QA#2077

Merged
ljh0608 merged 6 commits intodevelopfrom
fix/#2069
Dec 13, 2025
Merged

fix QA#2077
ljh0608 merged 6 commits intodevelopfrom
fix/#2069

Conversation

@ljh0608
Copy link
Contributor

@ljh0608 ljh0608 commented Dec 13, 2025

🤫 쉿, 나한테만 말해줘요. 이슈넘버

  • close #

🧐 어떤 것을 변경했어요~?

🤔 그렇다면, 어떻게 구현했어요~?

❤️‍🔥 당신이 생각하는 PR포인트, 내겐 매력포인트.

📸 스크린샷, 없으면 이것 참,, 섭섭한데요?

@coderabbitai
Copy link

coderabbitai bot commented Dec 13, 2025

Summary by CodeRabbit

릴리스 노트

  • 새로운 기능

    • 사용자 작업 선호도 기반의 조건부 모달 및 매칭 시작 흐름 추가
  • 버그 수정

    • 개발용 콘솔 출력 제거
  • 리팩토링

    • 작업 선호도 존재 여부 및 세대 조건에 따른 컴포넌트 가시성 및 렌더링 변경
    • 작업 선호도 배지 표시 순서 재배열
  • 스타일

    • 빈 상태에서 배경 흐림 효과 강화
  • 텍스트 업데이트

    • 팀 리더 정렬 설명을 가나다순으로 변경
    • 멤버 메시지 버튼 레이블 문구 변경

✏️ Tip: You can customize this high-level summary in your review settings.

Walkthrough

작업 선호도 기반 멤버 카드·목록에 UI 순서 변경, 조건부 렌더링 및 모달 연동을 추가하고 팀 리더 페이지의 디버깅 로그와 정렬 설명을 수정했습니다.

Changes

응집군 / 파일(s) 변경 요약
작업 선호도 멤버 카드
src/components/members/main/MemberCard/WorkPreferneceMemberCard.tsx
모달 상태 훅(useModalState), 이벤트 로거(useEventLogger) 및 MessageModal 임포트 추가. 배지 표시 순서 재배치(workTime을 communicationStyle 앞에 이동). 메시지 버튼 레이블/아이콘 변경(한국어 문구로 단순화).
작업 선호도 멤버 목록
src/components/members/main/MemberList/WorkPreferenceMatchedMemberList.tsx
useGetMyWorkPreference 등 훅/유틸 임포트 추가. hasWorkPreference/isEmpty 기반 조건부 렌더링 도입(새로고침 컨트롤·부제목·빈 상태 메시지 변경). 모달(useModalState) 및 MatchMemberModal 연동(열기 핸들러 추가). 레이아웃·블러·툴팁 크기 조정.
멤버 목록 인덱스
src/components/members/main/MemberList/index.tsx
useGetMemberOfMe 추가, memberOfMeData.generation === LATEST_GENERATION 기준으로 canViewWorkPreference 도출 및 WorkPreferenceMatchedMemberList 조건부 렌더링 적용.
팀 리더 페이지
src/pages/members/team-leaders.tsx
console.log(tlMemberList); 제거, 정렬 설명 문구를 무작위→가나다순으로 수정, TL 카드 렌더링 블록 주석 처리(비활성화).

Estimated code review effort

🎯 3 (보통) | ⏱️ ~20분

  • 주의할 파일:
    • WorkPreferenceMatchedMemberList.tsx: hasWorkPreference/isEmpty 조건 및 모달 상태 흐름 검증
    • WorkPreferneceMemberCard.tsx: 버튼 클릭 → MessageModal 트리거와 이벤트 로거 연동 확인
    • MemberList/index.tsx: LATEST_GENERATION 기반 접근 제어 로직 검토

Possibly related PRs

  • #2066: 동일한 작업 선호도 추천 UI(WorkPreferenceMemberCard / WorkPreferenceMatchedMemberList) 변경을 기반으로 하는 PR — 중복/연속 변경 가능성 있음.
  • #2068: 멤버 카드·리스트에 모달/메시지 흐름을 추가한 PR — MessageModal 및 모달 연동 변경과 직접 연관.
  • #2070: WorkPreferenceMatchedMemberList의 빈 상태/조건부 렌더링 로직을 다룬 PR — 유사한 조건부 렌더링 변경과 중복 가능성 있음.

Suggested labels

🌟 QA

Suggested reviewers

  • seong-hui
  • imddoy

Poem

토끼가 전하는 축하 인사 🐇
배지들 춤추고 순서 바꿨네
모달 문 두드리며 소식 전하고
빈 화면엔 살짝 흐림을 더해
가나다로 줄 맞춰 인사합니다 🎀

Pre-merge checks and finishing touches

❌ Failed checks (3 warnings, 1 inconclusive)
Check name Status Explanation Resolution
Description check ⚠️ Warning PR 설명에 템플릿 헤더만 있고 모든 섹션이 비어있으며, 제공된 내용이 없으면서 실제 변경사항을 설명하지 않습니다. PR 설명의 각 섹션을 작성하세요. 변경사항, 구현 방식, 논의사항, 스크린샷을 포함하여 구체적으로 설명해야 합니다.
Linked Issues check ⚠️ Warning PR 설명에서 이슈 참조가 'close #'로 비어있어 어떤 이슈와도 연결되어 있지 않습니다. PR이 해결하는 특정 이슈 번호를 'close #XXXX' 형식으로 명시하세요.
Out of Scope Changes check ⚠️ Warning team-leaders.tsx에서 console.log 제거 및 렌더링 주석 처리 등 PR 목표와 관계없는 부수적 변경사항이 포함되어 있습니다. 주요 변경사항과 무관한 코드 정리(console.log 제거, 주석 처리)는 별도 PR로 분리하세요.
Title check ❓ Inconclusive 제목 'fix QA'는 실제 변경사항들(작업 선호도 UI 개선, 모달 통합, 조건부 렌더링 추가 등)을 충분히 설명하지 못하는 매우 모호하고 일반적인 표현입니다. 제목을 구체적으로 변경하세요. 예: 'Add work preference matching member list with conditional rendering' 또는 변경사항의 핵심을 명확히 나타내는 제목으로 수정하세요.
✅ Passed checks (1 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch fix/#2069

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions
Copy link

github-actions bot commented Dec 13, 2025

✨✨ 스토리북으로 확인하기 ✨✨

@github-actions
Copy link

github-actions bot commented Dec 13, 2025

🚀 프리뷰 배포 확인하기 🚀

https://81a2b120.sopt-internal-dev.pages.dev

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 48c7cf5 and 84cb34a.

📒 Files selected for processing (4)
  • src/components/members/main/MemberCard/WorkPreferneceMemberCard.tsx (2 hunks)
  • src/components/members/main/MemberList/WorkPreferenceMatchedMemberList.tsx (5 hunks)
  • src/components/members/main/MemberList/index.tsx (4 hunks)
  • src/pages/members/team-leaders.tsx (2 hunks)
🧰 Additional context used
🧬 Code graph analysis (1)
src/components/members/main/MemberList/index.tsx (2)
src/api/endpoint/members/getMemberOfMe.ts (1)
  • useGetMemberOfMe (30-38)
src/constants/generation.ts (1)
  • LATEST_GENERATION (1-1)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: build-app / build
  • GitHub Check: chromatic-deploy
🔇 Additional comments (11)
src/pages/members/team-leaders.tsx (1)

20-20: 디버그 로그 제거 잘했습니다.

프로덕션 코드에서 console.log를 제거한 것은 올바른 조치입니다.

src/components/members/main/MemberCard/WorkPreferneceMemberCard.tsx (2)

9-13: LGTM! 새로운 import가 올바르게 사용되고 있습니다.

추가된 import들이 컴포넌트 내에서 모두 적절하게 사용되고 있습니다 (useModalState는 90번 라인, useEventLogger는 91번 라인, MessageModal은 174-189번 라인).


82-88: 배지 순서 변경이 의도된 것인지 확인하세요.

workPreference.workTimecommunicationStyle 앞으로 이동했습니다. 이는 UI 표시 순서만 변경하는 것이지만, PR 설명에 변경 이유가 명시되어 있지 않습니다.

QA 이슈와 관련하여 이 순서 변경이 의도된 것인지 확인하세요.

src/components/members/main/MemberList/index.tsx (3)

11-11: LGTM! 사용자 데이터를 가져오는 로직이 올바릅니다.

useGetMemberOfMe 훅을 사용하여 현재 사용자의 멤버 데이터를 가져오는 것이 적절합니다.

Also applies to: 93-93


96-96: 최신 기수 확인 로직이 올바릅니다.

memberOfMeData?.generation === LATEST_GENERATION 조건은 최신 기수(37기) 멤버에게만 작업 선호도 기능을 보여주도록 올바르게 구현되었습니다. Optional chaining으로 undefined 케이스도 적절히 처리됩니다.


257-261: LGTM! 조건부 렌더링이 모바일과 데스크톱 모두에서 일관되게 적용되었습니다.

canViewWorkPreference 플래그를 사용하여 작업 선호도 매칭 목록을 적절히 게이트하고 있으며, 모바일과 데스크톱 뷰 모두에서 일관성 있게 구현되었습니다.

Also applies to: 339-343

src/components/members/main/MemberList/WorkPreferenceMatchedMemberList.tsx (5)

3-3: LGTM! 모든 import가 컴포넌트에서 적절히 사용되고 있습니다.

새로 추가된 import들이 모두 컴포넌트 내에서 올바르게 사용되고 있습니다.

Also applies to: 8-14


77-104: LGTM! 새로고침 컨트롤의 조건부 렌더링이 적절합니다.

!isEmpty && hasWorkPreference 조건으로 새로고침 아이콘과 툴팁을 제어하는 것이 UX 관점에서 올바릅니다. 빈 상태일 때는 새로고침이 의미가 없으므로 숨기는 것이 적절합니다.


106-106: LGTM! 서브타이틀 조건부 렌더링이 일관성 있게 적용되었습니다.

새로고침 컨트롤과 동일한 조건(!isEmpty && hasWorkPreference)을 사용하여 서브타이틀을 표시하는 것이 일관된 UX를 제공합니다.


121-123: LGTM! 빈 상태 메시지가 사용자 상태에 따라 적절히 구분되었습니다.

작업 선호도 설정 여부(hasWorkPreference)에 따라 다른 메시지를 보여주는 것이 사용자 경험 측면에서 적절합니다.


239-239: 빈 상태의 블러 효과 증가가 시각적 계층 구조를 개선합니다.

블러 값을 4px에서 6px로 증가시킨 것은 빈 상태 콘텐츠의 가독성을 향상시키는 작은 시각적 개선입니다.

<Text typography='SUIT_32_B'>37기 앱잼 TL 후보를 만나보세요🔥</Text>
<Text typography='SUIT_18_M' color={colors.gray200}>
정렬 순서는 접속할 때마다 무작위로 바뀌어요.
정렬 순서는 이름 기준 가나다 순이에요.
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

UI 텍스트와 실제 정렬 로직이 일치하지 않습니다.

Line 29의 텍스트는 "이름 기준 가나다 순"으로 정렬되어 있다고 사용자에게 알리고 있지만, lines 42-54의 렌더링 로직에는 실제 정렬 구현이 없습니다. 현재 코드는 serviceType으로만 필터링하고 있으며, 백엔드에서 반환하는 순서에 전적으로 의존하고 있습니다.

만약 API가 정렬된 데이터를 반환하더라도, 프론트엔드에서 명시적으로 정렬을 보장하지 않으면:

  • API 구현이 변경될 경우 UI가 잘못된 정보를 표시하게 됩니다
  • 사용자가 기대하는 일관된 순서가 보장되지 않습니다

다음과 같이 명시적인 정렬 로직을 추가하세요:

          <TeamLeaderCardsWrapper>
            {tlMemberList
              ?.filter((tlMember) => tlMember.serviceType === selectedPart)
+             .sort((a, b) => a.name.localeCompare(b.name, 'ko-KR'))
              .map((tlMember) => (
                <TeamLeaderCard
                  id={tlMember.id}
                  profileImageUrl={tlMember.profileImage}
                  key={tlMember.id}
                  name={tlMember.name}
                  university={tlMember.university}
                  activities={tlMember.activities}
                  introduction={tlMember.introduction}
                />
              ))}
          </TeamLeaderCardsWrapper>

Also applies to: 42-54

🤖 Prompt for AI Agents
In src/pages/members/team-leaders.tsx around lines 29 and 42-54, the UI text
claims the list is "이름 기준 가나다 순" but the rendering logic only filters by
serviceType and relies on backend order; add an explicit client-side sort step
after filtering and before rendering: sort the array by member name using
locale-aware comparison (e.g., nameA.localeCompare(nameB, 'ko') with safe
null/undefined handling and consistent case normalization) so the frontend
guarantees Korean 가나다 순 order regardless of API response; ensure the sort runs
every render/update where the filtered list is computed.

Copy link
Contributor

@imddoy imddoy left a comment

Choose a reason for hiding this comment

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

lgtm

@ljh0608 ljh0608 changed the base branch from develop to main December 13, 2025 05:48
@ljh0608 ljh0608 changed the base branch from main to develop December 13, 2025 05:48
@ljh0608 ljh0608 merged commit 9415de5 into develop Dec 13, 2025
5 of 6 checks passed
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/components/members/main/MemberList/WorkPreferenceMatchedMemberList.tsx (1)

31-35: isEmpty 계산을 boolean으로 고정해 “빈 리스트인데 빈 상태가 안 뜨는” 케이스를 방지해주세요
현재 const isEmpty = data?.recommendations && data.recommendations.length === 0;(Line 33)은 recommendations가 falsy/undefined인 경우 isEmptyundefined가 되어, 로딩 이후에도 빈 상태 대신 빈 그리드만 렌더될 여지가 있습니다.

예:

- const isEmpty = data?.recommendations && data.recommendations.length === 0;
- const hasWorkPreference = data?.hasWorkPreference;
+ const recommendations = data?.recommendations ?? [];
+ const isEmpty = recommendations.length === 0;
+ const hasWorkPreference = !!data?.hasWorkPreference;
...
- const recommendations = data?.recommendations || [];

Also applies to: 60-60, 108-140

🧹 Nitpick comments (2)
src/components/members/main/MemberList/index.tsx (1)

244-257: 주석 처리된 배너 블록은 feature flag/설정으로 관리하거나 제거 권장
Line 244-257, 330-338처럼 큰 JSX 블록을 주석으로 유지하면 유지보수/리뷰 비용이 커집니다(재활성화 계획이 있으면 토글 플래그로, 없으면 제거).

Also applies to: 330-338

src/components/members/main/MemberList/WorkPreferenceMatchedMemberList.tsx (1)

64-76: “37기” 하드코딩은 LATEST_GENERATION 기반으로 치환 권장 + return null/TODO 정리
타이틀(“나와 37기…”)은 상수화된 LATEST_GENERATION과 불일치하기 쉬워 유지보수 리스크가 큽니다. 또한 MyPreferenceSubTitlereturn <></> 대신 return null이 더 관용적이고, Line 126의 TODO는 현재 모달 오픈 로직이 들어와서( Line 37-44, 142 ) 의미가 바뀌었으니 정리하는 편이 좋습니다.

예:

+ import { LATEST_GENERATION } from '@/constants/generation';
...
- 나와 37기 사람들의 작업 궁합은?
+ 나와 {LATEST_GENERATION}기 사람들의 작업 궁합은?

Also applies to: 21-29, 121-131

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 84cb34a and 3e859ca.

📒 Files selected for processing (4)
  • src/components/members/main/MemberCard/WorkPreferneceMemberCard.tsx (3 hunks)
  • src/components/members/main/MemberList/WorkPreferenceMatchedMemberList.tsx (7 hunks)
  • src/components/members/main/MemberList/index.tsx (5 hunks)
  • src/pages/members/team-leaders.tsx (4 hunks)
🚧 Files skipped from review as they are similar to previous changes (2)
  • src/components/members/main/MemberCard/WorkPreferneceMemberCard.tsx
  • src/pages/members/team-leaders.tsx
🧰 Additional context used
🧬 Code graph analysis (2)
src/components/members/main/MemberList/index.tsx (2)
src/api/endpoint/members/getMemberOfMe.ts (1)
  • useGetMemberOfMe (30-38)
src/constants/generation.ts (1)
  • LATEST_GENERATION (1-1)
src/components/members/main/MemberList/WorkPreferenceMatchedMemberList.tsx (1)
src/styles/mediaQuery.ts (1)
  • MOBILE_MEDIA_QUERY (12-12)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: build-app / build
  • GitHub Check: chromatic-deploy
🔇 Additional comments (1)
src/components/members/main/MemberList/index.tsx (1)

258-262: canViewWorkPreference로 모바일/데스크톱 모두 조건부 노출 처리 좋습니다
Line 258-262, 340-344에서 동일한 가드로 노출을 제한해 “최신 기수만” 요구사항을 UI 레벨에서 명확히 충족합니다.

Also applies to: 340-344

import { useRouter } from 'next/router';
import React, { ChangeEvent, FC, ReactNode, useEffect, useMemo, useState } from 'react';

import { useGetMemberOfMe } from '@/api/endpoint/members/getMemberOfMe';
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

# Find the MemberList component
find . -type f -name "index.tsx" -path "*MemberList*" 2>/dev/null | head -20

Repository: sopt-makers/sopt-playground-frontend

Length of output: 130


🏁 Script executed:

# Also search for getMemberOfMe hook
find . -type f -name "*getMemberOfMe*" 2>/dev/null

Repository: sopt-makers/sopt-playground-frontend

Length of output: 123


🏁 Script executed:

# Get general structure
git ls-files | grep -E "(members|MemberList)" | head -20

Repository: sopt-makers/sopt-playground-frontend

Length of output: 961


🏁 Script executed:

cat -n ./src/components/members/main/MemberList/index.tsx | head -120

Repository: sopt-makers/sopt-playground-frontend

Length of output: 5560


🏁 Script executed:

cat -n ./src/api/endpoint/members/getMemberOfMe.ts

Repository: sopt-makers/sopt-playground-frontend

Length of output: 1182


🏁 Script executed:

cat -n ./src/components/members/main/MemberList/index.tsx | sed -n '90,150p'

Repository: sopt-makers/sopt-playground-frontend

Length of output: 2849


🏁 Script executed:

# Check if there's more context about isHydrated usage
cat -n ./src/components/members/main/MemberList/index.tsx | grep -A 5 -B 5 "isHydrated"

Repository: sopt-makers/sopt-playground-frontend

Length of output: 1077


🏁 Script executed:

cat -n ./src/components/members/main/MemberList/index.tsx | grep -A 10 "setIsHydrated"

Repository: sopt-makers/sopt-playground-frontend

Length of output: 830


🏁 Script executed:

# Get the full file to see all useEffect hooks
wc -l ./src/components/members/main/MemberList/index.tsx

Repository: sopt-makers/sopt-playground-frontend

Length of output: 134


🏁 Script executed:

cat -n ./src/components/members/main/MemberList/index.tsx | sed -n '150,158p'

Repository: sopt-makers/sopt-playground-frontend

Length of output: 352


useGetMemberOfMe() SSR/초기 렌더링 단계에서 불필요한 호출 방지 필요

Line 93에서 useGetMemberOfMe() 훅이 조건 없이 실행되어, SSR 단계와 초기 하이드레이션 중에 불필요한 API 호출이 발생합니다. isHydrated는 Line 154의 useEffect에서 설정되므로, 훅 호출 시점(Line 93)에는 아직 false 상태입니다. 따라서 UI 렌더링을 isHydrated로 막아도(Line 225) 실제 API 요청은 이미 진행된 상태입니다. 특히 인증이 필요한 엔드포인트의 경우 불필요한 에러와 재시도가 발생할 수 있습니다.

해결책:

  1. useGetMemberOfMe를 옵션 파라미터(enabled 포함)를 받도록 확장
  2. 호출 시 { enabled: isHydrated }로 제어
- const { data: memberOfMeData } = useGetMemberOfMe();
+ const { data: memberOfMeData } = useGetMemberOfMe({ enabled: isHydrated });

src/api/endpoint/members/getMemberOfMe.tsuseGetMemberOfMe 함수도 다음처럼 수정:

export const useGetMemberOfMe = (options?: UseQueryOptions) => {
  return useQuery({
    queryKey: ['getMemberOfMe'],
    queryFn: async () => {
      const data = await getMemberOfMe.request();
      return data;
    },
    ...options,
  });
};
🤖 Prompt for AI Agents
In src/components/members/main/MemberList/index.tsx around line 11 and use at
line 93, useGetMemberOfMe is called unconditionally causing API calls during
SSR/hydration; update the hook to accept query options and control execution
with an enabled flag, and then call it with { enabled: isHydrated } once
isHydrated is set. Modify src/api/endpoint/members/getMemberOfMe.ts to change
useGetMemberOfMe signature to accept an options parameter (e.g.,
UseQueryOptions) and spread those into the useQuery call so callers can pass
enabled, then in MemberList import and call useGetMemberOfMe({ enabled:
isHydrated }) to prevent requests before hydration.

Comment on lines +77 to +104
{!isEmpty && hasWorkPreference && (
<>
<RefreshIconWrapper>
<button
onClick={() => {
queryClient.invalidateQueries({ queryKey: ['getRecommendations'] });
}}
>
<StyledRefreshIcon />
</button>
{/* <Responsive only='mobile'> */}
<MobileTooltipWrapper>
<Text typography='SUIT_13_M' color={colors.gray50}>
더 많은 멤버를 찾아보세요!
</Text>
</MobileTooltipWrapper>
{/* </Responsive> */}
</RefreshIconWrapper>

{/* <Responsive only='desktop'>
<TooltipWrapper>
<Text typography='SUIT_13_M' color={colors.gray50}>
더 많은 멤버를 찾아보세요!
</Text>
</TooltipWrapper>
</Responsive> */}
</>
)}
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== tsconfig noUnusedLocals/noUnusedParameters =="
fd -a 'tsconfig*.json' -x bash -lc 'echo "--- {}"; rg -n "noUnusedLocals|noUnusedParameters" "{}" || true'

Repository: sopt-makers/sopt-playground-frontend

Length of output: 427


🏁 Script executed:

#!/bin/bash
echo "== Checking file existence and size =="
if [ -f "src/components/members/main/MemberList/WorkPreferenceMatchedMemberList.tsx" ]; then
  wc -l "src/components/members/main/MemberList/WorkPreferenceMatchedMemberList.tsx"
else
  echo "File not found"
fi

Repository: sopt-makers/sopt-playground-frontend

Length of output: 197


🏁 Script executed:

#!/bin/bash
echo "== TooltipWrapper imports and usage =="
rg -n "TooltipWrapper|MobileTooltipWrapper|Responsive" src/components/members/main/MemberList/WorkPreferenceMatchedMemberList.tsx | head -50

Repository: sopt-makers/sopt-playground-frontend

Length of output: 771


🏁 Script executed:

#!/bin/bash
echo "== Reading relevant sections of the file =="
if [ -f "src/components/members/main/MemberList/WorkPreferenceMatchedMemberList.tsx" ]; then
  echo "--- Lines 1-30 (imports) ---"
  sed -n '1,30p' src/components/members/main/MemberList/WorkPreferenceMatchedMemberList.tsx
  
  echo ""
  echo "--- Lines 75-110 (first concern area) ---"
  sed -n '75,110p' src/components/members/main/MemberList/WorkPreferenceMatchedMemberList.tsx
  
  echo ""
  echo "--- Lines 145-175 (second concern area) ---"
  sed -n '145,175p' src/components/members/main/MemberList/WorkPreferenceMatchedMemberList.tsx
  
  echo ""
  echo "--- Lines 178-205 (third concern area) ---"
  sed -n '178,205p' src/components/members/main/MemberList/WorkPreferenceMatchedMemberList.tsx
fi

Repository: sopt-makers/sopt-playground-frontend

Length of output: 4343


🏁 Script executed:

#!/bin/bash
echo "== Full tsconfig.json content =="
cat tsconfig.json

Repository: sopt-makers/sopt-playground-frontend

Length of output: 894


🏁 Script executed:

#!/bin/bash
echo "== Search for TooltipWrapper usage across entire codebase =="
rg -n "TooltipWrapper" --type typescript --type tsx

Repository: sopt-makers/sopt-playground-frontend

Length of output: 192


🏁 Script executed:

#!/bin/bash
echo "== Check if noUnusedLocals is enabled (including extends) =="
rg -A 50 '"compilerOptions"' tsconfig.json | head -80

Repository: sopt-makers/sopt-playground-frontend

Length of output: 920


🏁 Script executed:

#!/bin/bash
echo "== Search for TooltipWrapper usage across codebase =="
rg "TooltipWrapper" --glob "*.tsx" --glob "*.ts" -n

Repository: sopt-makers/sopt-playground-frontend

Length of output: 1420


🏁 Script executed:

#!/bin/bash
echo "== Check button element more carefully at lines 82-84 =="
sed -n '80,86p' src/components/members/main/MemberList/WorkPreferenceMatchedMemberList.tsx

Repository: sopt-makers/sopt-playground-frontend

Length of output: 403


모바일 툴팁이 데스크톱에서도 렌더되는 문제 + TooltipWrapper 미사용

라인 87-93에서 Responsive 래퍼가 주석 처리돼 MobileTooltipWrapper가 모든 뷰포트에서 노출됩니다. 또한 라인 180에서 정의된 TooltipWrapper는 라인 96-102의 주석 처리된 코드에만 포함되어 실제로는 렌더링되지 않습니다.

권장: (1) 모바일/데스크톱 분기를 위해 Responsive 래퍼를 복구하거나 (2) 하나의 툴팁 컴포넌트로 통합한 후 미사용 TooltipWrapper 정의와 주석 블록을 제거해주세요. 추가로 라인 82의 버튼에 type="button"aria-label 속성을 추가하시길 권장합니다.

🤖 Prompt for AI Agents
In src/components/members/main/MemberList/WorkPreferenceMatchedMemberList.tsx
around lines 77-104 (notably lines 82, 87-93 and 96-102) the
MobileTooltipWrapper is rendered for all viewports because the Responsive
wrapper was commented out and the TooltipWrapper (defined at line 180) is never
used; restore proper viewport branching or consolidate into a single Tooltip
component, remove the unused TooltipWrapper definition at line 180 and delete
the commented Responsive/Tooltip blocks, and add type="button" and a descriptive
aria-label on the button at line 82 (e.g., aria-label="refresh recommendations")
so the UI behaves correctly and is accessible.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants