Skip to content

26.03.23 최신화 - #238

Merged
shinwokkang merged 10 commits into
mainfrom
dev
Mar 23, 2026
Merged

shinwokkang merged 10 commits into
mainfrom
dev

Conversation

@shinwokkang

@shinwokkang shinwokkang commented Mar 23, 2026 •

Copy link
Copy Markdown
Contributor

📌 개요 (Summary)

  • 변경 사항에 대한 간략한 요약을 적어주세요.
  • 관련 이슈가 있다면 링크를 걸어주세요 (예: [fix] cicd / build 문제 #123).

🛠️ 변경 사항 (Changes)

  • 새로운 기능 추가
  • 버그 수정
  • 코드 리팩토링
  • 문서 업데이트
  • 기타 (설명: )

📸 스크린샷 (Screenshots)

(UI 변경 사항이 있다면 첨부해주세요)

✅ 체크리스트 (Checklist)

  • 빌드가 성공적으로 수행되었나요? (pnpm build)
  • 린트 에러가 없나요? (pnpm lint)
  • 불필요한 콘솔 로그나 주석을 제거했나요?

Summary by CodeRabbit

  • New Features

    • Site icons added (favicon and Apple touch icon).
    • Notifications now navigate directly to relevant content and mark items as read when opened.
    • Meeting cards are now clickable to open their group pages; menu actions no longer trigger accidental navigation.
    • Contact CTA updated to "소식 문의하기" and opens the news form in a new tab.
  • Chores

    • Added new external news form link used by the updated CTAs.

@shinwokkang shinwokkang self-assigned this Mar 23, 2026
@shinwokkang shinwokkang added ✨ feat 새로운 기능 추가 ♻️ refactor 리팩토링 labels Mar 23, 2026
@vercel

vercel Bot commented Mar 23, 2026 •

Copy link
Copy Markdown

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

Project Deployment Actions Updated (UTC)
check-mo Ready Ready Preview, Comment Mar 30, 2026 4:37am
checkmo Ready Ready Preview, Comment Mar 30, 2026 4:37am

@coderabbitai

coderabbitai Bot commented Mar 23, 2026 •

Copy link
Copy Markdown
📝 Walkthrough

Walkthrough

Added site icon metadata and routing for notifications: new utility maps notification types to destination URLs; notification UI now marks as read then navigates via Next.js router. Also added a new external NEWS_FROM_URL and updated two CTA handlers.

Changes

Cohort / File(s) Summary
Metadata Configuration
src/app/layout.tsx
Added metadata.icons with icon: "/icon.svg" and apple: "/apple-icon".
Notification Utility
src/utils/notification.ts
Added getNotificationRedirectUrl(notification: NotificationBasicInfo) mapping notification types to destination paths (stories, profile, groups, fallback to notifications tab).
Notification UI — Item
src/components/base-ui/MyPage/items/MyNotificationItem.tsx
On click, compute redirect via getNotificationRedirectUrl(notification) and navigate with router.push(redirectUrl); retains read-mutation behavior.
Notification UI — Dropdown
src/components/layout/NotificationDropdown.tsx
Click handler now accepts NotificationBasicInfo, marks notification read when needed, then navigates to computed redirect URL instead of fixed notifications tab.
Meeting Card Interactions
src/components/base-ui/MyPage/items/MyMeetingCard.tsx
Made card clickable with client-side navigation to /groups/${club.clubId}; added stopPropagation on menu/leave handlers to prevent accidental navigation; added cursor/hover styles.
External Links & CTAs
src/constants/links.ts, src/app/(main)/news/page.tsx, src/components/base-ui/MyPage/ProfileSection/UserProfile.tsx
Added EXTERNAL_LINKS.NEWS_FROM_URL and updated two CTA handlers to open NEWS_FROM_URL (adjusted icon alt text in NewsPage).

Sequence Diagram

sequenceDiagram
    actor User
    participant Component as Notification Component
    participant Utility as getNotificationRedirectUrl
    participant Router as Next.js Router
    participant Target as Target Page

    User->>Component: Click notification
    Component->>Utility: getNotificationRedirectUrl(notification)
    Utility->>Utility: Resolve URL by notificationType
    Utility-->>Component: Return destination URL
    Component->>Component: Mark notification as read (if unread)
    Component->>Router: router.push(redirectUrl)
    Router->>Target: Navigate to destination
    Target-->>User: Display destination
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~22 minutes

Possibly related PRs

  • 03/17 최신화 #205 — Modifies notification utilities and UI; likely overlaps with added redirect logic and notification component changes.

Suggested reviewers

  • hongik-luke

Poem

🐰 I hop with joy on click and cheer,
Paths unfold to places near—
Stories, clubs, or profiles bright,
A nibble, a hop, and then take flight,
Routes set right — now off I steer! 🥕

🚥 Pre-merge checks | ✅ 1 | ❌ 2

❌ Failed checks (1 warning, 1 inconclusive)

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.
Title check ❓ Inconclusive The title '26.03.23 최신화' is vague and generic, using non-descriptive terms that do not convey meaningful information about the changeset despite the PR containing multiple substantial feature additions and refactoring changes. Replace the generic date-based title with a descriptive summary of the main changes, such as 'Add notification redirect logic and update favicon/icons' or break into more specific commit messages.
✅ Passed checks (1 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

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

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch dev

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.

@gemini-code-assist

Copy link
Copy Markdown
Contributor

Summary of Changes

Hello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

이 PR은 애플리케이션에 새로운 아이콘을 추가하고, 사용자 알림 기능의 유용성을 개선합니다. 이제 사용자가 알림을 클릭하면 해당 알림의 유형에 따라 적절한 페이지로 자동 이동하여, 정보 접근성을 높이고 사용자 경험을 향상시킵니다.

Highlights

  • 새로운 애플리케이션 아이콘 추가: 애플리케이션에 새로운 SVG 아이콘이 추가되었으며, layout.tsx 파일을 통해 메타데이터에 적용되었습니다.
  • 알림 클릭 시 동적 리디렉션 기능 구현: 사용자가 알림을 클릭했을 때, 알림 유형에 따라 적절한 페이지로 자동 이동하는 기능이 MyNotificationItem 및 NotificationDropdown 컴포넌트에 추가되었습니다.
  • 알림 리디렉션 유틸리티 함수 추가: 다양한 알림 유형에 대한 리디렉션 URL을 결정하는 getNotificationRedirectUrl 유틸리티 함수가 src/utils/notification.ts 파일에 새로 추가되었습니다.

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for GitHub and other Google products, sign up here.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution. ↩

@gemini-code-assist gemini-code-assist Bot left a comment

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.

Code Review

안녕하세요. 알림 클릭 시 관련 페이지로 리디렉션하는 기능 추가와 아이콘 설정 업데이트를 확인했습니다. 전반적으로 좋은 개선입니다.

리뷰 중 몇 가지 개선점을 발견했습니다:

  • MyNotificationItem과 NotificationDropdown 컴포넌트에서 알림 클릭 처리 로직이 중복됩니다. 유지보수성을 위해 이를 커스텀 훅으로 추출하는 것을 제안합니다.
  • layout.tsx에 추가된 Apple 아이콘 경로에 파일 확장자가 누락된 것으로 보입니다. 이로 인해 아이콘이 제대로 표시되지 않을 수 있습니다.

자세한 내용은 각 파일에 남긴 코멘트를 참고해주세요.

Comment thread src/app/layout.tsx Resolved

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🧹 Nitpick comments (3)
src/app/layout.tsx (1)

36-39: Remove duplicated metadata icons (or make Apple icon path explicit if keeping config).

src/app/icon.svg and src/app/apple-icon.png are auto-discovered special files in Next.js App Router and automatically added as metadata icons. Keeping both file-based metadata and explicit icons config is redundant and can drift over time. Additionally, apple: "/apple-icon" should include the .png extension ("/apple-icon.png") to match the standard format.

♻️ Suggested simplification

Remove the icons block entirely:

 export const metadata: Metadata = {
-  icons: {
-    icon: "/icon.svg",
-    apple: "/apple-icon",
-  },
 };

Or, if explicit config is preferred, fix the apple path:

   icons: {
     icon: "/icon.svg",
-    apple: "/apple-icon",
+    apple: "/apple-icon.png",
   },
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/app/layout.tsx` around lines 36 - 39, The icons metadata block defining
icons: { icon: "/icon.svg", apple: "/apple-icon" } is redundant with Next.js
auto-discovered app router files and the apple path is missing its extension;
either remove the entire icons block from layout.tsx to rely on auto-discovery,
or if you prefer explicit metadata keep the icons object but change apple to
"/apple-icon.png" and ensure the icon path matches the actual asset (icon:
"/icon.svg"); update the icons object in layout.tsx accordingly.
src/components/layout/NotificationDropdown.tsx (1)

16-22: Consider extracting shared notification click behavior.

This read-then-redirect logic is duplicated with src/components/base-ui/MyPage/items/MyNotificationItem.tsx (Line 20-26). A shared helper/hook would reduce drift risk if redirect/read rules change again.

Also applies to: 37-37

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/layout/NotificationDropdown.tsx` around lines 16 - 22, Extract
the duplicated "read then redirect" behavior into a single helper/hook (e.g.,
useNotificationClick or handleNotificationClickHelper) and replace the inline
logic in NotificationDropdown's handleNotificationClick and MyNotificationItem's
click handler with a call to that shared function; the helper should accept a
NotificationBasicInfo (or notificationId and notification object), call
readNotification(notification.notificationId) only when notification.read is
false, compute the redirect URL via getNotificationRedirectUrl(notification),
and then call router.push(redirectUrl) (or return the URL for callers to
navigate) so both components reuse the same behavior and avoid drift.
src/utils/notification.ts (1)

23-37: Prefer exhaustive switch handling to catch new notification types at compile time.

Current default fallback works, but it can silently mask missing redirects when notificationType grows. Add an exhaustive never check so new types fail fast during development.

♻️ Suggested refactor
 export const getNotificationRedirectUrl = (notification: NotificationBasicInfo): string => {
     switch (notification.notificationType) {
         case "LIKE":
         case "COMMENT":
             return `/stories/${notification.domainId}`;
         case "FOLLOW":
             return `/profile/${encodeURIComponent(notification.displayName)}`;
         case "JOIN_CLUB":
         case "CLUB_MEETING_CREATED":
         case "CLUB_NOTICE_CREATED":
             return `/groups/${notification.domainId}`;
-        default:
-            return "/profile/mypage?tab=notifications";
     }
+
+    const _exhaustiveCheck: never = notification.notificationType;
+    return "/profile/mypage?tab=notifications";
 };
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/utils/notification.ts` around lines 23 - 37, The switch in
getNotificationRedirectUrl currently uses a default fallback that can hide
missing cases; replace the default branch with an exhaustive check so the
compiler errors when NotificationBasicInfo.notificationType gains a new literal.
Update getNotificationRedirectUrl to handle all known notificationType cases
explicitly and, instead of returning a generic default, add an exhaustive-check
(e.g., call an assertUnreachable or assign the remaining value to a variable
typed as never) that throws an error including the unknown notification type;
this ensures new notification types fail at compile time and during development
rather than being silently routed to the generic notifications page.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@src/app/layout.tsx`:
- Around line 36-39: The icons metadata block defining icons: { icon:
"/icon.svg", apple: "/apple-icon" } is redundant with Next.js auto-discovered
app router files and the apple path is missing its extension; either remove the
entire icons block from layout.tsx to rely on auto-discovery, or if you prefer
explicit metadata keep the icons object but change apple to "/apple-icon.png"
and ensure the icon path matches the actual asset (icon: "/icon.svg"); update
the icons object in layout.tsx accordingly.

In `@src/components/layout/NotificationDropdown.tsx`:
- Around line 16-22: Extract the duplicated "read then redirect" behavior into a
single helper/hook (e.g., useNotificationClick or handleNotificationClickHelper)
and replace the inline logic in NotificationDropdown's handleNotificationClick
and MyNotificationItem's click handler with a call to that shared function; the
helper should accept a NotificationBasicInfo (or notificationId and notification
object), call readNotification(notification.notificationId) only when
notification.read is false, compute the redirect URL via
getNotificationRedirectUrl(notification), and then call router.push(redirectUrl)
(or return the URL for callers to navigate) so both components reuse the same
behavior and avoid drift.

In `@src/utils/notification.ts`:
- Around line 23-37: The switch in getNotificationRedirectUrl currently uses a
default fallback that can hide missing cases; replace the default branch with an
exhaustive check so the compiler errors when
NotificationBasicInfo.notificationType gains a new literal. Update
getNotificationRedirectUrl to handle all known notificationType cases explicitly
and, instead of returning a generic default, add an exhaustive-check (e.g., call
an assertUnreachable or assign the remaining value to a variable typed as never)
that throws an error including the unknown notification type; this ensures new
notification types fail at compile time and during development rather than being
silently routed to the generic notifications page.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 5652750b-814b-472c-b3aa-c208b2db32c7

📥 Commits

Reviewing files that changed from the base of the PR and between f1ddbd7 and 37101d6.

⛔ Files ignored due to path filters (3)
  • src/app/apple-icon.png is excluded by !**/*.png
  • src/app/favicon.ico is excluded by !**/*.ico
  • src/app/icon.svg is excluded by !**/*.svg
📒 Files selected for processing (4)
  • src/app/layout.tsx
  • src/components/base-ui/MyPage/items/MyNotificationItem.tsx
  • src/components/layout/NotificationDropdown.tsx
  • src/utils/notification.ts

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 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/app/`(main)/news/page.tsx:
- Line 108: The onClick handler calls window.open(EXTERNAL_LINKS.NEWS_FROM_URL,
"_blank") which allows the opened page to access window.opener; change the call
to include the no-opener/no-referrer feature string (e.g.,
window.open(EXTERNAL_LINKS.NEWS_FROM_URL, "_blank", "noopener,noreferrer")) so
the new tab cannot access the opener. Update the onClick where window.open is
used (referenced by the onClick handler and EXTERNAL_LINKS.NEWS_FROM_URL) to
pass the "noopener,noreferrer" feature flags.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 106c4a6c-bb3a-4b3a-891d-a7cf6846ef5f

📥 Commits

Reviewing files that changed from the base of the PR and between 37101d6 and b931c2c.

📒 Files selected for processing (3)
  • src/app/(main)/news/page.tsx
  • src/components/base-ui/MyPage/ProfileSection/UserProfile.tsx
  • src/constants/links.ts
✅ Files skipped from review due to trivial changes (2)
  • src/components/base-ui/MyPage/ProfileSection/UserProfile.tsx
  • src/constants/links.ts

Comment thread src/app/(main)/news/page.tsx Resolved

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 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/base-ui/MyPage/items/MyMeetingCard.tsx`:
- Around line 39-42: The clickable card div in MyMeetingCard.tsx currently uses
onClick(() => router.push(`/groups/${club.clubId}`)) but is not
keyboard-accessible; make it focusable and operable via keyboard by either
replacing the div with a semantic element (e.g., a button or anchor) or adding
tabIndex={0}, role="button", and an onKeyDown handler that calls the same
router.push(`/groups/${club.clubId}`) when Enter or Space is pressed (prevent
default for Space), and include a descriptive aria-label if the surrounding
content isn't explicit; update the element with these changes so keyboard-only
users can open the meeting detail.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 07c938e4-159f-4965-bf6e-33cb624b4342

📥 Commits

Reviewing files that changed from the base of the PR and between b931c2c and 90fe856.

📒 Files selected for processing (1)
  • src/components/base-ui/MyPage/items/MyMeetingCard.tsx

Comment on lines +39 to +42
<div
onClick={() => router.push(`/groups/${club.clubId}`)}
className="flex w-full px-[18px] py-[12px] md:p-[20px] justify-between items-center rounded-[8px] bg-white border border-[#EAE5E2] gap-[12px] cursor-pointer hover:bg-gray-50 transition-colors"
>

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

Add keyboard-accessible semantics to the clickable card container.

Line 39 makes a div act like a navigation control, but it is not keyboard-focusable and has no keyboard activation handler. This blocks keyboard-only users from opening the meeting detail.

Suggested fix
-    <div
-      onClick={() => router.push(`/groups/${club.clubId}`)}
+    <div
+      role="button"
+      tabIndex={0}
+      onClick={() => router.push(`/groups/${club.clubId}`)}
+      onKeyDown={(e) => {
+        if (e.key === "Enter" || e.key === " ") {
+          e.preventDefault();
+          router.push(`/groups/${club.clubId}`);
+        }
+      }}
       className="flex w-full px-[18px] py-[12px] md:p-[20px] justify-between items-center rounded-[8px] bg-white border border-[`#EAE5E2`] gap-[12px] cursor-pointer hover:bg-gray-50 transition-colors"
     >
📝 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
<div
onClick={() => router.push(`/groups/${club.clubId}`)}
className="flex w-full px-[18px] py-[12px] md:p-[20px] justify-between items-center rounded-[8px] bg-white border border-[#EAE5E2] gap-[12px] cursor-pointer hover:bg-gray-50 transition-colors"
>
<div
role="button"
tabIndex={0}
onClick={() => router.push(`/groups/${club.clubId}`)}
onKeyDown={(e) => {
if (e.key === "Enter" || e.key === " ") {
e.preventDefault();
router.push(`/groups/${club.clubId}`);
}
}}
className="flex w-full px-[18px] py-[12px] md:p-[20px] justify-between items-center rounded-[8px] bg-white border border-[`#EAE5E2`] gap-[12px] cursor-pointer hover:bg-gray-50 transition-colors"
>
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/base-ui/MyPage/items/MyMeetingCard.tsx` around lines 39 - 42,
The clickable card div in MyMeetingCard.tsx currently uses onClick(() =>
router.push(`/groups/${club.clubId}`)) but is not keyboard-accessible; make it
focusable and operable via keyboard by either replacing the div with a semantic
element (e.g., a button or anchor) or adding tabIndex={0}, role="button", and an
onKeyDown handler that calls the same router.push(`/groups/${club.clubId}`) when
Enter or Space is pressed (prevent default for Space), and include a descriptive
aria-label if the surrounding content isn't explicit; update the element with
these changes so keyboard-only users can open the meeting detail.

@shinwokkang
shinwokkang merged commit 3f06b52 into main Mar 23, 2026
4 checks passed
@coderabbitai coderabbitai Bot mentioned this pull request May 22, 2026
@coderabbitai coderabbitai Bot mentioned this pull request Jun 28, 2026

This branch was successfully deployed

2 active deployments
Preview – check-mo — 90fe856c Deployed Mar 23, 2026 by vercel[bot]
Preview – checkmo — 90fe856c Deployed Mar 23, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

✨ feat 새로운 기능 추가 ♻️ refactor 리팩토링

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant