Skip to content

Conversation

@yeonjin719
Copy link
Member

@yeonjin719 yeonjin719 commented Aug 5, 2025

🚨 관련 이슈

#87

✨ 변경사항

  • 🐞 BugFix Something isn't working
  • 💻 CrossBrowsing Browser compatibility
  • 🌏 Deploy Deploy
  • 🎨 Design Markup & styling
  • 📃 Docs Documentation writing and editing (README.md, etc.)
  • ✨ Feature Feature
  • 🔨 Refactor Code refactoring
  • ⚙️ Setting Development environment setup
  • ✅ Test Test related (storybook, jest, etc.)

✏️ 작업 내용

image
스크린샷 2025-08-05 오후 5 26 20
스크린샷 2025-08-05 오후 5 26 08

  • FCM 알람 연동 완료했습니다.
  • firebase, react-intersection-observer, react-spinners 라이브러리가 추가되었습니다.
  • env 변경되었습니다. 노션에 기재해뒀으니 반영해주세요.

😅 미완성 작업

  • 현재 알람이 누르면 어디로 이동해야할 것처럼 생겼는데... 이동을 어디로 시켜야할 지 몰라서 아직 그 부분은 개발안했습니다!

📢 논의 사항 및 참고 사항

-

@yeonjin719 yeonjin719 self-assigned this Aug 5, 2025
@yeonjin719 yeonjin719 linked an issue Aug 5, 2025 that may be closed by this pull request
3 tasks
@coderabbitai
Copy link

coderabbitai bot commented Aug 5, 2025

Summary by CodeRabbit

  • 신규 기능

    • 알림(Alarm) 모달 및 무한 스크롤 알림 목록 기능이 추가되었습니다.
    • 파이어베이스 푸시 알림(Firebase Cloud Messaging) 서비스가 연동되어, 기기 토큰 등록 및 서비스 워커가 도입되었습니다.
    • 알림 아이콘 클릭 시 알림 모달이 열리도록 개선되었습니다.
  • 버그 수정

    • 일부 파일이 린트 검사에서 제외되어 개발 환경이 개선되었습니다.
  • 리팩터

    • 헤더 및 모바일 메뉴에서 모달 제어 방식이 통합되어 코드 일관성이 향상되었습니다.
  • 문서화 및 타입

    • 알림 관련 타입 정의가 추가되어 코드의 안정성이 높아졌습니다.
  • 환경설정

    • 파이어베이스, 무한 스크롤, 스피너 관련 라이브러리가 새로 도입되었습니다.

Walkthrough

Firebase Cloud Messaging과 알림 기능이 새롭게 도입되었습니다. 서비스워커, FCM 연동, 알림 API, 타입, 커스텀 훅, 모달 컴포넌트 등이 추가되었고, 기존 Header 및 MobileMenu에서 알림 모달을 띄우도록 변경되었습니다. 관련 패키지와 ESLint, tsconfig, queryKey 설정도 함께 수정되었습니다.

Changes

Cohort / File(s) Change Summary
Firebase 서비스 연동 및 서비스워커
public/firebase-messaging-sw.js, src/firebase/firebase.ts, tsconfig.app.json
FCM용 서비스워커 추가, Firebase 앱/메시징 초기화 및 토큰 발급/서비스워커 등록 함수 추가, 서비스워커 파일 TypeScript 포함 설정
알림 API 및 타입 정의
src/api/alarm/alarm.ts, src/types/alarm/alarm.ts
알림 목록/디바이스 토큰 API 함수 및 관련 타입 정의
알림 관련 커스텀 훅
src/hooks/alarm/useDeviceToken.ts, src/hooks/alarm/useGetAlarm.ts
디바이스 토큰 등록 및 알림 무한스크롤 조회용 커스텀 훅 추가
알림 모달 및 컴포넌트
src/components/alarmModal/alarm.tsx, src/components/modal/alarmModal.tsx
알림 항목 컴포넌트와 무한스크롤 알림 모달 컴포넌트 추가
모달 관리 및 헤더/모바일 메뉴 연동
src/components/common/modalProvider.tsx, src/components/layout/Header.tsx, src/components/layout/MobileMenu.tsx
알림 모달 타입/컴포넌트 등록, Header/MobileMenu에서 알림 모달 오픈으로 동작 변경
공통 컴포넌트 타입 개선
src/components/common/graySvgButton.tsx
버튼 children 타입을 ReactElementReact.ReactNode로 확장
쿼리키 추가
src/queryKey/queryKey.ts
알림용 쿼리키 팩토리 추가
홈페이지 FCM 연동
src/pages/home/HomePage.tsx
홈 진입 시 디바이스 토큰 등록 훅 실행 추가
패키지 및 ESLint 설정
package.json, eslint.config.mjs
FCM/알림 관련 패키지 3종 추가, 서비스워커 ESLint ignore, 패키지 의존성 업데이트

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant Browser
    participant ServiceWorker
    participant Firebase
    participant Server

    User->>Browser: 첫 클릭 발생
    Browser->>Firebase: 서비스워커 등록, FCM 토큰 발급
    Firebase-->>Browser: FCM 토큰 반환
    Browser->>Server: 디바이스 토큰 전송
    Server-->>Browser: 등록 결과 응답

    Firebase->>ServiceWorker: Push 메시지 전달
    ServiceWorker->>Browser: 알림 표시
    User->>Browser: 알림 클릭
    Browser->>ServiceWorker: notificationclick 이벤트
    ServiceWorker->>Browser: 지정 URL 새 창 오픈
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20분


📜 Recent review details

Configuration used: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between d9c050b and aa782d9.

⛔ Files ignored due to path filters (1)
  • yarn.lock is excluded by !**/yarn.lock, !**/*.lock, !**/*.lock
📒 Files selected for processing (1)
  • src/components/layout/MobileMenu.tsx (2 hunks)
🧰 Additional context used
🪛 Biome (2.1.2)
src/components/layout/MobileMenu.tsx

[error] 55-59: Provide an explicit type prop for the button element.

The default type of a button is submit, which causes the submission of a form when placed inside a form element. This is likely not the behaviour that you want inside a React application.
Allowed button types are: submit, button or reset

(lint/a11y/useButtonType)

🔇 Additional comments (1)
src/components/layout/MobileMenu.tsx (1)

3-3: 새로운 모달 기반 알림 시스템 도입이 적절합니다.

모달 기반의 알림 시스템으로 변경한 것은 사용자 경험 개선에 도움이 됩니다. MODAL_TYPESuseModalStore 훅을 통한 중앙화된 모달 관리 방식도 좋은 아키텍처 선택입니다.

Also applies to: 8-8, 16-16

✨ Finishing Touches
  • 📝 Generate Docstrings

🪧 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.
    • Explain this complex logic.
    • 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 explain this code block.
  • 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 explain its main purpose.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

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.
  • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this PR.
  • @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.

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

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

📜 Review details

Configuration used: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 1fb6622 and b8e138a.

⛔ Files ignored due to path filters (1)
  • yarn.lock is excluded by !**/yarn.lock, !**/*.lock, !**/*.lock
📒 Files selected for processing (17)
  • eslint.config.mjs (1 hunks)
  • package.json (2 hunks)
  • public/firebase-messaging-sw.js (1 hunks)
  • src/api/alarm/alarm.ts (1 hunks)
  • src/components/alarmModal/alarm.tsx (1 hunks)
  • src/components/common/graySvgButton.tsx (1 hunks)
  • src/components/common/modalProvider.tsx (2 hunks)
  • src/components/layout/Header.tsx (3 hunks)
  • src/components/layout/MobileMenu.tsx (2 hunks)
  • src/components/modal/alarmModal.tsx (1 hunks)
  • src/firebase/firebase.ts (1 hunks)
  • src/hooks/alarm/useDeviceToken.ts (1 hunks)
  • src/hooks/alarm/useGetAlarm.ts (1 hunks)
  • src/pages/home/HomePage.tsx (2 hunks)
  • src/queryKey/queryKey.ts (1 hunks)
  • src/types/alarm/alarm.ts (1 hunks)
  • tsconfig.app.json (1 hunks)
🧰 Additional context used
🧬 Code Graph Analysis (6)
src/components/alarmModal/alarm.tsx (1)
src/types/alarm/alarm.ts (1)
  • TAlarm (17-22)
src/components/layout/Header.tsx (2)
src/components/common/modalProvider.tsx (1)
  • MODAL_TYPES (13-18)
src/components/layout/MobileMenu.tsx (1)
  • MobileMenu (15-75)
src/types/alarm/alarm.ts (1)
src/types/common/common.ts (1)
  • TCommonResponse (4-9)
src/api/alarm/alarm.ts (2)
src/types/alarm/alarm.ts (4)
  • TRequestGetAlarm (3-6)
  • TResponseGetAlarm (7-12)
  • TRequestPostDeviceToken (13-15)
  • TResponsePOstDeviceToken (16-16)
src/api/axiosInstance.ts (1)
  • axiosInstance (11-14)
src/firebase/firebase.ts (1)
public/firebase-messaging-sw.js (1)
  • messaging (17-17)
src/components/modal/alarmModal.tsx (2)
src/hooks/alarm/useGetAlarm.ts (1)
  • useGetAlarm (8-15)
src/components/common/modal.tsx (1)
  • Modal (15-43)
🪛 Gitleaks (8.27.2)
public/firebase-messaging-sw.js

8-8: Uncovered a GCP API key, which could lead to unauthorized access to Google Cloud services and data breaches.

(gcp-api-key)

🪛 Biome (2.1.2)
src/components/layout/MobileMenu.tsx

[error] 55-59: Provide an explicit type prop for the button element.

The default type of a button is submit, which causes the submission of a form when placed inside a form element. This is likely not the behaviour that you want inside a React application.
Allowed button types are: submit, button or reset

(lint/a11y/useButtonType)

src/components/layout/Header.tsx

[error] 61-61: Provide an explicit type prop for the button element.

The default type of a button is submit, which causes the submission of a form when placed inside a form element. This is likely not the behaviour that you want inside a React application.
Allowed button types are: submit, button or reset

(lint/a11y/useButtonType)

🔇 Additional comments (19)
package.json (1)

25-25: 새 의존성 버전은 최신 안정 버전으로 확인되었습니다

  • firebase v12.0.0
  • react-intersection-observer v9.16.0
  • react-spinners v0.17.0

모두 npm 레지스트리에서 최신 버전임을 확인했으나, 취약점 검사를 위해서는 lockfile(package-lock.json 또는 yarn.lock)이 필요합니다.
lockfile을 생성한 뒤 아래 명령어로 취약점 검사를 진행해 주세요:

# package-lock.json만 생성
npm i --package-lock-only

# 취약점 검사
npm audit
# 또는 yarn 사용 시
yarn audit

검토 위치:

  • package.json: 25번 줄(firebase), 34번 줄(react-intersection-observer), 36번 줄(react-spinners)
eslint.config.mjs (1)

13-13: 서비스 워커 ESLint 제외 설정이 적절합니다.

Firebase 메시징 서비스 워커를 ESLint 검사에서 제외하는 것은 합리적입니다. 서비스 워커는 일반적인 애플리케이션 코드와 다른 패턴을 사용하기 때문입니다.

tsconfig.app.json (1)

29-29: 서비스 워커 TypeScript 컴파일 설정이 올바릅니다.

Firebase 메시징 서비스 워커를 TypeScript 컴파일 대상에 포함시킨 것은 타입 검사와 일관성을 위해 필요한 변경사항입니다.

src/pages/home/HomePage.tsx (1)

1-1: useDeviceToken 훅 동작 확인 완료 — 변경 사항 승인합니다.

useEffect 내부에 빈 배열을 두어 마운트 시 한 번만 실행되고, 클릭 이벤트를 통해 FCM 서비스 워커 등록↔토큰 생성·전송 로직이 정상적으로 동작합니다. TRequestPostDeviceToken 타입도 올바르게 정의되어 있어 추가적인 수정이 필요 없습니다.

src/components/common/graySvgButton.tsx (1)

1-1: 타입 안전성 개선이 잘 되었습니다.

React.ReactNode로 변경하여 더 유연한 자식 요소를 지원할 수 있게 되었고, 전체 React 네임스페이스 import로 일관성이 향상되었습니다.

Also applies to: 7-7

src/components/common/modalProvider.tsx (1)

4-4: 모달 시스템 통합이 올바르게 구현되었습니다.

기존 모달 패턴을 잘 따라 AlarmModal을 중앙 집중식 모달 관리 시스템에 정확히 통합했습니다.

Also applies to: 17-17, 24-24

src/components/alarmModal/alarm.tsx (1)

8-9: 반응형 디자인과 텍스트 처리가 잘 구현되었습니다.

모바일과 데스크톱에 대한 적절한 너비 설정과 텍스트 오버플로우 처리가 잘 되어 있습니다.

src/hooks/alarm/useDeviceToken.ts (2)

10-14: FCM 브라우저 지원 확인이 잘 구현되었습니다.

Firebase 메시징 지원 여부를 확인하여 안전하게 처리하고 있습니다.


28-37: 이벤트 리스너 관리와 클린업이 올바르게 구현되었습니다.

첫 번째 클릭 시에만 FCM 설정을 실행하고 이벤트 리스너를 정리하는 패턴이 적절합니다.

src/firebase/firebase.ts (1)

25-33: 서비스 워커 등록이 적절하게 구현되었습니다.

브라우저 지원 확인과 에러 처리가 잘 되어 있습니다. 서비스 워커 경로가 public 폴더의 파일과 일치하는 것도 확인되었습니다.

src/components/modal/alarmModal.tsx (1)

20-26: 무한 스크롤 로직이 잘 구현되었습니다!

useInView와 useEffect를 사용한 무한 스크롤 구현이 적절하며, 불필요한 API 호출을 방지하는 조건 검사도 잘 되어 있습니다.

src/hooks/alarm/useGetAlarm.ts (1)

8-15: 무한 쿼리 구현이 훌륭합니다!

useInfiniteQuery를 사용한 페이지네이션 로직이 적절하게 구현되어 있고, 타입 안전성도 잘 보장되어 있습니다. getNextPageParam에서 커서를 올바르게 추출하는 로직도 정확합니다.

src/api/alarm/alarm.ts (1)

15-18: 디바이스 토큰 API 구현이 적절합니다!

POST 요청 구조와 타입 정의가 명확하고 간결합니다.

src/components/layout/Header.tsx (3)

5-5: 모달 관리를 위한 import가 적절히 추가되었습니다.

중앙집중식 모달 관리로의 리팩토링을 위해 필요한 import들이 올바르게 추가되었습니다.

Also applies to: 12-12


20-20: 중앙집중식 모달 관리로의 전환이 적절합니다.

로컬 상태에서 useModalStore를 사용한 중앙집중식 관리로 변경하여 일관성과 유지보수성이 향상되었습니다.


87-87: 모바일 메뉴에서도 일관된 모달 관리 방식을 사용합니다.

데스크톱과 모바일에서 동일한 모달 시스템을 사용하여 일관성이 확보되었습니다.

src/types/alarm/alarm.ts (3)

1-1: 공통 타입 import가 적절합니다.

type-only import를 사용하여 TypeScript 모범 사례를 따르고 있습니다.


3-12: 페이지네이션을 지원하는 알림 조회 타입이 잘 정의되었습니다.

요청 타입의 선택적 매개변수와 응답 타입의 페이지네이션 구조가 무한 스크롤 기능을 적절히 지원합니다.


17-22: 알림 엔티티 타입이 적절히 정의되었습니다.

알림 시스템에 필요한 필드들이 올바른 타입으로 잘 정의되어 있습니다.

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

♻️ Duplicate comments (4)
src/components/alarmModal/alarm.tsx (1)

5-5: props 사용 패턴을 재검토해 주세요.

TAlarm 객체 전체를 받지만 title만 사용하고 있습니다. 다른 필드들(id, isRead 등)도 활용할 계획이 있다면 현재 구조를 유지하고, 그렇지 않다면 필요한 props만 받는 것을 고려해 보세요.

src/firebase/firebase.ts (1)

5-13: 환경 변수 유효성 검증을 추가해 주세요.

Firebase 설정에 필요한 환경 변수들이 누락될 경우 런타임 오류가 발생할 수 있습니다. 애플리케이션 시작 시 필수 환경 변수들을 미리 검증하는 로직을 추가해 주세요.

+// 필수 환경 변수 검증
+const requiredEnvVars = [
+    'VITE_FIREBASE_API_KEY',
+    'VITE_FIREBASE_AUTH_DOMAIN',
+    'VITE_PROJECT_ID',
+    'VITE_STORAGE_BUCKET',
+    'VITE_MESSAGE_SENDER_ID',
+    'VITE_APP_ID',
+    'VITE_MEASUREMENT_ID',
+    'VITE_FIREBASE_VAPID_KEY',
+];
+
+requiredEnvVars.forEach((key) => {
+    if (!import.meta.env[key]) {
+        throw new Error(`환경 변수 ${key}가 설정되지 않았습니다.`);
+    }
+});
+
 const firebaseConfig = {
public/firebase-messaging-sw.js (1)

7-15: Firebase 클라이언트 API 키 노출에 대한 설명을 추가해 주세요.

정적 분석 도구가 보안 이슈로 플래그했지만, Firebase 클라이언트 API 키는 공개적으로 노출되도록 설계되었습니다. 하지만 코드 리뷰어들을 위해 주석으로 이를 명시해 주세요.

+// Firebase 클라이언트 설정 - 이 키들은 공개용이며 클라이언트에서 안전하게 사용할 수 있습니다
 firebase.initializeApp({
     apiKey: 'AIzaSyAjZqK2lhCOeX_P2Sf-_2IGEFlORchcO5w',
src/components/modal/alarmModal.tsx (1)

17-17: 페이지 크기를 props로 받는 것을 고려해 주세요.

현재 하드코딩된 size: 5를 props로 받아 재사용성을 높일 수 있습니다.

📜 Review details

Configuration used: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between b8e138a and 0fa5d08.

📒 Files selected for processing (9)
  • public/firebase-messaging-sw.js (1 hunks)
  • src/api/alarm/alarm.ts (1 hunks)
  • src/components/alarmModal/alarm.tsx (1 hunks)
  • src/components/layout/Header.tsx (3 hunks)
  • src/components/modal/alarmModal.tsx (1 hunks)
  • src/firebase/firebase.ts (1 hunks)
  • src/hooks/alarm/useGetAlarm.ts (1 hunks)
  • src/queryKey/queryKey.ts (1 hunks)
  • src/types/alarm/alarm.ts (1 hunks)
🧰 Additional context used
🧬 Code Graph Analysis (7)
src/firebase/firebase.ts (1)
public/firebase-messaging-sw.js (1)
  • messaging (17-17)
src/components/alarmModal/alarm.tsx (1)
src/types/alarm/alarm.ts (1)
  • TAlarm (17-22)
src/hooks/alarm/useGetAlarm.ts (3)
src/types/alarm/alarm.ts (1)
  • TRequestGetAlarm (3-6)
src/queryKey/queryKey.ts (1)
  • alarmKeys (7-9)
src/api/alarm/alarm.ts (1)
  • getAlarm (5-13)
src/types/alarm/alarm.ts (1)
src/types/common/common.ts (1)
  • TCommonResponse (4-9)
src/components/layout/Header.tsx (2)
src/components/common/modalProvider.tsx (1)
  • MODAL_TYPES (13-18)
src/components/layout/MobileMenu.tsx (1)
  • MobileMenu (15-75)
src/api/alarm/alarm.ts (2)
src/types/alarm/alarm.ts (4)
  • TRequestGetAlarm (3-6)
  • TResponseGetAlarm (7-12)
  • TRequestPostDeviceToken (13-15)
  • TResponsePostDeviceToken (16-16)
src/api/axiosInstance.ts (1)
  • axiosInstance (11-14)
src/components/modal/alarmModal.tsx (3)
src/hooks/alarm/useGetAlarm.ts (1)
  • useGetAlarm (8-15)
src/pages/common/Error.tsx (1)
  • Error (1-3)
src/components/common/modal.tsx (1)
  • Modal (15-43)
🪛 Gitleaks (8.27.2)
public/firebase-messaging-sw.js

8-8: Uncovered a GCP API key, which could lead to unauthorized access to Google Cloud services and data breaches.

(gcp-api-key)

🪛 Biome (2.1.2)
src/components/modal/alarmModal.tsx

[error] 10-10: Do not shadow the global "Error" property.

Consider renaming this variable. It's easy to confuse the origin of variables when they're named after a known global.

(lint/suspicious/noShadowRestrictedNames)

🔇 Additional comments (9)
src/queryKey/queryKey.ts (1)

7-9: cursor 타입 스펙 일치 확인

TRequestGetAlarmgetAlarm 구현 모두 cursor?: number로 정의되어 있어, API 스펙과 일치함을 확인했습니다. 추가 수정은 필요 없습니다.

src/firebase/firebase.ts (1)

18-31: 토큰 생성 함수의 에러 처리가 개선되었습니다.

적절한 try-catch 블록과 로깅이 추가되어 디버깅과 사용자 경험이 향상되었습니다.

public/firebase-messaging-sw.js (1)

36-42: 알림 클릭 에러 처리가 적절히 구현되었습니다.

clients.openWindow에 대한 에러 처리가 추가되어 잘못된 URL이나 네트워크 오류 시에도 안정적으로 동작할 것입니다.

src/components/layout/Header.tsx (2)

60-66: 모달 통합과 버튼 타입 명시가 적절히 구현되었습니다.

중앙화된 모달 관리 시스템 사용과 type="button" 속성 추가로 코드 품질이 향상되었습니다. 로컬 상태 관리를 제거하고 useModalStore를 활용한 것도 좋은 개선입니다.


87-87: MobileMenu props 전달이 일관성 있게 구현되었습니다.

onOpenSettings 콜백을 통해 모달 관리가 일관되게 처리되고 있어 좋습니다. 모바일과 데스크톱 환경에서 동일한 모달 시스템을 사용하는 것이 사용자 경험 통일성에 도움이 됩니다.

src/api/alarm/alarm.ts (1)

5-18: API 함수 구현이 잘 되어 있습니다.

타입 안전성과 구조가 깔끔하게 구현되어 있고, 단축 속성 문법도 적절히 사용되고 있습니다. 에러 처리는 상위 레벨에서 처리되는 것으로 보입니다.

src/components/modal/alarmModal.tsx (2)

30-32: 에러 처리가 잘 구현되어 있습니다.

이전 리뷰에서 언급된 에러 상태 처리가 적절히 추가되었습니다.


37-39: 빈 상태 처리가 잘 구현되어 있습니다.

알림이 없는 경우에 대한 사용자 친화적인 메시지가 적절히 구현되어 있습니다.

src/types/alarm/alarm.ts (1)

3-22: 타입 정의가 잘 구현되어 있습니다.

알림 관련 모든 타입이 일관된 네이밍 컨벤션을 따르고 있으며, 이전 리뷰에서 언급된 오타도 수정되었습니다. nullable 타입과 선택적 속성들이 적절히 사용되어 있습니다.

@yeonjin719 yeonjin719 merged commit 6fdc4c2 into develop Aug 5, 2025
3 checks passed
@yeonjin719 yeonjin719 deleted the feature/#87 branch August 5, 2025 16:26
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.

✨ [Feature] 알람 모달 생성 및 API 연결

2 participants