Skip to content

[feat] 알림 페이지 구현#41

Open
limtjdghks wants to merge 16 commits into
devfrom
feat/ALT-232
Open

[feat] 알림 페이지 구현#41
limtjdghks wants to merge 16 commits into
devfrom
feat/ALT-232

Conversation

@limtjdghks
Copy link
Copy Markdown
Member

@limtjdghks limtjdghks commented May 20, 2026

ID

  • ALT-232

변경 내용

  • 알림 페이지, 설정 페이지 UI 구현
  • 알림 조회 / 알림 수신 설정 API 연동

구현 사항

알림 아이템 컴포넌트 (NotificationItem)

  • 읽음/미읽음 상태에 따른 배경색 구분
  • 알림 메시지 내 특정 단어 하이라이트 지원
  • 좌측 스와이프로 삭제 — 임계값(30px) 초과 시 자동 삭제, 별도 버튼 클릭 불필요

알림 페이지 (/notifications)

  • 대타 / 평판 탭 전환, 미읽음 알림 탭에 빨간 점 표시
  • 스티키 헤더 (스크롤 시 탭 고정)
  • 스크롤 기반 무한 스크롤 (IntersectionObserver)
  • 로딩 스피너 / 에러 / 빈 상태 처리
  • 헤더 우측 설정 아이콘 → 알림 설정 페이지 이동
  • Navbar 벨 아이콘 → 알림 페이지 이동 연결

알림 설정 페이지 (/notifications/settings)

  • 전체 알림 켜기 (GENERAL) — API 연동
  • 대타 / 평판 알림 켜기 — 로컬 상태, 전체 알림 off 시 비활성화
  • Toggle 공용 컴포넌트 추가

API 연동

  • 알림 목록 조회: 알바생 GET /app/users/me/notifications / 사장님 GET /manager/notifications/me
    • scope 기반 자동 엔드포인트 선택
    • 커서 기반 페이지네이션 (useInfiniteQuery)
  • 알림 수신 설정 조회: GET /app/users/me/notification-consent / GET /manager/me/notification-consent
    • staleTime 1시간으로 불필요한 재요청 방지
  • 알림 수신 설정 변경: PUT /app/users/me/notification-consent / PUT /manager/me/notification-consent
  • query / mutation 훅 분리 (useNotificationConsent, useUpdateNotificationConsent)
  • queryKeys.notification.list / queryKeys.notification.consent 추가

구현 시연 (필요 시)

2026-05-20.10.08.43.mov

참고 사항 (필요 시)

필요한 API

  • 알림 삭제
  • 평판 알림 API
  • 알림 수신 설정
    • 현재 전체 알림, 야간 알림만 있음
    • UI상으로는 대타 알림과 평판 알림 on/off 기능이 추가되어야함

디자인 수정되어야하는거

  • 대타, 평판 알림만 있음
  • 그 이외의 알림은 어떻게 확인해야하나요

Summary by CodeRabbit

  • New Features
    • 알림 페이지 추가 — 알림 타입 선택 드롭다운으로 필터링, 무한 스크롤 및 추가 로딩 표시
    • 알림 설정 페이지 추가 — 전체/대타/평판/야간 토글 제공(야간: 23:00~08:00), 전체 토글에 따른 하위 토글 비활성화
    • 내비게이션 바의 알림 버튼으로 알림 페이지 이동
    • 알림 항목 개선 — 읽음 상태 표시, 하이라이트 텍스트, 스와이프로 삭제 지원

Review Change Stack

@limtjdghks limtjdghks requested review from dohy-eon and kim3360 May 20, 2026 12:26
@limtjdghks limtjdghks self-assigned this May 20, 2026
@vercel
Copy link
Copy Markdown

vercel Bot commented May 20, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
alter-client Ready Ready Preview, Comment May 22, 2026 8:44am

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 20, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 16397524-a591-4ffa-b07a-20f2018830ca

📥 Commits

Reviewing files that changed from the base of the PR and between b654be8 and 74ae6d0.

📒 Files selected for processing (8)
  • .gitignore
  • src/features/notification/api/notifications.ts
  • src/features/notification/hooks/useNotifications.ts
  • src/features/notification/types/index.ts
  • src/features/notification/types/notificationType.ts
  • src/features/notification/useNotificationViewModel.ts
  • src/pages/notification/index.tsx
  • src/shared/lib/queryKeys.ts
✅ Files skipped from review due to trivial changes (1)
  • .gitignore

📝 Walkthrough

Walkthrough

알림 타입·API, React Query 훅, 뷰모델, 알림 목록/설정 페이지, Toggle·NotificationItem UI, 라우팅 통합과 Storybook 설정이 추가되었습니다.

Changes

알림 기능 추가

Layer / File(s) Summary
타입 및 API 계층
src/features/notification/types/consent.ts, src/features/notification/types/index.ts, src/features/notification/types/notificationType.ts, src/features/notification/api/notificationConsent.ts, src/features/notification/api/notifications.ts, src/shared/lib/queryKeys.ts
알림·동의 DTO/타입, 쿼리 키와 fetchUserNotifications/fetchManagerNotifications, fetchUserNotificationConsent/updateUserNotificationConsent 등 API 래퍼를 추가했습니다.
React Query 훅
src/features/notification/hooks/useNotificationConsent.ts, src/features/notification/hooks/useNotifications.ts, src/features/notification/hooks/useUpdateNotificationConsent.ts
scope에 따라 API를 선택하는 쿼리/무한쿼리/뮤테이션 구현(무효화, 1시간 staleTime, cursor 기반 페이징).
뷰모델 및 파생 상태
src/features/notification/useNotificationViewModel.ts, src/features/notification/useNotificationSettingsViewModel.ts
목록 필터·삭제 필터·시간 포맷·동의 토글 핸들러 등 UI용 파생 상태와 핸들러를 제공.
알림 페이지
src/pages/notification/index.tsx, src/pages/notification/settings/index.tsx
목록 페이지: 타입 필터 드롭다운, sentinel 기반 무한 스크롤, 로딩/에러/빈 목록 분기. 설정 페이지: 전체·대타·평판·야간 토글 바인딩 및 disabled 처리.
공유 UI 컴포넌트
src/shared/ui/common/Toggle.tsx, src/shared/ui/notification/NotificationItem.tsx, storybook/stories/NotificationItem.stories.tsx, tailwind.config.js
Toggle(ARIA 포함), NotificationItem(메시지 하이라이트, swipe-to-delete 터치·마우스 핸들링), Storybook 스토리, Tailwind에 Storybook 경로 포함.
라우팅 및 통합
src/app/App.tsx, src/shared/ui/common/Navbar.tsx, src/shared/constants/routes.ts, .gitignore
ROUTES.NOTIFICATIONSROUTES.NOTIFICATION_SETTINGS 추가, Navbar의 알림 버튼으로 /notifications로 내비게이션 연결, .serena 무시 등록.

🎯 Estimated Code Review Effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

⚠️ 핵심 검토 이슈 (시니어 관점 — 우선 순위 높은 문제만)

  1. scope 검증 부재 — 잘못된 scope로 잘못된 엔드포인트 호출 가능
  • 수정안: 훅/뮤테이션 진입부에서 scope를 검증해 invalid이면 쿼리 비활성화 또는 명시적 예외 발생 (예: enabled: scope === 'USER' || scope === 'MANAGER' 또는 throw new Error('Invalid scope')).
  1. 무한 스크롤 IntersectionObserver 의존성 및 정리 확인 필요 — 중복 관찰/메모리 누수 위험
  • 수정안: useEffect 의존성에 sentinelRef.current, hasNextPage, isFetchingNextPage 포함하고 cleanup에서 observer.disconnect() 보장. 옵저버 콜백에서 isFetchingNextPage/hasNextPage 체크 우선.
  1. 동의 토글 로컬 상태 동기화 타이밍 — 서버 실패 시 UI 불일치 발생 가능
  • 수정안: handleAllChange에서 mutate의 onSuccess에서만 setSubstituteEnabled/setReputationEnabled 수행하고, 실패 시 로컬 상태 복원 및 오류 표시.
  1. NotificationItem의 문서 레벨 mouse 이벤트 정리 보장 필요 — 드래그 후 리스너 잔류 위험
  • 수정안: 드래그 시작 시 등록, 드래그 종료와 컴포넌트 언마운트 시 항상 제거(useEffect cleanup 또는 finally).
  1. 접근성: Toggle의 키보드 조작 보장 필요 (Enter/Space)
  • 수정안: role="switch"를 유지하되 button 요소 기본 동작을 활용하거나 onKeyDown으로 Enter/Space 핸들링을 명시.

🔍 Possibly Related PRs

👥 Suggested Reviewers

  • kim3360
  • dohy-eon
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 24.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed PR 제목이 알림 페이지 구현이라는 주요 변경 내용을 정확히 반영하고 있으며, 간결하고 명확합니다.
Description check ✅ Passed PR 설명이 템플릿 모든 필수 섹션(ID, 변경 내용, 구현 사항)을 포함하고 있으며, 상세한 구현 내용과 데모 영상, 알려진 미완료 사항까지 명시하고 있습니다.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

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

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/ALT-232

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.

Copy link
Copy Markdown

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

🧹 Nitpick comments (2)
src/app/App.tsx (1)

29-30: ⚡ Quick win

신규 알림 페이지 라우트도 lazy/Suspense로 분리해주세요.

NotificationPage, NotificationSettingsPage가 동기 import라 초기 번들에 포함됩니다. 기존 SignupPage처럼 lazy route로 맞추는 게 일관성과 초기 로딩에 유리합니다.

As per coding guidelines "src/app/**: 라우팅 구조가 lazy loading을 활용하는지 확인" 및 "src/pages/**: React.lazy / Suspense를 통한 코드 스플리팅 적용 여부".

Also applies to: 103-107

🤖 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 `@src/app/App.tsx` around lines 29 - 30, NotificationPage and
NotificationSettingsPage are currently imported synchronously and should be
converted to lazy-loaded routes to avoid including them in the initial bundle;
replace their direct imports with React.lazy wrappers (e.g., const
NotificationPage = React.lazy(() => import('...NotificationPage')) and const
NotificationSettingsPage = React.lazy(() =>
import('...NotificationSettingsPage'))), then ensure the routes that render
NotificationPage and NotificationSettingsPage are wrapped with a Suspense
fallback (same pattern used for SignupPage) so code-splitting is applied
consistently.
src/pages/notification/index.tsx (1)

60-75: 🏗️ Heavy lift

페이지에서 무한스크롤 관찰 로직을 분리해주세요.

IntersectionObserver 생성/해제 로직이 페이지에 들어와 있어 페이지 조합 책임을 넘습니다. useNotificationViewModel 또는 별도 hook으로 옮겨 페이지는 렌더링 조합만 담당하게 유지하는 편이 좋습니다.

As per coding guidelines "src/pages/**: 페이지 컴포넌트가 비즈니스 로직 없이 조합(Composition)만 하는지".

🤖 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 `@src/pages/notification/index.tsx` around lines 60 - 75, Move the
IntersectionObserver creation/teardown out of the page component and into the
notification view model or a new custom hook (e.g. useNotificationViewModel or
useInfiniteScrollObserver) so the page only composes UI; specifically, take the
useEffect block that references sentinelRef, creates new IntersectionObserver,
observes el, and disconnects on cleanup, and implement it inside the view
model/hook so it accepts sentinelRef (or a ref setter) and the control flags
hasNextPage, isFetchingNextPage and action fetchNextPage; ensure the observer
callback uses those flags and that the hook returns any necessary wiring for the
page (e.g. sentinelRef or ref callback) and that cleanup is performed on
unmount.
🤖 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 `@src/features/notification/hooks/useNotifications.ts`:
- Line 19: NotificationPage's cursor is currently typed as string but must allow
null per API behavior; open the NotificationPage type in the notification types
(NotificationPage) and change the cursor property to string | null (matching
other page DTOs like ChatRoomPageDto/ApplicationPageDto/PostingPageDto), then
run a quick typecheck and adjust any callsites that assume a non-null cursor
(e.g., pagination helpers such as getNextPageParam) to handle null/undefined
accordingly.

In `@src/features/notification/hooks/useUpdateNotificationConsent.ts`:
- Around line 8-14: useUpdateNotificationConsent currently chooses updater based
on scope but lets scope=null implicitly fall back to
updateUserNotificationConsent; change the mutation to explicitly handle null by
preventing execution when scope is null: inside useUpdateNotificationConsent set
the useMutation's mutationFn to undefined (or an early-returning function) when
scope === null, or add a guard that throws/returns early so callers cannot call
mutate with scope null; update references to updater, useMutation,
updateManagerNotificationConsent and updateUserNotificationConsent accordingly
and ensure callers either never call mutate when scope is null or check
mutation.isIdle before invoking.

In `@src/features/notification/types/consent.ts`:
- Around line 18-21: Update the UpdateNotificationConsentRequest interface so
the type field is constrained to the CONSENT_TYPE union instead of plain string:
replace type: string with type: CONSENT_TYPE (or the appropriate union/enum
exported as CONSENT_TYPE) and ensure you import or reference CONSENT_TYPE in
this module; update any usages that construct UpdateNotificationConsentRequest
to use a valid CONSENT_TYPE value.

In `@src/features/notification/useNotificationSettingsViewModel.ts`:
- Around line 23-24: The substituteEnabled and reputationEnabled toggles in
useNotificationSettingsViewModel are only local state and reset to true on
refresh; persist them to avoid user confusion by reading initial values from
localStorage and writing updates back whenever setSubstituteEnabled or
setReputationEnabled change (use useEffect to sync), using distinct localStorage
keys (e.g., "notification.substituteEnabled" and
"notification.reputationEnabled") and fall back to true if absent; if you prefer
not to persist because the API is missing, update the UI behavior in the same
hook to expose a "coming soon"/"not saved" flag instead of implying the toggles
are saved.

In `@src/features/notification/useNotificationViewModel.ts`:
- Around line 56-63: The currentItems value is not being filtered by activeTab
so tabs don't change displayed items; update the logic that computes
currentItems (and the derived hasUnreadSubstitute and hasUnreadReputation) to
filter the full notifications list by activeTab (use the item's title or
category to distinguish '대타' vs '평판'), return only the items matching the
activeTab for currentItems, and compute hasUnreadSubstitute/hasUnreadReputation
from the filtered lists (keep using setActiveTab as-is). Ensure you reference
and update the existing symbols currentItems, activeTab, hasUnreadSubstitute,
hasUnreadReputation when adding the filter logic.

In `@src/pages/notification/index.tsx`:
- Around line 130-131: 현재 currentItems.map(...)에서 <li key={item.id ?? idx}>처럼
index를 fallback으로 사용하고 있어 삭제/페이지네이션 시 DOM 재사용 문제가 발생할 수 있습니다; 이 문제를 해결하려면 렌더링할 때
반드시 안정적인 고유 key만 사용하도록 item.id를 필수화하거나 렌더 전에 id가 없는 항목을 필터링하세요 (예: 처리 로직에서
currentItems를 생성하는 곳 또는 컴포넌트 내부에서 map 호출 전에 id가 없는 항목을 제거하거나 데이터 유효성 검사 추가).
currentItems, item.id, 그리고 해당 map 渲染 블록을 찾아 수정하세요.

In `@src/shared/ui/notification/NotificationItem.tsx`:
- Around line 84-133: The onClick can fire after a swipe because touchend is
followed by a click; track a didDrag flag and ignore clicks when a drag
happened. Modify startDrag/moveDrag/endDrag (and their callers
handleTouchStart/handleTouchMove/handleTouchEnd and handleMouseDown's
onMove/onUp) to set didDrag = false at start, set didDrag = true when moveDrag
detects sufficient movement, and reset didDrag to false after endDrag completes;
then in the button onClick handler check didDrag and return early if true
(instead of only checking offset). Use the existing functions startDrag,
moveDrag, endDrag and state setters like setOffset to locate where to add and
clear the didDrag flag.
- Around line 90-102: handleMouseDown currently attaches document 'mousemove'
and 'mouseup' handlers that are only removed in the 'mouseup' path, which leaks
listeners if the component unmounts mid-drag; fix by storing the onMove and onUp
listener references in refs (e.g. moveListenerRef, upListenerRef) when you
create them in handleMouseDown, and add a useEffect cleanup that checks those
refs and calls document.removeEventListener('mousemove',
moveListenerRef.current) and document.removeEventListener('mouseup',
upListenerRef.current) and clears the refs; ensure you still call endDrag() in
cleanup and keep using startDrag, moveDrag and endDrag as before so the drag
state is correctly finalized.

---

Nitpick comments:
In `@src/app/App.tsx`:
- Around line 29-30: NotificationPage and NotificationSettingsPage are currently
imported synchronously and should be converted to lazy-loaded routes to avoid
including them in the initial bundle; replace their direct imports with
React.lazy wrappers (e.g., const NotificationPage = React.lazy(() =>
import('...NotificationPage')) and const NotificationSettingsPage =
React.lazy(() => import('...NotificationSettingsPage'))), then ensure the routes
that render NotificationPage and NotificationSettingsPage are wrapped with a
Suspense fallback (same pattern used for SignupPage) so code-splitting is
applied consistently.

In `@src/pages/notification/index.tsx`:
- Around line 60-75: Move the IntersectionObserver creation/teardown out of the
page component and into the notification view model or a new custom hook (e.g.
useNotificationViewModel or useInfiniteScrollObserver) so the page only composes
UI; specifically, take the useEffect block that references sentinelRef, creates
new IntersectionObserver, observes el, and disconnects on cleanup, and implement
it inside the view model/hook so it accepts sentinelRef (or a ref setter) and
the control flags hasNextPage, isFetchingNextPage and action fetchNextPage;
ensure the observer callback uses those flags and that the hook returns any
necessary wiring for the page (e.g. sentinelRef or ref callback) and that
cleanup is performed on unmount.
🪄 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: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 52985ef4-a7d0-44e7-ae4c-1ede75e2abf3

📥 Commits

Reviewing files that changed from the base of the PR and between 15f63bc and 441436b.

⛔ Files ignored due to path filters (2)
  • src/assets/alter-logo-vector.svg is excluded by !**/*.svg
  • src/assets/icons/settings.svg is excluded by !**/*.svg
📒 Files selected for processing (19)
  • src/app/App.tsx
  • src/features/notification/api/notificationConsent.ts
  • src/features/notification/api/notifications.ts
  • src/features/notification/hooks/useNotificationConsent.ts
  • src/features/notification/hooks/useNotifications.ts
  • src/features/notification/hooks/useUpdateNotificationConsent.ts
  • src/features/notification/types/consent.ts
  • src/features/notification/types/index.ts
  • src/features/notification/useNotificationSettingsViewModel.ts
  • src/features/notification/useNotificationViewModel.ts
  • src/pages/notification/index.tsx
  • src/pages/notification/settings/index.tsx
  • src/shared/constants/routes.ts
  • src/shared/lib/queryKeys.ts
  • src/shared/ui/common/Navbar.tsx
  • src/shared/ui/common/Toggle.tsx
  • src/shared/ui/notification/NotificationItem.tsx
  • storybook/stories/NotificationItem.stories.tsx
  • tailwind.config.js

Comment thread src/features/notification/hooks/useNotifications.ts
Comment thread src/features/notification/hooks/useUpdateNotificationConsent.ts Outdated
Comment thread src/features/notification/types/consent.ts
Comment thread src/features/notification/useNotificationSettingsViewModel.ts
Comment thread src/features/notification/useNotificationViewModel.ts Outdated
Comment thread src/pages/notification/index.tsx
Comment thread src/shared/ui/notification/NotificationItem.tsx
Comment thread src/shared/ui/notification/NotificationItem.tsx
Comment thread src/shared/ui/notification/NotificationItem.tsx
Copy link
Copy Markdown

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

♻️ Duplicate comments (1)
src/features/notification/useNotificationSettingsViewModel.ts (1)

24-25: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

대타/평판 토글 상태가 새로고침 시 유실됩니다.

substituteEnabled, reputationEnableduseState(true)로 고정 초기화되어 사용자 변경값이 유지되지 않습니다. API 미지원 상태라면 localStorage 동기화 또는 “저장되지 않음/준비 중” 상태를 명시해 오해를 막아주세요.

수정 예시
- const [substituteEnabled, setSubstituteEnabled] = useState(true)
- const [reputationEnabled, setReputationEnabled] = useState(true)
+ const [substituteEnabled, setSubstituteEnabled] = useState(
+   () => localStorage.getItem('notification.substituteEnabled') !== 'false'
+ )
+ const [reputationEnabled, setReputationEnabled] = useState(
+   () => localStorage.getItem('notification.reputationEnabled') !== 'false'
+ )
+
+ const handleSubstituteEnabledChange = (checked: boolean) => {
+   setSubstituteEnabled(checked)
+   localStorage.setItem('notification.substituteEnabled', String(checked))
+ }
+
+ const handleReputationEnabledChange = (checked: boolean) => {
+   setReputationEnabled(checked)
+   localStorage.setItem('notification.reputationEnabled', String(checked))
+ }
🤖 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 `@src/features/notification/useNotificationSettingsViewModel.ts` around lines
24 - 25, substituteEnabled and reputationEnabled are hard-coded to true and lose
user changes on refresh; initialize them from localStorage (e.g. keys like
"notification.substituteEnabled" and "notification.reputationEnabled") instead
of useState(true), and add an effect to persist updates via
setSubstituteEnabled/setReputationEnabled to localStorage whenever they change;
if the API is not available, surface an explicit "unsaved/preview" state (e.g. a
boolean flag) so users know changes are local-only instead of silently
reverting.
🤖 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.

Duplicate comments:
In `@src/features/notification/useNotificationSettingsViewModel.ts`:
- Around line 24-25: substituteEnabled and reputationEnabled are hard-coded to
true and lose user changes on refresh; initialize them from localStorage (e.g.
keys like "notification.substituteEnabled" and "notification.reputationEnabled")
instead of useState(true), and add an effect to persist updates via
setSubstituteEnabled/setReputationEnabled to localStorage whenever they change;
if the API is not available, surface an explicit "unsaved/preview" state (e.g. a
boolean flag) so users know changes are local-only instead of silently
reverting.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 22e59437-784c-435f-b24c-6eb2f1d9fba1

📥 Commits

Reviewing files that changed from the base of the PR and between 441436b and b654be8.

📒 Files selected for processing (6)
  • src/features/notification/hooks/useUpdateNotificationConsent.ts
  • src/features/notification/types/consent.ts
  • src/features/notification/types/index.ts
  • src/features/notification/useNotificationSettingsViewModel.ts
  • src/pages/notification/settings/index.tsx
  • src/shared/ui/notification/NotificationItem.tsx

Copy link
Copy Markdown
Member

@dohy-eon dohy-eon left a comment

Choose a reason for hiding this comment

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

탭이랑 필터링 로직 추가 + 코멘트 읽어보시구 처리해주심 감사드리겠습니다.

function mapDto(dto: NotificationDto): Omit<NotificationItemProps, 'onDelete'> {
return {
id: dto.id,
isRead: false,
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

해당부분 읽음처리가 false 고정인데 백엔드 dto에 혹시 isRead나 readAt dto가 없는걸까요?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

넵 없습니다..

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

알림에도 미읽음 표시(mainColor or error색상)가 들어가야 할 것 같은데.. 처리 가능하실까요 ?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

동그랗게 뱃지 추가해달라는 말씀이시죠? 근데 그럼 알림 조회 로직을 어떤식으로 구성해야 할까요..

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.

2 participants