Skip to content

[Deploy] develop → main 배포 반영 - #459

Merged
jjjsun merged 51 commits into
mainfrom
develop
Aug 12, 2026
Merged

[Deploy] develop → main 배포 반영#459
jjjsun merged 51 commits into
mainfrom
develop

Conversation

@jjjsun

@jjjsun jjjsun commented Aug 12, 2026

Copy link
Copy Markdown
Collaborator

🚨 관련 이슈

N/A

✨ 변경사항

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

✏️ 작업 내용

N/A

😅 미완성 작업

N/A

📢 논의 사항 및 참고 사항

N/A

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

Summary by CodeRabbit

  • 새로운 기능

    • 타임라인에서 보기 단위·기간 이동·필터·정렬을 지원하고, 캠페인 바 선택·편집·삭제 기능을 개선했습니다.
    • 타임라인 생성, 삭제 확인, 요약 생성 상태 및 결과 조회를 제공합니다.
    • 프로필, 비밀번호, 알림 설정을 통합 저장할 수 있습니다.
    • 권한 목록에 타임라인 관리 권한을 추가했습니다.
  • 개선 사항

    • 로그아웃 후 캐시를 정리하고 완료 안내를 표시합니다.
    • 초대 UI를 간소화하고 프로필 이미지 및 설정 화면의 레이아웃과 접근성을 개선했습니다.
    • 드롭다운 위치가 화면 크기 변경과 스크롤에 맞춰 조정됩니다.

jjjsun and others added 30 commits August 10, 2026 16:38
[Feature/#448] 멤버 관리 권한 설정을 역할별 고정 안내표로 변경
[Feature/#444] 개인 설정 페이지 UX 개선
jjjsun and others added 21 commits August 12, 2026 03:31
[Feature/#431] 담당 페이지(워크스페이스/타임라인/알림/설정) 모바일 반응형 및 타임라인 드랍다운 수정
[Feature/#443] 워크스페이스 설정 페이지 UX 개선
[Refactor/#450] 타임라인 페이지 훅/UI 분리
[Bugfix/#452] 로그아웃시 React Query 캐시 전체 초기화
[Refactor/#455] 팀원초대 링크 복사 관련 UI/로직 삭제
[Refactor/#457] Setting 페이지 커스텀 훅 분리
@jjjsun jjjsun self-assigned this Aug 12, 2026
@jjjsun jjjsun added the 🌏 Deploy 배포 관련 label Aug 12, 2026
@coderabbitai

coderabbitai Bot commented Aug 12, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

설정 페이지의 상태와 저장 로직을 전용 훅으로 분리했습니다. 타임라인 화면의 상태, 렌더링, 삭제 흐름을 컴포넌트와 훅으로 재구성했습니다. 권한 표시, 초대 UI, 워크스페이스 저장 조건, 로그아웃 캐시 처리를 변경했습니다.

Changes

설정 상태 및 저장 흐름

Layer / File(s) Summary
설정 상태 계약과 전용 훅
src/types/setting/settingPage.ts, src/hooks/setting/*
알림과 프로필 타입을 추가했습니다. 프로필, 비밀번호, 알림 상태와 Webhook 연결 처리를 전용 훅으로 구현했습니다.
설정 저장 통합과 화면 연결
src/hooks/setting/useSettingSave.ts, src/pages/setting/Setting.tsx, src/components/setting/*
프로필·비밀번호·알림 저장을 순차 처리하도록 통합했습니다. 설정 화면은 훅의 상태와 핸들러를 사용합니다. 관련 레이아웃과 프로필 UI도 조정했습니다.

타임라인 화면 구조화

Layer / File(s) Summary
타임라인 상태 훅
src/hooks/timeline/*
기간 이동, 바 선택 패널, 편집 모달, 요약 폴링 상태를 전용 훅으로 분리했습니다.
타임라인 컨트롤과 렌더링 컴포넌트
src/components/timeline/TimelineToolbar.tsx, src/components/timeline/TimelineCanvas.tsx, src/components/timeline/TimelineDeleteModal.tsx, src/components/timeline/TimelineBar.tsx
툴바, 캔버스, 삭제 모달을 추가했습니다. 액션 메뉴가 표시될 때 바 콘텐츠에 오른쪽 여백을 적용합니다.
타임라인 페이지 조합
src/pages/dashboard/timeline/Timeline.tsx
페이지가 새 훅과 컴포넌트를 사용하도록 변경했습니다. 기존 내부 상태와 직접 렌더링 로직을 제거했습니다.
드롭다운 위치 재계산
src/components/common/dropdownmenu/DropdownMenu.tsx
창 크기, 캡처 단계 스크롤, 요소 크기 변경 시 드롭다운 위치를 다시 계산합니다. 이펙트 종료 시 리스너와 옵저버를 해제합니다.

워크스페이스 권한 및 UI 변경

Layer / File(s) Summary
역할 기반 권한 표시
src/types/workspace/workspace.ts, src/components/workspace/PermissionTable.tsx
timelineManage 권한을 추가했습니다. 멤버 권한을 편집 컨트롤 대신 역할 기반 가능·불가능 배지로 표시합니다.
워크스페이스 저장 조건과 레이아웃
src/pages/workspace/WorkspaceSetting.tsx
변경 사항이 있을 때만 저장 요청과 버튼 활성화를 허용합니다. 로고, 설명 영역, 버튼 크기를 조정했습니다.
초대 UI와 로그아웃 처리
src/components/landing/GuideWorkspace.tsx, src/components/workspace/InviteMemberModal.tsx, src/hooks/auth/useLogout.ts
초대 링크 복사 UI를 메일 아이콘 헤더로 변경했습니다. 로그아웃 성공 시 전체 React Query 캐시를 삭제하고 성공 토스트를 표시합니다.

Estimated code review effort: 5 (Critical) | ~120 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Setting
  participant useSettingSave
  participant AccountAPI
  participant NotificationAPI
  Setting->>useSettingSave: 설정 저장 요청
  useSettingSave->>AccountAPI: 프로필·비밀번호 저장
  useSettingSave->>NotificationAPI: 알림 설정 저장
  useSettingSave-->>Setting: 저장 결과와 상태 반환
Loading
sequenceDiagram
  participant Timeline
  participant useTimelinePanel
  participant useTimelineSummaryPolling
  participant TimelineAPI
  Timeline->>useTimelinePanel: 타임라인 바 선택
  useTimelinePanel->>TimelineAPI: 상세 데이터 조회
  Timeline->>useTimelineSummaryPolling: 요약 생성 요청
  useTimelineSummaryPolling->>TimelineAPI: 상세 데이터 폴링
  TimelineAPI-->>useTimelineSummaryPolling: 요약 데이터 반환
Loading

Possibly related issues

  • WhereYouAd/WhereYouAd-Frontend#457 — 설정 페이지의 프로필, 비밀번호, 알림, 저장 로직을 전용 훅으로 분리하는 변경과 직접 연결됩니다.

Possibly related PRs

Suggested reviewers: yermim, seojegyeong

🚥 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 제목이 develop 브랜치의 변경사항을 main 브랜치에 배포 반영한다는 PR의 주요 목적을 정확히 설명합니다.
Description check ✅ Passed 필수 섹션과 배포 유형은 작성되었지만, 실제 변경사항을 작업 내용에 구체적으로 설명하지 않고 N/A로 표시했습니다.
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.
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch develop

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.

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

🧹 Nitpick comments (8)
src/hooks/setting/useSettingProfile.ts (1)

68-92: 📐 Maintainability & Code Quality | 🔵 Trivial | 🏗️ Heavy lift

회원 정보 조회를 useCoreQuery로 옮기는 방안을 검토해주세요.

현재 getMyInfo 호출을 useEffect + useState로 직접 관리합니다. 같은 코호트의 useSettingNotifications.tsuseCoreQuery를 사용합니다. 서버 상태를 수동으로 다루면 캐시 공유, 재요청, 에러 재시도를 직접 구현해야 합니다.

savedProfileuseCoreQuery로 가져오고, draftProfile만 로컬 상태로 유지하는 구조를 제안합니다. 저장 성공 후에는 applyAccountSaveSuccess 대신 쿼리 무효화로 동기화할 수 있습니다.

코딩 가이드라인의 "Server state hooks: use useCoreQuery and useCoreMutation from src/hooks/customQuery.ts. Avoid direct useQuery/useMutation" 규칙을 근거로 남깁니다.

🤖 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/hooks/setting/useSettingProfile.ts` around lines 68 - 92, Refactor the
getMyInfo flow in useSettingProfile to use useCoreQuery, exposing the fetched
server data as savedProfile instead of managing its loading and request
lifecycle through useEffect and local state. Keep draftProfile as local editable
state, map the query data into the existing profile shape, and use the query’s
loading/error handling with the existing toast behavior. Ensure profile
synchronization after saving uses query invalidation rather than
applyAccountSaveSuccess.

Source: Coding guidelines

src/pages/setting/Setting.tsx (1)

211-221: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick win

저장 중 버튼을 비활성화해주세요.

disabled 조건에서 isSaving이 빠졌습니다. 저장이 진행되는 동안에도 hasChangestrue이므로 버튼을 계속 누를 수 있습니다. 중복 실행은 useSettingSaveisSavingRef가 막지만, 사용자는 반응 없는 클릭을 반복하게 됩니다.

ButtonisLoading prop을 지원합니다. isLoading을 쓰면 스피너 표시와 disabled 처리가 함께 적용됩니다.

♻️ 제안 수정
           size="small"
           aria-label="개인 설정 변경사항 저장 버튼"
           onClick={handleSave}
-          disabled={!hasChanges || isLoading || isNotificationSectionLoading}
+          isLoading={isSaving}
+          disabled={!hasChanges || isLoading || isNotificationSectionLoading}
           className="tablet:w-full"
         >
           {isSaving ? "저장 중..." : "저장"}
🤖 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 211 - 221, Update the save Button
in Setting.tsx to pass isSaving through its supported isLoading prop, so it
displays loading feedback and becomes disabled during saving. Preserve the
existing disabled conditions for other loading and change states.
src/components/common/dropdownmenu/DropdownMenu.tsx (1)

180-185: 🚀 Performance & Scalability | 🔵 Trivial | ⚡ Quick win

스크롤 위치 계산을 requestAnimationFrame으로 합쳐 주세요.

Line 180-185에서 모든 capture-phase scroll 이벤트마다 getBoundingClientRect() 기반 계산과 상태 setter 호출이 실행됩니다. src/components/timeline/TimelineBar.tsx:104-177처럼 타임라인에서 사용하는 메뉴는 스크롤 이벤트 빈도가 높을 수 있습니다. scroll, resize, ResizeObserver 콜백을 한 프레임당 한 번만 처리하면 불필요한 레이아웃 측정과 UI 끊김 위험을 줄일 수 있습니다. cleanup에서는 예약된 프레임도 cancelAnimationFrame으로 취소해 주세요.

제안 코드
     const updatePosition = () => {
       if (placement === "bottom") {
         setResolvedPlacement("bottom");
       } else if (placement === "top") {
         setResolvedPlacement("top");
       } else {
         setResolvedPlacement(resolveAutoPlacement(el, items.length));
       }

       if (!fullWidth) {
         setHorizontalAlign(resolveHorizontalAlign(el));
       } else {
         setHorizontalAlign("right");
       }
     };

+    let frameId: number | null = null;
+    const schedulePositionUpdate = () => {
+      if (frameId !== null) return;
+      frameId = requestAnimationFrame(() => {
+        frameId = null;
+        updatePosition();
+      });
+    };
+
     updatePosition();

-    window.addEventListener("resize", updatePosition);
-    window.addEventListener("scroll", updatePosition, true);
+    window.addEventListener("resize", schedulePositionUpdate);
+    window.addEventListener("scroll", schedulePositionUpdate, true);

-    const resizeObserver = new ResizeObserver(updatePosition);
+    const resizeObserver = new ResizeObserver(schedulePositionUpdate);
     resizeObserver.observe(el);

     return () => {
-      window.removeEventListener("resize", updatePosition);
-      window.removeEventListener("scroll", updatePosition, true);
+      window.removeEventListener("resize", schedulePositionUpdate);
+      window.removeEventListener("scroll", schedulePositionUpdate, true);
+      if (frameId !== null) cancelAnimationFrame(frameId);
       resizeObserver.disconnect();
     };
🤖 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/common/dropdownmenu/DropdownMenu.tsx` around lines 180 - 185,
Update the DropdownMenu position-update flow around updatePosition so scroll,
resize, and ResizeObserver callbacks schedule a single requestAnimationFrame per
frame instead of measuring and setting state immediately. Store the scheduled
frame handle, perform the existing getBoundingClientRect calculation and state
update inside the frame callback, and cancel any pending frame during cleanup
alongside removing listeners and disconnecting resizeObserver.
src/hooks/timeline/useTimelinePeriod.ts (1)

5-8: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

인터페이스 이름 오타를 정정해 주세요.

IUserTimelinePeriodParamsIUseTimelinePeriodParams가 맞습니다. 다른 훅 파라미터 타입(IUseTimelinePanelParams)과 명명이 어긋납니다.

♻️ 제안 수정
-interface IUserTimelinePeriodParams {
+interface IUseTimelinePeriodParams {
   scrollRef: RefObject<HTMLDivElement | null>;
   hasNoTimelines: boolean;
 }
 
 export function useTimelinePeriod({
   scrollRef,
   hasNoTimelines,
-}: IUserTimelinePeriodParams) {
+}: IUseTimelinePeriodParams) {
🤖 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/hooks/timeline/useTimelinePeriod.ts` around lines 5 - 8, Rename the
interface IUserTimelinePeriodParams to IUseTimelinePeriodParams and update every
reference to this type in the useTimelinePeriod hook so it matches the existing
IUseTimelinePanelParams naming convention.
src/hooks/timeline/useTimelinePanel.ts (2)

14-14: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

export 방식을 다른 타임라인 훅과 맞춰 주세요.

useTimelinePeriod, useTimelineEditModal, useTimelineSummaryPolling은 named export입니다. 이 훅만 default export라 Timeline.tsx의 import 문이 혼재합니다.

🤖 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/hooks/timeline/useTimelinePanel.ts` at line 14, Update useTimelinePanel
to use a named export instead of a default export, matching useTimelinePeriod,
useTimelineEditModal, and useTimelineSummaryPolling, and adjust Timeline.tsx to
import the hook using the named-export form.

17-26: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

서버 상태를 로컬 state로 복제하지 말고 파생값으로 계산하세요.

panelDatadetail에서 순수 변환으로 얻는 값입니다. 현재 구조는 useState + useEffect 조합이라 렌더가 한 번 더 발생하고, handleBarClick에서 setPanelData(null)로 수동 초기화하는 코드도 필요합니다. useMemo로 파생하면 상태 동기화 코드가 사라지고, 선택 바가 바뀌는 즉시 이전 패널 데이터가 남지 않습니다.

♻️ 제안 리팩터
-import { useEffect, useState } from "react";
+import { useMemo, useState } from "react";
@@
   const [isPanelOpen, setIsPanelOpen] = useState(false);
   const [selectedBarId, setSelectedBarId] = useState<number | null>(null);
-  const [panelData, setPanelData] = useState<ITimelineSummaryPanelData | null>(
-    null,
-  );
 
   const { data: detail } = useTimelineDetail(selectedBarId);
 
-  useEffect(() => {
-    if (!detail) return;
-    setPanelData(buildTimelineSummaryPanel(detail));
-  }, [detail]);
+  const panelData: ITimelineSummaryPanelData | null = useMemo(
+    () => (detail ? buildTimelineSummaryPanel(detail) : null),
+    [detail],
+  );
@@
   const handleBarClick = (bar: ITimelineCampaignBar) => {
     setSelectedBarId(bar.id);
-    setPanelData(null);
     setIsPanelOpen(true);
   };
As per path instructions: "Hook 사용: useEffect 의존성 배열 및 불필요한 사용 검토."
🤖 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/hooks/timeline/useTimelinePanel.ts` around lines 17 - 26, Replace the
panelData useState/useEffect synchronization with a useMemo-derived value based
on detail and buildTimelineSummaryPanel. Remove the related setPanelData(null)
reset from handleBarClick and update any remaining references to use the
memoized panelData value.

Source: Path instructions

src/components/timeline/TimelineCanvas.tsx (1)

58-66: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

기간 변경으로 바뀌는 빈 상태 안내에 라이브 리전을 추가해 주세요.

이 안내는 사용자가 기간이나 보기 단위를 바꿀 때 동적으로 나타납니다. 현재는 라이브 리전이 없어 스크린 리더가 변경을 알리지 않습니다. role="status"를 추가하면 변경 시점에 안내가 전달됩니다.

♻️ 제안 수정
-          <div className="flex min-h-0 flex-1 flex-col items-center justify-center gap-2 px-6 py-16 text-center">
+          <div
+            role="status"
+            className="flex min-h-0 flex-1 flex-col items-center justify-center gap-2 px-6 py-16 text-center"
+          >
As per path instructions: "접근성: 시맨틱 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/components/timeline/TimelineCanvas.tsx` around lines 58 - 66,
hasNoVisibleBars 빈 상태 안내 컨테이너에 role="status"를 추가해 기간 또는 보기 단위 변경으로 동적으로 표시될 때
스크린 리더에 내용이 전달되도록 수정하세요. 기존 메시지와 레이아웃은 그대로 유지하세요.

Source: Path instructions

src/hooks/timeline/useTimelineEditModal.ts (1)

36-39: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

조회 종료 시 로딩 토스트를 정리하세요.

sonner@2.0.7toast.loading에 고정 ID를 지정하세요. editTimelineId가 없거나 isEditDetailLoadingfalse가 되면 toast.dismiss(ID)로 토스트를 닫으세요.

🤖 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/hooks/timeline/useTimelineEditModal.ts` around lines 36 - 39, Update the
loading toast effect in useTimelineEditModal to use a fixed toast ID with
toast.loading, and dismiss that ID via toast.dismiss whenever editTimelineId is
absent or isEditDetailLoading becomes false. Preserve showing the loading toast
while a timeline edit detail request is active.
🤖 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/hooks/setting/useSettingNotifications.ts`:
- Around line 88-100: The buildOrgBody function in
src/hooks/setting/useSettingNotifications.ts lines 88-100 must stop implicitly
reading alertClicks and alertReport from savedWorkspaceNotif; require these
values as explicit inputs. Update the buildOrgBody call in
src/hooks/setting/useSettingSave.ts lines 112-142 to pass
notifications.draftWorkspaceNotif.clickAlarm and
notifications.draftWorkspaceNotif.weeklyReport explicitly, preserving the latest
values during the same save operation.
- Around line 160-169: Update handleConnectDiscord to parse the trimmed URL with
new URL() and require HTTPS with the expected Discord webhook hostname,
rejecting malformed URLs and any other host before saving or connecting. Match
the validation behavior used by handleConnectSlack and preserve the existing
error handling.

In `@src/hooks/timeline/useTimelinePeriod.ts`:
- Around line 17-22: Update the useTimelinePeriod call to receive the calculated
totalWidth, and add totalWidth to the scroll-position useEffect dependencies so
scrolling is recalculated when column widths change. Compute totalWidth before
invoking useTimelinePeriod while preserving the existing no-timeline and
viewUnit behavior.

---

Nitpick comments:
In `@src/components/common/dropdownmenu/DropdownMenu.tsx`:
- Around line 180-185: Update the DropdownMenu position-update flow around
updatePosition so scroll, resize, and ResizeObserver callbacks schedule a single
requestAnimationFrame per frame instead of measuring and setting state
immediately. Store the scheduled frame handle, perform the existing
getBoundingClientRect calculation and state update inside the frame callback,
and cancel any pending frame during cleanup alongside removing listeners and
disconnecting resizeObserver.

In `@src/components/timeline/TimelineCanvas.tsx`:
- Around line 58-66: hasNoVisibleBars 빈 상태 안내 컨테이너에 role="status"를 추가해 기간 또는 보기
단위 변경으로 동적으로 표시될 때 스크린 리더에 내용이 전달되도록 수정하세요. 기존 메시지와 레이아웃은 그대로 유지하세요.

In `@src/hooks/setting/useSettingProfile.ts`:
- Around line 68-92: Refactor the getMyInfo flow in useSettingProfile to use
useCoreQuery, exposing the fetched server data as savedProfile instead of
managing its loading and request lifecycle through useEffect and local state.
Keep draftProfile as local editable state, map the query data into the existing
profile shape, and use the query’s loading/error handling with the existing
toast behavior. Ensure profile synchronization after saving uses query
invalidation rather than applyAccountSaveSuccess.

In `@src/hooks/timeline/useTimelineEditModal.ts`:
- Around line 36-39: Update the loading toast effect in useTimelineEditModal to
use a fixed toast ID with toast.loading, and dismiss that ID via toast.dismiss
whenever editTimelineId is absent or isEditDetailLoading becomes false. Preserve
showing the loading toast while a timeline edit detail request is active.

In `@src/hooks/timeline/useTimelinePanel.ts`:
- Line 14: Update useTimelinePanel to use a named export instead of a default
export, matching useTimelinePeriod, useTimelineEditModal, and
useTimelineSummaryPolling, and adjust Timeline.tsx to import the hook using the
named-export form.
- Around line 17-26: Replace the panelData useState/useEffect synchronization
with a useMemo-derived value based on detail and buildTimelineSummaryPanel.
Remove the related setPanelData(null) reset from handleBarClick and update any
remaining references to use the memoized panelData value.

In `@src/hooks/timeline/useTimelinePeriod.ts`:
- Around line 5-8: Rename the interface IUserTimelinePeriodParams to
IUseTimelinePeriodParams and update every reference to this type in the
useTimelinePeriod hook so it matches the existing IUseTimelinePanelParams naming
convention.

In `@src/pages/setting/Setting.tsx`:
- Around line 211-221: Update the save Button in Setting.tsx to pass isSaving
through its supported isLoading prop, so it displays loading feedback and
becomes disabled during saving. Preserve the existing disabled conditions for
other loading and change states.
🪄 Autofix

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 Plus

Run ID: 6551169e-ecba-421b-8f67-d27d85137dcd

📥 Commits

Reviewing files that changed from the base of the PR and between 334201a and c87304d.

⛔ Files ignored due to path filters (1)
  • src/assets/icon/common/close.svg is excluded by !**/*.svg and included by src/**
📒 Files selected for processing (24)
  • src/components/common/dropdownmenu/DropdownMenu.tsx
  • src/components/landing/GuideWorkspace.tsx
  • src/components/setting/NotificationSection.tsx
  • src/components/setting/ProfileSection.tsx
  • src/components/timeline/TimelineBar.tsx
  • src/components/timeline/TimelineCanvas.tsx
  • src/components/timeline/TimelineDeleteModal.tsx
  • src/components/timeline/TimelineToolbar.tsx
  • src/components/workspace/InviteMemberModal.tsx
  • src/components/workspace/PermissionTable.tsx
  • src/hooks/auth/useLogout.ts
  • src/hooks/setting/useSettingNotifications.ts
  • src/hooks/setting/useSettingPassword.ts
  • src/hooks/setting/useSettingProfile.ts
  • src/hooks/setting/useSettingSave.ts
  • src/hooks/timeline/useTimelineEditModal.ts
  • src/hooks/timeline/useTimelinePanel.ts
  • src/hooks/timeline/useTimelinePeriod.ts
  • src/hooks/timeline/useTimelineSummaryPolling.ts
  • src/pages/dashboard/timeline/Timeline.tsx
  • src/pages/setting/Setting.tsx
  • src/pages/workspace/WorkspaceSetting.tsx
  • src/types/setting/settingPage.ts
  • src/types/workspace/workspace.ts

Comment thread src/hooks/setting/useSettingNotifications.ts
Comment thread src/hooks/setting/useSettingNotifications.ts
Comment thread src/hooks/timeline/useTimelinePeriod.ts
@jjjsun
jjjsun merged commit 922db0d into main Aug 12, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🌏 Deploy 배포 관련

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant