Skip to content

[feat] 채팅 목차 알림 상태 추가#113

Merged
hyejun0228 merged 4 commits intodevelopfrom
112-feat-채팅-목차-알림-상태-추가
Feb 17, 2026

Hidden character warning

The head ref may contain hidden characters: "112-feat-\ucc44\ud305-\ubaa9\ucc28-\uc54c\ub9bc-\uc0c1\ud0dc-\ucd94\uac00"
Merged

[feat] 채팅 목차 알림 상태 추가#113
hyejun0228 merged 4 commits intodevelopfrom
112-feat-채팅-목차-알림-상태-추가

Conversation

@hyejun0228
Copy link
Copy Markdown
Collaborator

@hyejun0228 hyejun0228 commented Feb 17, 2026

premember 작업 이후 머지 예정입니다

Summary by CodeRabbit

Release Notes

  • New Features

    • Muted chat rooms now display a visual mute indicator icon next to the room name for quick identification.
  • Style

    • Enhanced the notification panel with improved CSS animations and smooth transitions, providing better visual feedback when opening and closing the panel.

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Feb 17, 2026

📝 Walkthrough

Walkthrough

The PR refactors the ChatHeader notification panel overlay to use CSS-based visibility toggling with transitions instead of conditional mounting, while adding a muted room indicator icon in the chat list.

Changes

Cohort / File(s) Summary
ChatHeader Overlay Refactoring
src/components/layout/Header/components/ChatHeader.tsx
Replaces conditional rendering of the notification panel with a consistently mounted overlay wrapper that toggles visibility via CSS transforms and pointer-events. Adds transition-enabled classes for animated transitions while preserving all existing functional behavior (mute toggle, open/close controls, group member rendering).
Chat List Mute Indicator
src/pages/Chat/index.tsx
Imports BellOfIcon and conditionally renders it next to room labels when room.isMuted is truthy, providing a visual indicator for muted rooms in the chat list.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Possibly related PRs

  • BCSDLab/KONECT_FRONT_END#108: Added initial isMuted and toggleMute support that this PR leverages for notification overlay and chat list mute indicators.

Poem

🐰 A whisper through the warren fair,
The overlay now glides with care,
With transitions smooth and bells that mute,
The UI dances—oh how cute! 🔔✨

🚥 Pre-merge checks | ✅ 2 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Merge Conflict Detection ⚠️ Warning ⚠️ Unable to check for merge conflicts: Invalid branch name format
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly describes the main change: adding notification status indicators to the chat list. The changes show adding a bell-off icon for muted rooms and updating the notification panel structure.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ 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 112-feat-채팅-목차-알림-상태-추가
⚔️ Resolve merge conflicts (beta)
  • Auto-commit resolved conflicts to branch 112-feat-채팅-목차-알림-상태-추가
  • Create stacked PR with resolved conflicts
  • Post resolved changes as copyable diffs in a comment

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

@hyejun0228 hyejun0228 self-assigned this Feb 17, 2026
Copy link
Copy Markdown
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: 2

🧹 Nitpick comments (1)
src/pages/Chat/index.tsx (1)

48-52: Consider simplifying the icon wrapper and verify SVG color inheritance.

The wrapping <span> with text-xs text-gray-400 may be unnecessary if you apply classes directly to BellOfIcon. The text-gray-400 class only works if the SVG uses currentColor for its fill/stroke.

♻️ Simplified markup (if SVG uses currentColor)
                  {room.isMuted && (
-                    <span className="text-xs text-gray-400">
-                      <BellOfIcon className="h-4 w-4" />
-                    </span>
+                    <BellOfIcon className="h-4 w-4 text-gray-400" />
                  )}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/pages/Chat/index.tsx` around lines 48 - 52, The mute icon wrapper can be
simplified: remove the surrounding <span> used in the room.isMuted conditional
and apply sizing and color classes directly to the BellOfIcon component (refer
to the room.isMuted conditional and BellOfIcon usage in Chat/index.tsx); ensure
the BellOfIcon SVG uses currentColor for its fill/stroke or update the SVG to
accept className-based color (or alternatively pass an explicit fill/stroke
prop) so the text-gray-400 and h-4 w-4 styling applied to BellOfIcon correctly
controls its appearance.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/components/layout/Header/components/ChatHeader.tsx`:
- Line 77: The img in ChatHeader.tsx rendering member.imageUrl is missing an alt
attribute; update the <img> element (the one using member.imageUrl and
className="h-8 w-8 rounded-full") to include an accessible alt value such as
member.name or member.displayName with a sensible fallback (e.g., `${member.name
|| 'Member'} avatar`) so screen readers get a descriptive label.
- Around line 57-68: The toggle button in ChatHeader lacks accessibility
attributes; update the button (the element that calls toggleMute and reads
isMuted) to expose its role and state by adding an accessible name and ARIA
state: set a dynamic aria-label like aria-label={isMuted ? 'Unmute
notifications' : 'Mute notifications'} and include aria-pressed={isMuted} (or
role="switch" with aria-checked={isMuted} if you prefer switch semantics); also
mark the decorative inner <span> as aria-hidden="true" so screen readers focus
on the button state only.

---

Nitpick comments:
In `@src/pages/Chat/index.tsx`:
- Around line 48-52: The mute icon wrapper can be simplified: remove the
surrounding <span> used in the room.isMuted conditional and apply sizing and
color classes directly to the BellOfIcon component (refer to the room.isMuted
conditional and BellOfIcon usage in Chat/index.tsx); ensure the BellOfIcon SVG
uses currentColor for its fill/stroke or update the SVG to accept
className-based color (or alternatively pass an explicit fill/stroke prop) so
the text-gray-400 and h-4 w-4 styling applied to BellOfIcon correctly controls
its appearance.

Comment on lines +57 to +68
<button
onClick={() => toggleMute()}
className={`relative inline-flex h-6 w-11 items-center rounded-full transition-colors ${
isMuted ? 'bg-gray-300' : 'bg-primary'
}`}
>
<span
className={`inline-block h-4 w-4 transform rounded-full bg-white transition-transform ${
isMuted ? 'translate-x-1' : 'translate-x-6'
}`}
>
<span
className={`inline-block h-4 w-4 transform rounded-full bg-white transition-transform ${
isMuted ? 'translate-x-1' : 'translate-x-6'
}`}
/>
</button>
</div>
/>
</button>
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Add accessibility attributes to the toggle button.

The toggle switch should have an accessible label and appropriate ARIA attributes to indicate its purpose and current state to screen reader users.

♿ Proposed accessibility fix
             <button
               onClick={() => toggleMute()}
+              aria-label="알림"
+              aria-pressed={!isMuted}
+              role="switch"
               className={`relative inline-flex h-6 w-11 items-center rounded-full transition-colors ${
                 isMuted ? 'bg-gray-300' : 'bg-primary'
               }`}
             >
📝 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
<button
onClick={() => toggleMute()}
className={`relative inline-flex h-6 w-11 items-center rounded-full transition-colors ${
isMuted ? 'bg-gray-300' : 'bg-primary'
}`}
>
<span
className={`inline-block h-4 w-4 transform rounded-full bg-white transition-transform ${
isMuted ? 'translate-x-1' : 'translate-x-6'
}`}
>
<span
className={`inline-block h-4 w-4 transform rounded-full bg-white transition-transform ${
isMuted ? 'translate-x-1' : 'translate-x-6'
}`}
/>
</button>
</div>
/>
</button>
<button
onClick={() => toggleMute()}
aria-label="알림"
aria-pressed={!isMuted}
role="switch"
className={`relative inline-flex h-6 w-11 items-center rounded-full transition-colors ${
isMuted ? 'bg-gray-300' : 'bg-primary'
}`}
>
<span
className={`inline-block h-4 w-4 transform rounded-full bg-white transition-transform ${
isMuted ? 'translate-x-1' : 'translate-x-6'
}`}
/>
</button>
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/layout/Header/components/ChatHeader.tsx` around lines 57 - 68,
The toggle button in ChatHeader lacks accessibility attributes; update the
button (the element that calls toggleMute and reads isMuted) to expose its role
and state by adding an accessible name and ARIA state: set a dynamic aria-label
like aria-label={isMuted ? 'Unmute notifications' : 'Mute notifications'} and
include aria-pressed={isMuted} (or role="switch" with aria-checked={isMuted} if
you prefer switch semantics); also mark the decorative inner <span> as
aria-hidden="true" so screen readers focus on the button state only.

<div className="flex flex-col gap-3">
{clubMembers.map((member) => (
<div key={member.userId} className="flex items-center gap-3">
<img src={member.imageUrl} className="h-8 w-8 rounded-full" />
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Add alt attribute to the member image.

The <img> element is missing an alt attribute, which is required for accessibility. Screen readers need this to describe the image content.

♿ Proposed fix
-                    <img src={member.imageUrl} className="h-8 w-8 rounded-full" />
+                    <img src={member.imageUrl} alt={member.name} className="h-8 w-8 rounded-full" />
📝 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
<img src={member.imageUrl} className="h-8 w-8 rounded-full" />
<img src={member.imageUrl} alt={member.name} className="h-8 w-8 rounded-full" />
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/layout/Header/components/ChatHeader.tsx` at line 77, The img
in ChatHeader.tsx rendering member.imageUrl is missing an alt attribute; update
the <img> element (the one using member.imageUrl and className="h-8 w-8
rounded-full") to include an accessible alt value such as member.name or
member.displayName with a sensible fallback (e.g., `${member.name || 'Member'}
avatar`) so screen readers get a descriptive label.

@hyejun0228 hyejun0228 merged commit 4154d03 into develop Feb 17, 2026
2 checks passed
@ff1451 ff1451 mentioned this pull request Feb 20, 2026
ff1451 added a commit that referenced this pull request Feb 20, 2026
* feat: 알림설정 구현 (#108)

* chore: min-w 추가

* [chore] 코드래빗 설정 파일 추가 (#110)

* chore: 코드래빗 설정 파일 추가

* chore: 불필요한 tools 설정 제거

* [feat] preMember 목록 분리 및 삭제 기능 추가 (#115)

* feat: preMember 목록 분리 및 삭제 기능 추가

* chore: Pascal case

* chore: 변경된 변수명 반영

* feat: 학번 숫자 필터링 추가

* [feat] 채팅 목차 알림 상태 추가 (#113)

* chore: svg 추가

* feat: 채팅목록 알림 끄기 설정시 UI 추가

* feat: 목차 열릴시 애니메이션 추가

* [feat] 달력 카테고리 분류 추가 (#118)

* feat: 카테고리 추가

* chore: 불필요한 코드 삭제

* [refactor] 관리자 페이지 및 마이페이지 UI 수정 및 리팩토링 (#117)

* feat: 정보 카드에서 정보 페이지로 이동하도록 기능 추가

* feat: 토스트 전역상태 추가

* refactor: query 훅 분리 및 onSuccess 콜백 옵션 제거

* refactor: query 훅 사용처 수정

* refactor: 사용처 수정 2

* fix: 채팅창 스크롤 초기화 문제 수정 및 줄바꿈 기준 변경

* feat: 토글 스위치 구현

* refactor: 모집 공고 관련 목록 페이지 디자인 수정

* feat: 컴포넌트 구현 및 icon 추가

* refactor: z-index 값 수정

* refactor: API 필드 변경 사항 반영

* refactor: 모집 공고 페이지 디자인 수정 및 라우트 백 수정

* refactor: 학교 목록에 없을 시 문구 디자인 수정

* fix: lint error

* fix: 타입 변경

* feat: 모집 관련 페이지 API 추가사항 반영

* refactor: 토스트 타이머 클린업 추라

* refactor: 전역토스트 사용 변경

* refactor: 관리자 클럽 조회 훅 호출 범위 줄이기

* feat: onError handler add

* chore: add button type and remove fragment

* [feat] 문의하기 버튼 로직 추가 (#120)

* feat: API 추가 및 연결

* chore: placeholder 제거

* [fix] 채팅 스크롤 미갱신 버그 및 멤버 직위 렌더링 수정 (#122)

* fix: 채팅 스크롤 미작동 수정

* fix: 한글 출력으로 수정

* feat: 첫 글자 보여주도록 수정 (#124)

* hotfix: 동아리 소개 줄바꿈 적용 및 한 줄 소개 글자수 제한 상향

* chore: 리뷰 반영

* fix: disabled 조건 변경

* 126 fix 배포 전 qa 사항 반영 (#127)

* fix: 가입 버튼 문구 수정

* fix: 검색창 placeholder 수정

* fix: 불필요해진 UI 비활성화

* fix: 모집공고 없을 때 빈 화면 처리

* fix: 무의미한 회비페이지 수정

* feat: 토글 시 자동 페이지 이동 추가

* fix: 페이지 이동 조건 수정

---------

Co-authored-by: 김혜준 <114041848+hyejun0228@users.noreply.github.com>
Co-authored-by: hyejun <hyejunkkim228@gmail.com>
ff1451 added a commit that referenced this pull request Mar 6, 2026
* develop → main 배포 (#125)

* feat: 알림설정 구현 (#108)

* chore: min-w 추가

* [chore] 코드래빗 설정 파일 추가 (#110)

* chore: 코드래빗 설정 파일 추가

* chore: 불필요한 tools 설정 제거

* [feat] preMember 목록 분리 및 삭제 기능 추가 (#115)

* feat: preMember 목록 분리 및 삭제 기능 추가

* chore: Pascal case

* chore: 변경된 변수명 반영

* feat: 학번 숫자 필터링 추가

* [feat] 채팅 목차 알림 상태 추가 (#113)

* chore: svg 추가

* feat: 채팅목록 알림 끄기 설정시 UI 추가

* feat: 목차 열릴시 애니메이션 추가

* [feat] 달력 카테고리 분류 추가 (#118)

* feat: 카테고리 추가

* chore: 불필요한 코드 삭제

* [refactor] 관리자 페이지 및 마이페이지 UI 수정 및 리팩토링 (#117)

* feat: 정보 카드에서 정보 페이지로 이동하도록 기능 추가

* feat: 토스트 전역상태 추가

* refactor: query 훅 분리 및 onSuccess 콜백 옵션 제거

* refactor: query 훅 사용처 수정

* refactor: 사용처 수정 2

* fix: 채팅창 스크롤 초기화 문제 수정 및 줄바꿈 기준 변경

* feat: 토글 스위치 구현

* refactor: 모집 공고 관련 목록 페이지 디자인 수정

* feat: 컴포넌트 구현 및 icon 추가

* refactor: z-index 값 수정

* refactor: API 필드 변경 사항 반영

* refactor: 모집 공고 페이지 디자인 수정 및 라우트 백 수정

* refactor: 학교 목록에 없을 시 문구 디자인 수정

* fix: lint error

* fix: 타입 변경

* feat: 모집 관련 페이지 API 추가사항 반영

* refactor: 토스트 타이머 클린업 추라

* refactor: 전역토스트 사용 변경

* refactor: 관리자 클럽 조회 훅 호출 범위 줄이기

* feat: onError handler add

* chore: add button type and remove fragment

* [feat] 문의하기 버튼 로직 추가 (#120)

* feat: API 추가 및 연결

* chore: placeholder 제거

* [fix] 채팅 스크롤 미갱신 버그 및 멤버 직위 렌더링 수정 (#122)

* fix: 채팅 스크롤 미작동 수정

* fix: 한글 출력으로 수정

* feat: 첫 글자 보여주도록 수정 (#124)

* hotfix: 동아리 소개 줄바꿈 적용 및 한 줄 소개 글자수 제한 상향

* chore: 리뷰 반영

* fix: disabled 조건 변경

* 126 fix 배포 전 qa 사항 반영 (#127)

* fix: 가입 버튼 문구 수정

* fix: 검색창 placeholder 수정

* fix: 불필요해진 UI 비활성화

* fix: 모집공고 없을 때 빈 화면 처리

* fix: 무의미한 회비페이지 수정

* feat: 토글 시 자동 페이지 이동 추가

* fix: 페이지 이동 조건 수정

---------

Co-authored-by: 김혜준 <114041848+hyejun0228@users.noreply.github.com>
Co-authored-by: hyejun <hyejunkkim228@gmail.com>

* develop -> main 배포 (#132)

* chore: 타입 변경 반영

* [feat] 모집 공고에 시간 추가 및 지원서 정렬 추가 (#131)

* feat: 모집 공고에 시작, 종료 시간 추가

* feat: 지원자 목록 정렬 추가 및 시간 표시

* feat: 채팅, 모집 공고 링크 파싱 기능 추가

* feat: 인스타그램 파싱 추가

* fix: prettier error

* refactor: 유틸 분리 및 타입 변경

* chore: 타입 변경 반영

* chore: 동일 스타일 통합 및 entity 확장 사용

* chore:ios 토큰 테스트를 위한 로직 추가

* Revert "chore:ios 토큰 테스트를 위한 로직 추가"

This reverts commit 98570fc.

* hotfix: 모집 공고 textarea 길이 자동 재계산 추가

* feat: 페이지네이션 추가

* feat: 수정

* feat: 페이지네이션 수정

* feat: 디자인 수정

* feat: 로직 수정

* fix: key 수정

* develop-> main (#135)

* chore: 타입 변경 반영

* [feat] 모집 공고에 시간 추가 및 지원서 정렬 추가 (#131)

* feat: 모집 공고에 시작, 종료 시간 추가

* feat: 지원자 목록 정렬 추가 및 시간 표시

* feat: 채팅, 모집 공고 링크 파싱 기능 추가

* feat: 인스타그램 파싱 추가

* fix: prettier error

* refactor: 유틸 분리 및 타입 변경

* chore: 타입 변경 반영

* chore: 동일 스타일 통합 및 entity 확장 사용

* chore:ios 토큰 테스트를 위한 로직 추가

* Revert "chore:ios 토큰 테스트를 위한 로직 추가"

This reverts commit 98570fc.

* hotfix: 모집 공고 textarea 길이 자동 재계산 추가

* Reapply "chore:ios 토큰 테스트를 위한 로직 추가"

This reverts commit 3a56f4a.

* chore: ios토큰

* feat: 가이드 페이지 이미지 변경

* chore: 푸시알림 로직 임시 변경

* refactor: 푸시 알림 토큰 로직 브릿지 방식으로 수정 (#134)

* refactor: 푸시 알림 토큰 로직 브릿지 방식으로 수정

* fix: try catch 적용

* feat: 페이지네이션 추가

* feat: 수정

* feat: 페이지네이션 수정

* feat: 디자인 수정

* feat: 로직 수정

* fix: key 수정

* chore: 스테이지 용 임시 UI 제거

---------

Co-authored-by: hyejun <hyejunkkim228@gmail.com>

* [feat] sentry 모니터링 추가 (#141) (#142)

* chore: sentry 의존성 추가

* feat: sentry 세팅

* chore: 워크플로우 수정 및 vite 세팅

* chore: 임시 추가

* refactor: 색상 토큰 파일 분리

* refactor: 타이포그래피 스타일 파일 분리

* refactor: 피그마 타이포그래피 네이밍으로 클래스 정렬

* fix: 리뷰 코멘트 기반 접근성 및 토큰 정리

---------

Co-authored-by: 김혜준 <114041848+hyejun0228@users.noreply.github.com>
Co-authored-by: hyejun <hyejunkkim228@gmail.com>
@ff1451 ff1451 deleted the 112-feat-채팅-목차-알림-상태-추가 branch April 7, 2026 09:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant