Skip to content

[Feature/#213] 설정 페이지 탭 UI 및 알림 채널 설정 추가#216

Merged
jjjsun merged 12 commits into
developfrom
feature/#213
May 19, 2026
Merged

[Feature/#213] 설정 페이지 탭 UI 및 알림 채널 설정 추가#216
jjjsun merged 12 commits into
developfrom
feature/#213

Conversation

@jjjsun
Copy link
Copy Markdown
Collaborator

@jjjsun jjjsun commented May 16, 2026

🚨 관련 이슈

Closed #213

✨ 변경사항

  • 🐞 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

😅 미완성 작업

  • 알림 설정 API 연동 (백엔드 구현 후 진행예정)
  • 슬랙 OAuth 연동

📢 논의 사항 및 참고 사항

알림 탭에서 저장버튼이 현재는 disabled 상태입니다. API연동하면 활성화될예정입니다.
알림 설정은 프로필과 비밀번호변경과 마찬가지로 즉시저장이 아니라 저장 버튼 방식으로 일관성을 높였습니다.

UI 변경관련

기존 before 위의 이미지가 탭형식 미사용한 기존 전체화면인데, 하나의 페이지에 넣다보니 길어지고, 알림 설정이 위의 2개의 섹션과 어울리지 않아서 탭형식으로 변경하였습니다. 기존의 워크스페이스와 대시보드처럼 children 형식으로 별도의 URL로 두는것이 전체적인 사이드바 일관성이 있지만, 별도의 URL로 두기에는 각각의 section에 많은 내용이 있지 않아서 탭형식으로 구현하였습니다. 그래서, mainNav로 올리지 않고 footerNav로 유지하면서 별도의 URL을 두는 mainNav와는 다르게 탭형식으로 구현하는 것이 훨씬 더 깔끔해보여 변경했습니다! 추가 의견 있으시면 알려주시면 좋을것같습니다!

+) 추가로 profileSection에 소속 조직 나열을 아코디언으로 펼치고 닫는 구현은 추가 PR로 올릴예정입니다

수정사항 : 탭형식 제거. profileSection내 소속 조직정보 제거. 알림토글 상태변경시 저장하기 버튼이용하여 저장되도록 구현.

💬 리뷰어 가이드 (P-Rules)
P1: 필수 반영 (Critical) - 버그 가능성, 컨벤션 위반. 해결 전 머지 불가.
P2: 적극 권장 (Recommended) - 더 나은 대안 제시. 가급적 반영 권장.
P3: 제안 (Suggestion) - 아이디어 공유. 반영 여부는 드라이버 자율.
P4: 단순 확인/칭찬 (Nit) - 사소한 오타, 칭찬 등 피드백.

Summary by CodeRabbit

릴리스 노트

  • 새로운 기능

    • 알림 채널 설정 추가 (브라우저 푸시, 이메일 알림 토글)
  • 개선 사항

    • 설정 페이지의 프로필 및 알림 섹션 개선
    • 프로필 섹션 레이아웃 재구성
    • 사이드바 네비게이션 단순화

Review Change Stack

@jjjsun jjjsun requested review from Seojegyeong and YermIm May 16, 2026 06:20
@jjjsun jjjsun self-assigned this May 16, 2026
@jjjsun jjjsun added 🎨 Html&css 마크업 & 스타일링 ✨ Feature 기능 개발 labels May 16, 2026
@vercel
Copy link
Copy Markdown

vercel Bot commented May 16, 2026

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

Project Deployment Actions Updated (UTC)
where-you-ad Ready Ready Preview, Comment May 16, 2026 6:29am

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 16, 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: a222b5bc-4dc0-482f-977d-9480abe08676

📥 Commits

Reviewing files that changed from the base of the PR and between 8c95cd7 and 1550042.

📒 Files selected for processing (4)
  • src/components/setting/NotificationSection.tsx
  • src/components/setting/ProfileSection.tsx
  • src/components/setting/ProfileSectionSkeleton.tsx
  • src/pages/setting/Setting.tsx
🚧 Files skipped from review as they are similar to previous changes (4)
  • src/components/setting/ProfileSectionSkeleton.tsx
  • src/components/setting/NotificationSection.tsx
  • src/pages/setting/Setting.tsx
  • src/components/setting/ProfileSection.tsx

📝 Walkthrough

Walkthrough

설정 페이지에 브라우저 푸시·이메일 알림 채널 UI를 추가하고, Setting을 프로필/비밀번호/알림으로 분리해 알림 상태를 draft/saved로 관리하며 사이드바의 알림 항목을 제거했습니다.

변경 사항

설정 페이지 탭화 및 알림 채널 통합

Layer / File(s) Summary
알림 채널 설정 컴포넌트
src/components/setting/NotificationSection.tsx
NotificationSectionINotificationSettings 타입을 도입하고 browserPush, emailNotif을 props로 받아 토글을 렌더링한다. 토글 클릭 시 onBrowserPushChange(!browserPush) / onEmailNotifChange(!emailNotif)를 호출하며, 브라우저 푸시가 켜진 경우에만 "켜짐" Badge를 표시하고 슬랙은 연동 버튼만 노출한다.
Setting 페이지 상태 분리 및 저장 처리
src/pages/setting/Setting.tsx
DEFAULT_NOTIFICATION_SETTINGSsavedNotification/draftNotification 상태를 추가하고, 변경 감지를 hasProfileChangeshasNotificationChanges로 분리했다. handleSave는 계정 변경과 알림 변경을 분기 처리(알림 API 연동은 TODO)하며 성공 토스트 메시지는 조합에 따라 분기된다. 로딩 시 각 섹션의 스켈레톤/대체 UI를 독립적으로 렌더링한다.
ProfileSection props 정리 및 레이아웃 조정
src/components/setting/ProfileSection.tsx
TProfileSectionProps에서 organizations를 제거하고 해당 UI 블록을 삭제했다. 프로필 이미지 업로드 버튼 크기와 우측 그리드의 col-span/배치가 조정되어 이메일/전화번호 입력이 2열로 배치된다.
ProfileSectionSkeleton 레이아웃 조정
src/components/setting/ProfileSectionSkeleton.tsx
우측 그리드 반응형 클래스와 자식 col-span 구성을 col-span-2 tablet:col-span-1col-span-1 구조로 조정했다.
사이드바 네비게이션 정리
src/constants/sidebarNav.ts
footerNav에서 notifications 항목과 NotificationIcon import를 제거하여 사이드바에서 해당 네비게이션 항목을 삭제했다.

Sequence Diagram(s)

sequenceDiagram
  participant User as 사용자
  participant NotificationSection as NotificationSection UI
  participant SettingPage as Setting.tsx
  participant State as draftNotification / savedNotification
  participant Toast as toast

  User->>NotificationSection: 토글 클릭 (브라우저푸시/이메일)
  NotificationSection->>SettingPage: on*Change(반전값)
  SettingPage->>State: draftNotification 업데이트
  Note right of SettingPage: 저장 시 handleSave에서\nsavedNotification 갱신 / updateMyInfo 분기
  SettingPage->>Toast: 성공 메시지 표시
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

제안 리뷰어

  • Seojegyeong
  • YermIm
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

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.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed PR 제목이 주요 변경사항을 명확하게 반영하고 있으며, 알림 채널 설정 추가와 UI 관련 작업을 적절히 요약하고 있습니다.
Description check ✅ Passed PR 설명에 관련 이슈, 변경사항 체크리스트, 상세한 작업 내용, 미완성 작업, 참고사항이 포함되어 있으며 스크린샷으로 시각적 변화를 보여줍니다.
Linked Issues check ✅ Passed PR은 #213 이슈의 두 가지 요구사항을 모두 충족합니다: 사이드바 footNav에서 알림 아이콘 제거 및 설정 페이지 내 알림 채널 설정 UI 추가.
Out of Scope Changes check ✅ Passed 모든 변경사항이 #213 이슈의 범위 내에 있으며, 프로필 섹션 레이아웃 조정, 알림 상태 관리, 탭 구조 제거 등 모두 명시된 목표와 관련이 있습니다.

✏️ 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 feature/#213

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
Copy Markdown

github-actions Bot commented May 16, 2026

📚 Storybook 배포 완료

항목 링크
📖 Storybook https://69a147b60a56365d9e2185ef-ipqutiudyb.chromatic.com/
🔍 Chromatic https://www.chromatic.com/build?appId=69a147b60a56365d9e2185ef&number=304

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

🧹 Nitpick comments (2)
src/components/setting/NotificationSection.tsx (1)

25-27: ⚡ Quick win

헤더의 BellIcon에 색상 클래스가 누락되었습니다.

Line 32의 BellIcon은 text-text-muted 클래스가 적용되어 있지만, 헤더의 BellIcon에는 색상 클래스가 없습니다. 코딩 가이드라인에 따라 SVG 요소에는 text-* 클래스를 통해 색상을 적용해야 합니다.

🔧 색상 클래스 추가 제안
 <header className="mb-7 flex items-center gap-4">
-  <BellIcon />
+  <BellIcon className="h-6 w-6 text-text-title" />
   <h2 className="font-heading4 text-text-title">알림 채널 설정</h2>
 </header>

As per coding guidelines: "For SVG elements, use fill/stroke="currentColor" and apply colors via text-* classes only."

🤖 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/components/setting/NotificationSection.tsx` around lines 25 - 27, The
BellIcon in NotificationSection (inside the header element) is missing the color
class; update the JSX rendering of BellIcon in NotificationSection.tsx to apply
the same text-* color class used elsewhere (e.g., text-text-muted) so the SVG
inherits color via currentColor per guidelines; locate the BellIcon usage in the
header and add the appropriate className prop (matching other instances) so the
SVG uses fill/stroke="currentColor" and the color is applied via Tailwind text-*
classes.
src/pages/setting/Setting.tsx (1)

192-210: ⚡ Quick win

탭 접근성 패턴이 불완전합니다.

현재 role="tab"aria-selected가 적용되어 있지만, WAI-ARIA 탭 패턴을 완전히 준수하려면 추가 속성이 필요합니다:

  • 탭 버튼들의 컨테이너에 role="tablist" 필요
  • 각 탭 콘텐츠 영역에 role="tabpanel"aria-labelledby 필요
  • aria-controls로 탭과 패널 연결
♿ 접근성 개선 예시
- <nav aria-label="설정 탭" className="flex border-b border-surface-300">
+ <nav aria-label="설정 탭" role="tablist" className="flex border-b border-surface-300">
    {TABS.map((tab) => (
      <button
        key={tab.id}
        type="button"
        role="tab"
        aria-selected={activeTab === tab.id}
+       aria-controls={`panel-${tab.id}`}
+       id={`tab-${tab.id}`}
        onClick={() => setActiveTab(tab.id)}
        ...
      >

콘텐츠 영역에도 적용:

<div 
  role="tabpanel" 
  id={`panel-${activeTab}`}
  aria-labelledby={`tab-${activeTab}`}
  className="flex flex-col gap-6"
>

As per coding guidelines: "접근성: 시맨틱 HTML, ARIA 속성 사용 확인."

🤖 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/setting/Setting.tsx` around lines 192 - 210, The nav and buttons
implement part of the ARIA tabs pattern but miss container and panel linkage:
add role="tablist" to the nav wrapping TABS, give each tab button a stable id
(e.g., tab-{tab.id}) and aria-controls pointing to the matching panel id
(panel-{tab.id}) while retaining aria-selected and onClick in setActiveTab, and
ensure each tab content container uses role="tabpanel", id="panel-{activeTab}"
and aria-labelledby="tab-{activeTab}" to fully connect tabs and panels (update
components that render the panel for activeTab to include these attributes).
🤖 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/pages/setting/Setting.tsx`:
- Around line 85-86: The hasChanges computation incorrectly treats the
"notifications" tab the same as "security"; update the logic in the Setting
component so hasChanges checks activeTab explicitly for "profile" (use
hasProfileChanges), for "security" (use hasPasswordChanges), and returns false
for "notifications" (or any other tabs) so the Save button remains disabled
until API integration. Modify the expression that assigns hasChanges
(referencing activeTab, hasProfileChanges, hasPasswordChanges) to branch for
"profile", "security", and default to false for notifications.
- Around line 257-259: The notifications tab is missing the loading-state guard:
when activeTab === "notifications" you should mirror the Profile/Security tab
behavior by showing the skeleton while isLoading is true and only render
<NotificationSection email={draftProfile.email} /> once loading finishes; update
the conditional that renders NotificationSection to check !isLoading and, inside
NotificationSection props, ensure draftProfile.email is used with a safe
fallback (e.g., empty string or undefined) so the UI doesn't break when
draftProfile.email is empty; look for activeTab, isLoading, draftProfile.email
and NotificationSection in Setting.tsx to implement the change.

---

Nitpick comments:
In `@src/components/setting/NotificationSection.tsx`:
- Around line 25-27: The BellIcon in NotificationSection (inside the header
element) is missing the color class; update the JSX rendering of BellIcon in
NotificationSection.tsx to apply the same text-* color class used elsewhere
(e.g., text-text-muted) so the SVG inherits color via currentColor per
guidelines; locate the BellIcon usage in the header and add the appropriate
className prop (matching other instances) so the SVG uses
fill/stroke="currentColor" and the color is applied via Tailwind text-* classes.

In `@src/pages/setting/Setting.tsx`:
- Around line 192-210: The nav and buttons implement part of the ARIA tabs
pattern but miss container and panel linkage: add role="tablist" to the nav
wrapping TABS, give each tab button a stable id (e.g., tab-{tab.id}) and
aria-controls pointing to the matching panel id (panel-{tab.id}) while retaining
aria-selected and onClick in setActiveTab, and ensure each tab content container
uses role="tabpanel", id="panel-{activeTab}" and
aria-labelledby="tab-{activeTab}" to fully connect tabs and panels (update
components that render the panel for activeTab to include these attributes).
🪄 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: 61e3e172-62cd-4710-a436-fcae55ce6d9b

📥 Commits

Reviewing files that changed from the base of the PR and between 7525ecb and 51e3d61.

⛔ Files ignored due to path filters (1)
  • src/assets/logo/social-logo/plain/slack.svg is excluded by !**/*.svg and included by src/**
📒 Files selected for processing (3)
  • src/components/setting/NotificationSection.tsx
  • src/constants/sidebarNav.ts
  • src/pages/setting/Setting.tsx
💤 Files with no reviewable changes (1)
  • src/constants/sidebarNav.ts

Comment thread src/pages/setting/Setting.tsx Outdated
Comment thread src/pages/setting/Setting.tsx Outdated
@Seojegyeong
Copy link
Copy Markdown
Collaborator

P2: 현재 보안/알림 페이지는 각 페이지에 카드가 하나씩만 있는 구조라, 탭으로 페이지를 분리하는 것은 오버 엔지니어링에 가까워 보입니다. 사용자가 소속된 조직 정보는 이미 워크스페이스 영역에서 확인 가능하므로, 설정 페이지에 중복해서 포함할 필요는 없을 것 같습니다.
조직 관련 항목은 제거하고, 프로필 / 비밀번호 / 알림 채널 설정을 하나의 설정 페이지 내에서 구성하는 방식이 더 자연스러워 보입니다!!
추가로 Navigation을 중첩하는 구조는 지양하는 방향이 좋을 것 같습니다...

@YermIm
Copy link
Copy Markdown
Collaborator

YermIm commented May 16, 2026

P2: 생각해보니 워크스페이스 화면이 존재해서 설정에서 소속 조직은 빼도 될 것 같습니다. 그렇게 되면 탭 없이 한페이지에 배치해도 괜찮을 것 같아요!

@jjjsun
Copy link
Copy Markdown
Collaborator Author

jjjsun commented May 16, 2026

저도 중첩 nav랑 세부url 둘다 애매해서 고민중이었는데, 의견 감사합니다!
그러면 프로필에서 탭형식 삭제하고, 프로필에 조직정보 삭제해서 한 페이지에 구성하도록 하겠습니다.

@jjjsun
Copy link
Copy Markdown
Collaborator Author

jjjsun commented May 19, 2026

screencapture-localhost-5173-setting-2026-05-19-12_01_27

탭형식 제거하여 수정 진행했습니다!

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

Caution

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

⚠️ Outside diff range comments (1)
src/pages/setting/Setting.tsx (1)

121-173: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

저장 중 재클릭을 막는 상태가 필요합니다.

현재 isLoading은 초기 조회에만 쓰이고 있어서 updateMyInfo 요청이 진행되는 동안에도 버튼이 계속 활성화됩니다. 그 상태에서 연속 클릭하면 프로필/비밀번호 수정 요청이 중복으로 날아가고, 토스트/로컬 상태도 서로 엇갈릴 수 있습니다.

🔧 제안 수정
+  const [isSaving, setIsSaving] = useState(false);
+
   const handleSave = async () => {
+    if (isSaving) return;
+
     if (hasPasswordChanges) {
       const errors = validatePassword();
       setPasswordErrors(errors);
       if (Object.values(errors).some(Boolean)) return;
     } else {
@@
     }
     try {
+      setIsSaving(true);
+
       if (hasAccountChanges) {
         const res = await updateMyInfo({
           name: draftProfile.name,
           oldPassword: currentPassword || undefined,
           newPassword: newPassword || undefined,
@@
     } catch (e) {
       const error = e as IApiErrorResponse;
       toast.error(error.message ?? "회원정보수정에 실패했습니다");
+    } finally {
+      setIsSaving(false);
     }
   };
@@
-          disabled={!hasChanges || isLoading}
+          disabled={!hasChanges || isLoading || isSaving}

Also applies to: 255-263

🤖 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/setting/Setting.tsx` around lines 121 - 173, The save flow in
handleSave allows duplicate requests because the existing isLoading only covers
initial fetch; add a dedicated "isSaving" (or reuse isLoading but ensure
semantics) boolean state and guard at the top of handleSave to return early if
isSaving is true, set isSaving = true before awaiting updateMyInfo (and other
async work), and set isSaving = false in a finally block so UI and toast updates
can't interleave; also update the Save button (and the other handler at the
255-263 region) to use this isSaving flag to disable clicks while the request is
in progress.
♻️ Duplicate comments (1)
src/pages/setting/Setting.tsx (1)

87-90: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

알림 설정은 아직 서버에 저장되지 않는데 저장 완료로 확정하고 있습니다.

hasChanges에 알림 변경을 포함해서 저장 버튼을 활성화하고, handleSave에서는 setSavedNotification(...)만 한 뒤 성공 토스트를 띄우고 있습니다. 지금 상태로는 새로고침하면 값이 사라질 수 있는데도 사용자는 저장된 줄 알게 됩니다. 계정 정보와 함께 저장하는 경우에도 알림까지 반영된 것처럼 보입니다. API 연동 전까지는 알림 변경만으로 저장 가능 상태가 되지 않게 막거나, 최소한 “준비 중”으로 분리해 주세요.

Also applies to: 157-168, 255-263

🤖 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/setting/Setting.tsx` around lines 87 - 90, The code incorrectly
treats notification-only edits as saved: change the save logic so notification
changes don't enable the main "Save" flow until API support exists by removing
hasNotificationChanges from the main hasChanges/Save gating (leave
hasAccountChanges = hasProfileChanges || hasPasswordChanges and set hasChanges =
hasAccountChanges only), and introduce a separate flag (e.g.,
hasPendingNotificationChanges or keep hasNotificationChanges) to track
notification edits; update handleSave (the function that calls
setSavedNotification and shows the success toast) so it does not show a
full-success toast or mark the overall form saved when only notification changes
exist—either disable the save button for notification-only changes or show a
distinct “notification changes pending / saving not yet supported” UI message
instead. Ensure references to setSavedNotification, hasChanges,
hasAccountChanges, hasNotificationChanges, and handleSave are updated
consistently and that the Save button enabling logic uses the new separation.
🤖 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/components/setting/NotificationSection.tsx`:
- Around line 76-78: The "연동" Button in NotificationSection is currently
interactive but not implemented; update the Button element in
NotificationSection.tsx (the Button that renders "연동") to reflect a
disabled/unavailable state until Slack OAuth is implemented: either add the
disabled prop to the Button and optionally change its label to "준비 중" (or render
a tooltip/aria-label explaining it's coming soon) so it appears non-clickable
and accessible; ensure any onClick handler is removed or guarded so no action is
attempted while disabled.
- Around line 44-49: The badge currently shows "권한 허용됨" based solely on the
boolean browserPush which is the user setting, not the browser permission;
change the UI so it doesn't assert granted permission: either (A) only render
the Badge when both browserPush is true and the actual permission is confirmed
(check Notification.permission === 'granted' or accept a new prop like
browserPermission === 'granted'), or (B) keep the Badge but change its text to a
non-assertive state like "알림 켜짐" / "설정 활성화됨" and remove any wording that claims
permission; update the render around Badge, Toggle and onBrowserPushChange
accordingly.

---

Outside diff comments:
In `@src/pages/setting/Setting.tsx`:
- Around line 121-173: The save flow in handleSave allows duplicate requests
because the existing isLoading only covers initial fetch; add a dedicated
"isSaving" (or reuse isLoading but ensure semantics) boolean state and guard at
the top of handleSave to return early if isSaving is true, set isSaving = true
before awaiting updateMyInfo (and other async work), and set isSaving = false in
a finally block so UI and toast updates can't interleave; also update the Save
button (and the other handler at the 255-263 region) to use this isSaving flag
to disable clicks while the request is in progress.

---

Duplicate comments:
In `@src/pages/setting/Setting.tsx`:
- Around line 87-90: The code incorrectly treats notification-only edits as
saved: change the save logic so notification changes don't enable the main
"Save" flow until API support exists by removing hasNotificationChanges from the
main hasChanges/Save gating (leave hasAccountChanges = hasProfileChanges ||
hasPasswordChanges and set hasChanges = hasAccountChanges only), and introduce a
separate flag (e.g., hasPendingNotificationChanges or keep
hasNotificationChanges) to track notification edits; update handleSave (the
function that calls setSavedNotification and shows the success toast) so it does
not show a full-success toast or mark the overall form saved when only
notification changes exist—either disable the save button for notification-only
changes or show a distinct “notification changes pending / saving not yet
supported” UI message instead. Ensure references to setSavedNotification,
hasChanges, hasAccountChanges, hasNotificationChanges, and handleSave are
updated consistently and that the Save button enabling logic uses the new
separation.
🪄 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: fae24040-22af-4995-bfb2-cba31cc62dcb

📥 Commits

Reviewing files that changed from the base of the PR and between 51e3d61 and 8c95cd7.

📒 Files selected for processing (4)
  • src/components/setting/NotificationSection.tsx
  • src/components/setting/ProfileSection.tsx
  • src/components/setting/ProfileSectionSkeleton.tsx
  • src/pages/setting/Setting.tsx
💤 Files with no reviewable changes (2)
  • src/components/setting/ProfileSectionSkeleton.tsx
  • src/components/setting/ProfileSection.tsx

Comment thread src/components/setting/NotificationSection.tsx Outdated
Comment thread src/components/setting/NotificationSection.tsx
@Seojegyeong
Copy link
Copy Markdown
Collaborator

P4: 가로 너비가 길어서 레이아웃이 어색해 보이는 듯합니다! 아래 처럼 구성하면 어떨까요?

  • 이메일과 전화번호 같은 라인에 두고 프로필 이미지 조금 작게 구성
  • 비민번호 재설정과 알림 채널 설정 카드 같은 라인에 배치
스크린샷 2026-05-19 오후 12 40 32

@jjjsun
Copy link
Copy Markdown
Collaborator Author

jjjsun commented May 19, 2026

P4: 가로 너비가 길어서 레이아웃이 어색해 보이는 듯합니다! 아래 처럼 구성하면 어떨까요?

  • 이메일과 전화번호 같은 라인에 두고 프로필 이미지 조금 작게 구성
  • 비민번호 재설정과 알림 채널 설정 카드 같은 라인에 배치
스크린샷 2026-05-19 오후 12 40 32

수정하는게 더 나을듯합니다 반영하겠습니다!

@jjjsun
Copy link
Copy Markdown
Collaborator Author

jjjsun commented May 19, 2026

P4: 가로 너비가 길어서 레이아웃이 어색해 보이는 듯합니다! 아래 처럼 구성하면 어떨까요?

  • 이메일과 전화번호 같은 라인에 두고 프로필 이미지 조금 작게 구성
  • 비민번호 재설정과 알림 채널 설정 카드 같은 라인에 배치
스크린샷 2026-05-19 오후 12 40 32
screencapture-localhost-5173-setting-2026-05-19-14_44_45 비밀번호 section과 알림 채널 설정이 같은 라인에 배치하는 방향으로 구현해보니, 둘 사이에 내부 내용의 높이 차이가 있어 변경하지 않고 현재 스타일로 유지하였습니다. 현재로써는 내부의 내용의 높이 차이가 있어서 다른 열로 두는게 더 자연스러워보입니다. 추후에 알림 채널 설정 내부에 추가 내용이 생겨 내부 높이가 길어지면 같은 열로 두는것을 고려해보겠습니다!

Copy link
Copy Markdown
Collaborator

@Seojegyeong Seojegyeong left a comment

Choose a reason for hiding this comment

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

P4: 확인했습니다!

@jjjsun jjjsun merged commit 999b27a into develop May 19, 2026
3 checks passed
@jjjsun jjjsun deleted the feature/#213 branch May 19, 2026 05:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

✨ Feature 기능 개발 🎨 Html&css 마크업 & 스타일링

Projects

None yet

Development

Successfully merging this pull request may close these issues.

✨ [Feature] 설정페이지 내에 알림채널 설정 UI 추가

3 participants