Skip to content

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

Merged
jjjsun merged 68 commits into
mainfrom
develop
Aug 3, 2026
Merged

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

Conversation

@jjjsun

@jjjsun jjjsun commented Aug 3, 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

  • 새로운 기능
    • 회원 탈퇴 확인 및 처리 기능이 설정에 추가되었습니다.
    • 초대 링크로 워크스페이스에 참여할 수 있습니다.
    • 역할과 화면에 맞춘 신규 사용자 온보딩 투어를 제공합니다.
    • 로그인·회원가입 후 원래 페이지로 안전하게 돌아갈 수 있습니다.
  • 개선
    • 대시보드 예산 게이지가 여러 예산과 잔여 금액을 표시합니다.
    • 트래픽 차트 높이와 로딩 화면이 화면 크기에 맞게 개선되었습니다.
    • 오류 메시지의 줄바꿈 표시와 툴팁 애니메이션이 개선되었습니다.

YermIm and others added 30 commits July 31, 2026 20:44
[Feature/#367] 로그인/회원가입 returnUrl 복귀 처리
YermIm and others added 20 commits August 2, 2026 23:28
[Feature/#312] 대시보드 예산 소진 UI 스펙 반영 (통합·플랫폼)
[Bugfix/#379] 회원가입 완료 후 로그인 페이지로 이동되지 않는 문제 해결
[Feature/#373] 최초 로그인 온보딩 투어 구현
[Feature/#382] 회원  탈퇴 UI 및 API 연동
@jjjsun
jjjsun requested review from Seojegyeong and YermIm August 3, 2026 11:48
@jjjsun jjjsun self-assigned this Aug 3, 2026
@jjjsun jjjsun added the 🌏 Deploy 배포 관련 label Aug 3, 2026
@coderabbitai

coderabbitai Bot commented Aug 3, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

인증 반환 경로와 초대 수락 흐름을 확장했습니다. 역할별 온보딩 투어와 계정 삭제 기능을 추가했습니다. 예산 게이지를 다중 구조로 변경하고, 대시보드 차트의 높이·로딩·오류 표시를 조정했습니다.

Changes

인증 및 워크스페이스 흐름

Layer / File(s) Summary
인증 반환 경로와 초대 수락
src/utils/auth/returnUrl.ts, src/pages/auth/*, src/routes/*, src/pages/workspace/InviteAcceptPage.tsx, src/api/workspace/org.ts
안전한 returnUrl 검증을 추가했습니다. 로그인·회원가입·인증 가드가 반환 경로를 유지합니다. 초대 토큰 검증과 수락 페이지 및 라우트를 추가했습니다.

온보딩과 계정 관리

Layer / File(s) Summary
역할별 온보딩 투어
src/hooks/common/useOnboardingTour.ts, src/components/common/*, src/layout/main/MainLayout.tsx, src/components/sidebar/Sidebar.tsx, src/pages/integration/PlatformIntegrationsPage.tsx, src/pages/workspace/Workspace.tsx, src/styles/utilities.css
역할별 Joyride 단계와 커스텀 툴팁을 추가했습니다. 주요 화면 요소에 투어 식별자를 연결했습니다.
계정 삭제 흐름
src/api/auth/auth.ts, src/hooks/auth/useDeleteMyAccount.ts, src/components/setting/WithdrawConfirmModal.tsx, src/pages/setting/Setting.tsx
계정 삭제 API와 mutation 훅을 추가했습니다. 설정 화면에 로딩 상태를 처리하는 확인 모달을 연결했습니다.

예산 및 차트

Layer / File(s) Summary
예산 데이터 모델과 변환
src/types/dashboard/*, src/utils/dashboard/budget.ts, src/hooks/dashboard/useBudget.ts
통합·플랫폼별 예산 응답 타입과 UI 변환 로직을 추가했습니다.
다중 예산 게이지 렌더링
src/components/dashboard/charts/BudgetGaugeChart.tsx, src/pages/dashboard/overview/sections/OverviewBudgetSection.tsx, src/components/dashboard/platform/*, src/components/dashboard/overview/skeleton/*
게이지가 여러 예산 항목을 렌더링하도록 변경했습니다. 단일·이중 게이지 레이아웃과 스켈레톤을 추가했습니다.
차트 크기와 오류 화면
src/constants/dashboard/trafficChartHeights.ts, src/components/dashboard/charts/TrafficChart.tsx, src/components/dashboard/platform/PlatformTrafficChart.tsx, src/components/common/error/ErrorLayout.tsx
차트 높이를 상수와 height·fillHeight 옵션으로 제어합니다. 오류·로딩·빈 데이터 화면이 동적 높이를 사용합니다. 오류 텍스트의 줄바꿈 렌더링도 조정했습니다.

Estimated code review effort: 4 (Complex) | ~60 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Visitor
  participant InviteAcceptPage
  participant Login
  participant acceptInvitaton
  participant Workspace
  Visitor->>InviteAcceptPage: 초대 링크 접속
  InviteAcceptPage->>Login: 미로그인 상태에서 returnUrl 포함 이동
  Login->>InviteAcceptPage: 인증 후 초대 페이지 복귀
  InviteAcceptPage->>acceptInvitaton: 초대 토큰으로 POST 요청
  acceptInvitaton-->>InviteAcceptPage: 초대 수락 응답 반환
  InviteAcceptPage->>Workspace: 선택된 워크스페이스 저장 후 대시보드 이동
Loading

Possibly related PRs

Suggested reviewers: seojegyeong, yermim

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Description check ⚠️ Warning 템플릿의 주요 섹션은 포함했지만, 실제 변경사항을 작업 내용에 작성하지 않고 N/A로 표시했습니다. 작업 내용에 예산 UI, returnUrl 처리, 초대 수락, 온보딩 투어, 회원 탈퇴 등 주요 변경사항을 구체적으로 작성해 주세요.
Docstring Coverage ⚠️ Warning Docstring coverage is 36.96% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed 제목이 develop 브랜치의 변경사항을 main 브랜치에 배포 반영한다는 PR 목적을 명확하게 설명합니다.
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: 7

Caution

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

⚠️ Outside diff range comments (1)
src/components/dashboard/charts/BudgetGaugeChart.tsx (1)

70-90: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

totalBudget이 0 이하일 때 상태 배지와 초과 문구가 서로 어긋납니다.

getSpentPercentagetotalBudget <= 0이면 항상 0을 반환합니다. 반면 isOverBudgetspent > totalBudget 원시값으로 별도 계산됩니다.

이 때문에 totalBudget이 0이고 spent가 0보다 큰 경우, 다음과 같은 모순이 발생합니다.

  • statusspentPct(0) 기준으로 계산되어 "안정" 배지가 표시됩니다.
  • 동시에 isOverBudget은 true이므로 "초과 금액" 문구(빨간색)와 "예산을 초과했습니다" 인사이트 문구가 함께 표시됩니다.

예산 모니터링 대시보드에서 상태 배지와 본문 텍스트가 반대 의미를 전달하면 사용자가 실제 위험도를 오판할 수 있습니다. 캠페인 예산을 0으로 낮췄지만 이전 지출 기록이 남아있는 경우 이 상황이 실제로 발생할 수 있습니다.

status 계산 시 isOverBudget을 우선 반영하도록 수정하세요.

🐛 제안하는 수정
-  const status = getBudgetStatus(spentPct, warningThreshold, dangerThreshold);
+  const status = isOverBudget
+    ? "위험"
+    : getBudgetStatus(spentPct, warningThreshold, dangerThreshold);
🤖 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/dashboard/charts/BudgetGaugeChart.tsx` around lines 70 - 90,
Update the status calculation in the budget gauge logic around getBudgetStatus
so isOverBudget takes precedence, including when totalBudget is zero or
negative. Ensure over-budget cases receive the corresponding danger/over-budget
status while preserving the existing percentage-based thresholds for
non-over-budget cases.
🧹 Nitpick comments (20)
src/pages/setting/Setting.tsx (1)

116-117: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚖️ Poor tradeoff

탈퇴 모달 상태를 Zustand store로 이동하세요.

isWithdrawModalOpen은 UI 상태입니다. 현재 useState로 관리합니다. 팀 상태 관리 규칙에 맞게 src/store/의 Zustand store에서 상태와 setter를 관리하세요.

As per coding guidelines: State management: UI state → Zustand (src/store/).

🤖 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 116 - 117, Move the
isWithdrawModalOpen state and its setter from the Setting component’s local
useState into an appropriate Zustand store under src/store/. Update Setting to
read and update this state through the store while preserving the existing modal
behavior.

Source: Coding guidelines

src/hooks/auth/useDeleteMyAccount.ts (1)

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

내부 import를 @/ alias로 통일하세요.

두 파일이 내부 모듈에 상대 경로를 사용합니다. alias 경로로 변경하세요.

  • src/hooks/auth/useDeleteMyAccount.ts#L7-L7: useCoreMutation import를 @/hooks/customQuery로 변경하세요.
  • src/components/setting/WithdrawConfirmModal.tsx#L1-L2: ButtonModal import를 @/components/common/... 경로로 변경하세요.

As per coding guidelines: Use @/ alias for all imports.

🤖 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/auth/useDeleteMyAccount.ts` at line 7, 통일된 내부 모듈 import를 위해
src/hooks/auth/useDeleteMyAccount.ts의 useCoreMutation import를
`@/hooks/customQuery로` 변경하고, src/components/setting/WithdrawConfirmModal.tsx의
Button 및 Modal import를 각각 `@/components/common/`... alias 경로로 변경하세요.

Source: Coding guidelines

src/routes/AuthRoutes.tsx (1)

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

로딩 대체 UI가 실제 페이지 화면과 다릅니다.

InviteAcceptPage는 전체 화면 스피너와 안내 문구를 렌더링합니다. 반면 fallback은 AuthFormSkeleton으로 입력 폼 형태입니다. 청크 로딩 중에는 폼 스켈레톤이 보이고, 로딩이 끝나면 스피너 화면으로 바뀝니다. 사용자에게 화면이 두 번 바뀌는 것처럼 보입니다. 초대 화면과 형태가 비슷한 대체 UI 또는 null을 쓰는 편이 더 자연스럽습니다.

🤖 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/routes/AuthRoutes.tsx` around lines 32 - 35, Update the fallback passed
to InviteAcceptPage’s loadable call so it matches the page’s full-screen
spinner/instruction layout, or use null instead of AuthFormSkeleton; preserve
the existing lazy import and route behavior.
src/api/workspace/org.ts (1)

159-166: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

함수명 오타와 토큰 인코딩을 함께 정리해 주세요.

두 가지가 눈에 걸립니다.

  1. 함수명이 acceptInvitaton으로 오타가 있습니다. 공개 API 함수이고 아직 호출부가 InviteAcceptPage.tsx 한 곳뿐이니 지금 바로잡는 편이 비용이 가장 낮습니다.
  2. token을 경로에 그대로 보간합니다. 토큰에 /, ?, # 같은 문자가 포함되면 요청 경로가 깨집니다. encodeURIComponent로 감싸 주세요.
♻️ 제안 수정
-export const acceptInvitaton = async (
+export const acceptInvitation = async (
   token: string,
 ): Promise<TAcceptInvitationResponse> => {
   const { data } = await axiosInstance.post<
     ICommonResponse<TAcceptInvitationResponse>
-  >(`/api/org/invitations/${token}`);
+  >(`/api/org/invitations/${encodeURIComponent(token)}`);
   return data.data;
 };

src/pages/workspace/InviteAcceptPage.tsx의 import와 useCoreMutation 인자도 함께 변경해야 합니다.

🤖 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/api/workspace/org.ts` around lines 159 - 166, Rename the public
acceptInvitaton function to acceptInvitation and update its import and
useCoreMutation reference in InviteAcceptPage.tsx. In acceptInvitation, wrap
token with encodeURIComponent before interpolating it into the invitation
request path.
src/pages/integration/PlatformIntegrationsPage.tsx (1)

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

현재 투어 스텝에 대응하는 타겟이 없습니다.

useOnboardingTourADMIN_STEPSMEMBER_STEPS에는 tour-platform-* 선택자가 없습니다. 이 속성은 지금은 사용되지 않습니다. 후속 스텝 추가를 위한 준비라면 그대로 두어도 됩니다. 계획이 없다면 제거하는 편이 명확합니다.

🤖 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/integration/PlatformIntegrationsPage.tsx` at line 205, Remove the
unused data-tour attribute from the integration item element in
PlatformIntegrationsPage, since useOnboardingTour’s ADMIN_STEPS and MEMBER_STEPS
define no matching tour-platform-* selectors. Keep the surrounding provider
rendering and item behavior unchanged.
src/components/common/OnboardingTooltip.tsx (1)

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

건너뛰기 버튼과 진행 표시를 조금 다듬어 주세요.

두 가지입니다.

  1. 건너뛰기 <button>type 속성이 없습니다. 기본값은 submit입니다. 지금은 폼 안이 아니라 동작에 문제가 없지만, 툴팁이 폼 위에 표시되는 경우를 대비해 type="button"을 지정해 주세요.
  2. {index + 1} / {size}는 스크린 리더에서 "1 슬래시 7"처럼 읽힙니다. aria-label로 의미를 보강해 주세요.
♿ 제안 수정
-          <span className="font-caption text-text-muted shrink-0 pt-1">
+          <span
+            className="font-caption text-text-muted shrink-0 pt-1"
+            aria-label={`전체 ${size}단계 중 ${index + 1}단계`}
+          >
             {index + 1} / {size}
           </span>
             <button
               {...skipProps}
+              type="button"
               className="font-body2 text-text-muted hover:text-text-body transition-colors duration-150"
             >

skipPropstype을 직접 전달하는지 확인하고, 전달한다면 스프레드 순서를 조정해 주세요.

Also applies to: 42-50

🤖 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/OnboardingTooltip.tsx` around lines 31 - 33, Update the
skip button in OnboardingTooltip to explicitly use type="button", ensuring
skipProps cannot override it by placing the explicit type after the spread if
needed. Add an aria-label to the progress indicator containing the current step
and total size so screen readers announce its meaning clearly.
src/hooks/common/useOnboardingTour.ts (2)

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

온보딩 저장소 키를 공유 상수로 만들어 주세요. 두 파일이 같은 localStorage"hasSeenOnboarding"을 각각 따로 참조합니다. 한쪽만 값을 바꾸면 쓰기와 읽기가 어긋나서 온보딩이 매번 다시 시작되거나 영구히 표시되지 않습니다.

  • src/hooks/common/useOnboardingTour.ts#L7-L7: ONBOARDING_KEYexport하거나 공용 상수 모듈로 옮겨 주세요.
  • src/layout/main/MainLayout.tsx#L161-L166: 문자열 리터럴 "hasSeenOnboarding" 대신 공유 상수를 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/common/useOnboardingTour.ts` at line 7, Make ONBOARDING_KEY in
src/hooks/common/useOnboardingTour.ts a shared exported constant, or move it to
a common constants module. In src/layout/main/MainLayout.tsx at lines 161-166,
import and use that shared constant instead of the "hasSeenOnboarding" string
literal so both localStorage reads and writes use the same key.

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

중복된 삼항 분기를 정리해 주세요.

myRole === "ADMIN"일 때와 그 외 기본값이 모두 ADMIN_STEPS입니다. 분기가 하나 필요 없습니다.

♻️ 제안 수정
-  const steps =
-    myRole === "MEMBER"
-      ? MEMBER_STEPS
-      : myRole === "ADMIN"
-        ? ADMIN_STEPS
-        : ADMIN_STEPS;
+  const steps = myRole === "MEMBER" ? MEMBER_STEPS : ADMIN_STEPS;

ADMIN_STEPSMEMBER_STEPS는 앞의 네 스텝이 거의 동일합니다. 공통 스텝을 배열로 뽑아 재사용하는 방법도 검토해 주세요.

🤖 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/common/useOnboardingTour.ts` around lines 135 - 140, In the steps
selection near MEMBER_STEPS and ADMIN_STEPS, remove the redundant ADMIN
comparison and use a single MEMBER_STEPS-versus-ADMIN_STEPS conditional with
ADMIN_STEPS as the fallback. Optionally extract the shared leading steps into a
reusable array only if it can be done without expanding the change beyond this
cleanup.
src/pages/workspace/InviteAcceptPage.tsx (2)

29-78: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

에러 분류를 메시지 문자열 대신 코드 기준으로 정리하는 편이 안전합니다.

현재 getInviteErrorCopymessage의 한국어/영어 부분 문자열까지 검사합니다. 서버 문구가 바뀌면 분류가 조용히 어긋납니다. 예를 들어 codeEMAIL을 포함하지 않는데 메시지에 "이메일"이라는 단어만 들어 있어도 이메일 불일치 화면이 나옵니다. 서버 에러 코드 목록을 확정하고 코드 기준 매핑 테이블로 바꾸는 방향을 권합니다. 메시지 검사는 최종 fallback으로만 남겨 두세요.

지금 fallback이 있어 화면이 깨지지는 않습니다. 후속 작업으로 진행해도 됩니다.

🤖 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/workspace/InviteAcceptPage.tsx` around lines 29 - 78, Update
getInviteErrorCopy to classify invitation errors primarily through an explicit
mapping of confirmed server error codes, removing message substring checks from
the expired, already-completed, and email-mismatch branches. Retain the existing
message-based text only as the final fallback for otherwise unrecognized errors,
and preserve the current Korean title and description for each mapped category.

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

렌더 단계의 acceptInviteRef.current = acceptInvite;를 정리해 주세요.

mutate 참조는 그대로 사용해도 됩니다. 렌더 본문에서 변경은 피해 보기 위해 ref 갱신을 관련 effect 안으로 옮기는 것만 고려하면 됩니다.

♻️ 제안 수정
-  const aceptInviteRef = useRef(acceptInvite);
-  acceptInviteRef.current = acceptInvite;

+  const acceptInviteRef = useRef(acceptInvite);
+  useEffect(() => {
+    acceptInviteRef.current = acceptInvite;
+  }, [acceptInvite]);
🤖 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/workspace/InviteAcceptPage.tsx` around lines 115 - 116, Move the
acceptInviteRef.current assignment out of the render body and into the relevant
effect in InviteAcceptPage, while continuing to use the existing mutate
reference unchanged.
src/layout/main/MainLayout.tsx (1)

161-166: 🚀 Performance & Scalability | 🔵 Trivial | 💤 Low value

렌더 본문에서 localStorage를 직접 읽습니다.

MainLayoutheaderRight, campaignDetailHeaderTitle 등 로컬 상태 때문에 자주 리렌더됩니다. 그때마다 localStorage.getItem이 동기로 실행됩니다. 값은 마운트 시점에 한 번만 필요하므로 useState 초기화 함수로 한 번만 읽는 편이 낫습니다.

♻️ 제안 수정
+  const [shouldAutoStartTour] = useState(
+    () => !localStorage.getItem(ONBOARDING_STORAGE_KEY),
+  );
       {(myRole !== null ||
         (workspaces !== undefined && workspaces.length === 0)) && (
-        <OnboardingTour
-          autoStart={!localStorage.getItem("hasSeenOnboarding")}
-        />
+        <OnboardingTour autoStart={shouldAutoStartTour} />
       )}

키 리터럴 중복은 별도 코멘트에서 함께 다룹니다.

🤖 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/layout/main/MainLayout.tsx` around lines 161 - 166, Update MainLayout’s
onboarding state handling so localStorage.getItem is called once through a
useState initializer during mount, then pass the stored value to
OnboardingTour’s autoStart without reading localStorage in the render body. Keep
the existing onboarding condition unchanged.
src/components/dashboard/platform/SinglePlatformView.tsx (1)

210-245: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

오류 메시지에 라이브 리전 속성이 없습니다.

Line 217-219의 오류 문구는 로딩 완료 후 동적으로 나타납니다. 스크린 리더 사용자는 이 변경을 인지하지 못합니다. role="alert"를 추가하면 상태 변경이 전달됩니다. 빈 데이터 문구(Line 242-244)에는 role="status"가 적합합니다.

♿ 제안 수정
               ) : isBudgetError ? (
-                <div className="flex flex-1 items-center justify-center px-4 py-4 text-center font-body2 text-info-red">
+                <div
+                  role="alert"
+                  className="flex flex-1 items-center justify-center px-4 py-4 text-center font-body2 text-info-red"
+                >
                   예산 데이터를 불러오지 못했습니다.
                 </div>

근거: "접근성: 시맨틱 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/dashboard/platform/SinglePlatformView.tsx` around lines 210 -
245, Update the budget error message container in the isBudgetError branch to
include role="alert", and add role="status" to the empty-data message container
in the final fallback branch. Keep the existing messages, styling, and rendering
conditions unchanged.

Source: Path instructions

src/components/dashboard/platform/PlatformTrafficChart.tsx (3)

285-294: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

useEffect는 초기 렌더에서 상태를 다시 설정합니다.

chartHeightisHeightReady의 초기값(Line 105-108)이 이미 fillHeight를 반영합니다. 이 effect는 마운트 시 같은 값을 다시 설정합니다. fillHeightSinglePlatformView에서 platform으로 결정되므로 컴포넌트 수명 동안 바뀌지 않습니다. 실질적으로 동작하지 않는 effect입니다.

fillHeight 변경에 대응하려면 effect보다 key prop 또는 렌더 중 파생 계산이 더 명확합니다. effect를 제거하고 초기값만 유지하는 방안을 검토해 주세요.

근거: 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/components/dashboard/platform/PlatformTrafficChart.tsx` around lines 285
- 294, Remove the fillHeight synchronization useEffect and its state-reset
logic, since the initial chartHeight and isHeightReady state already derive from
fillHeight and fillHeight remains stable for the component lifetime. Preserve
the existing initial-state behavior and avoid replacing it with another effect.

Source: Path instructions


372-410: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

오류 화면과 빈 데이터 화면에 라이브 리전 속성이 없습니다.

Line 372의 오류 화면과 Line 402의 빈 데이터 화면은 데이터 상태 변경에 따라 동적으로 나타납니다. 스크린 리더 사용자는 이 변경을 인지하지 못합니다. 차트 영역에는 role="group"aria-label을 추가하셨습니다(Line 431-432). 같은 수준으로 상태 화면도 처리해 주세요. 오류 화면에는 role="alert", 빈 데이터 화면에는 role="status"가 적합합니다.

Line 396의 Skeleton은 장식 요소이므로 aria-hidden="true"를 고려해 주세요.

근거: 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/dashboard/platform/PlatformTrafficChart.tsx` around lines 372
- 410, Update the error state returned by the PlatformTrafficChart component to
include role="alert", and update the empty timeSeriesData state to include
role="status", preserving their existing labels and content. Mark the Skeleton
shown while data is unavailable with aria-hidden="true" because it is
decorative.

Source: Path instructions


176-184: 🚀 Performance & Scalability | 🔵 Trivial | ⚡ Quick win

chartOptionsseries가 매 렌더마다 새 객체로 생성됩니다.

이 컴포넌트는 memo로 감싸져 있습니다. 그러나 chartOptions(Line 176)와 series(Line 267)는 렌더마다 새 객체입니다. 호버, 포커스, 높이 갱신 같은 내부 상태 변경이 발생하면 ReactApexChart가 새 참조를 받아 차트를 다시 계산합니다. fillHeight 모드에서는 ResizeObserver가 상태를 갱신하므로 영향이 더 큽니다.

useMemo로 감싸면 불필요한 재계산을 줄일 수 있습니다. 의존성은 platformColor, xMin, xMax, yMax, anomalyTimestamp, anomalyY, fillHeight, seriesData입니다.

근거: path instructions "성능: 불필요한 리렌더링 체크. React.memo, useCallback 사용 검토".

🤖 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/dashboard/platform/PlatformTrafficChart.tsx` around lines 176
- 184, Memoize the chartOptions object and series value in PlatformTrafficChart
using useMemo to keep stable references across renders. Include platformColor,
xMin, xMax, yMax, anomalyTimestamp, anomalyY, fillHeight, and seriesData in the
relevant dependency arrays, while preserving the existing chart configuration
and series contents.

Source: Path instructions

src/components/dashboard/platform/skeleton/PlatformSkeleton.tsx (2)

149-167: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Platform* 스켈레톤을 Overview 도메인이 직접 import합니다.

src/components/dashboard/overview/skeleton/OverviewSkeleton.tsxOverviewBudgetGaugeSkeletonPlatformDualBudgetGaugeSkeleton을 재사용합니다. 이름은 platform 도메인 전용을 뜻하지만 실제로는 공용입니다. overview → platform 방향의 도메인 간 의존이 생깁니다.

예산 게이지 스켈레톤을 공용 위치(예: components/common/skeleton/ 또는 components/dashboard/charts/skeleton/)로 옮기고 BudgetGaugeSkeleton 계열 이름을 쓰는 방식을 검토해 주세요. 동작 변경은 없습니다.

근거: 코딩 가이드라인 "Reusable components (buttons, inputs, modals, cards) prioritize components/common/. Add to domain folder only if not available."

🤖 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/dashboard/platform/skeleton/PlatformSkeleton.tsx` around lines
149 - 167, Move the reusable PlatformDualBudgetGaugeSkeleton and related budget
gauge skeleton components out of the platform-specific module into an
appropriate shared skeleton location, renaming them to the BudgetGaugeSkeleton
naming family. Update OverviewBudgetGaugeSkeleton and all other consumers to
import the shared symbols, preserving the existing rendering and layout
behavior.

Source: Coding guidelines


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

두 스켈레톤의 마크업이 거의 동일합니다.

PlatformBudgetGaugeCompactSkeletonPlatformSingleBudgetGaugeSkeleton은 헤더, 진행률 바, 양끝 수치, 인사이트 영역 구조가 같습니다. 차이는 간격 클래스(mb-3mb-6)와 헤더 구성뿐입니다. compact 플래그를 받는 단일 컴포넌트로 합치면 게이지 레이아웃 변경 시 한 곳만 수정하면 됩니다. 지금 단계에서는 선택 사항입니다.

Also applies to: 112-147

🤖 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/dashboard/platform/skeleton/PlatformSkeleton.tsx` around lines
70 - 109, Consolidate PlatformBudgetGaugeCompactSkeleton and
PlatformSingleBudgetGaugeSkeleton into one shared skeleton component with a
compact option. Reuse the common header, progress bar, endpoint values, and
insight markup, while preserving the existing header differences and mb-3 versus
mb-6 spacing through the option. Update callers to use the unified component.
src/utils/dashboard/budget.ts (1)

125-140: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

SHOW_BUDGET_GAUGE_INSIGHT 상수가 사용되지 않습니다.

Line 16에서 SHOW_BUDGET_GAUGE_INSIGHT를 정의하고 toGaugeProps의 기본값으로 사용합니다. 그런데 Line 133은 showInsight: true를 하드코딩합니다. 상수를 바꿔도 실제 동작은 변하지 않습니다. 상수를 전달하거나 showInsight 지정을 제거해 기본값을 사용하세요.

반환 타입도 명시하면 IBudgetQueryData와의 계약 이탈을 컴파일 시점에 잡을 수 있습니다.

♻️ 제안 리팩터
-export function toBudgetQueryData(
-  data: IBudgetResponse,
-  provider?: TProviderType,
-) {
+export function toBudgetQueryData(
+  data: IBudgetResponse,
+  provider?: TProviderType,
+): IBudgetQueryData {
   const viewModel = mapBudgetResponseToViewModel(data, provider);
   const isCompact = viewModel.slices.length > 1;
 
   const gauges = viewModel.slices.map((slice) =>
-    toGaugeProps(slice, { compact: isCompact, showInsight: true }),
+    toGaugeProps(slice, {
+      compact: isCompact,
+      showInsight: SHOW_BUDGET_GAUGE_INSIGHT,
+    }),
   );

IBudgetQueryData를 타입 import에 추가해 주세요.

import type {
  IBudgetGaugeProps,
  IBudgetQueryData,
  IBudgetSlice,
  IBudgetViewModel,
} from "`@/types/dashboard/budget`";

근거: "타입 안정성: TypeScript 타입의 명확성 확인".

🤖 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/utils/dashboard/budget.ts` around lines 125 - 140, Update
toBudgetQueryData to use the existing SHOW_BUDGET_GAUGE_INSIGHT constant instead
of hardcoding showInsight: true, or omit the option to rely on toGaugeProps
defaults. Add IBudgetQueryData to the type imports and annotate
toBudgetQueryData’s return type as IBudgetQueryData.

Source: Path instructions

src/types/dashboard/budget.ts (1)

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

라벨 유니온이 표시 문자열과 결합되어 있습니다.

TBudgetGaugeLabel은 화면에 그대로 출력되는 한국어 문자열입니다. BudgetGaugeChart.tsxisBudgetTypeLabel도 이 문자열을 직접 비교합니다. 지금은 동작에 문제가 없습니다. 다국어 지원이나 라벨 문구 변경이 생기면 타입과 비교 로직을 함께 수정해야 합니다. 식별자 키(예: "LIFETIME" | "DAILY" | "GOOGLE_META" | "NAVER")와 표시 문자열 맵을 분리하는 방식을 검토해 주세요. 지금 단계에서는 선택 사항입니다.

🤖 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/types/dashboard/budget.ts` around lines 1 - 13, 분류 식별자와 화면 표시 문자열이 결합된
TBudgetGaugeLabel을 분리해 유지보수성을 높이세요. TBudgetGaugeLabel은 안정적인 키 값만 포함하도록 변경하고, 표시
문자열은 별도의 라벨 맵에서 관리하며 BudgetGaugeChart.tsx의 isBudgetTypeLabel 비교도 해당 키를 사용하도록
갱신하세요.
src/hooks/dashboard/useBudget.ts (1)

1-11: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

TProviderType는 정의 위치로 가져오세요.

src/hooks/dashboard/useBudget.ts@/types/dashboard/provider가 직접 사용하는 곳에서 TProviderType@/types/dashboard/provider에서 가져오세요. overview.ts에서도 re-export하고 있지만, 정의 파일 경로로 통일해야 나중에 재내보내기를 제거할 때 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/dashboard/useBudget.ts` around lines 1 - 11, Update the
TProviderType import in useBudget.ts to use the defining
"`@/types/dashboard/provider`" module instead of "`@/types/dashboard/overview`", and
apply the same direct import path in any direct consumers such as overview.ts.
Leave unrelated type imports unchanged.
🤖 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/common/OnboardingTour.tsx`:
- Around line 21-33: Update the redirect conditions in the OnboardingTour
useEffect so myRole === null is treated as a loading state and never triggers
navigation. Only redirect once the role is resolved; if empty-workspace
onboarding is required, pass an explicit prop representing an empty workspace
list and use that instead. Keep the existing ADMIN and MEMBER redirects and
ensure the dependency array includes any new prop used.

In `@src/components/dashboard/platform/PlatformTrafficChart.tsx`:
- Around line 298-322: Update the updateHeight callback in the useLayoutEffect
to validate the raw measured height before applying Math.max, so zero or
non-positive measurements do not update chart state. Consolidate the 300px
minimum currently represented by MIN_CHART_HEIGHT and fillContainerClassName’s
min-h-75 into one source of truth, and use that shared value for both the
JavaScript clamp and container styling.

In `@src/components/sidebar/Sidebar.tsx`:
- Around line 209-212: Align the role-specific tour targets with the menus
rendered by Sidebar.tsx after filterNavByRole(). Verify that
MEMBER_STEPS.tour-workspace and ADMIN_STEPS.tour-integrations reference items
actually available to their respective roles, updating the data-tour assignment
or splitting/skipping steps by role as needed.

In `@src/hooks/common/useOnboardingTour.ts`:
- Around line 123-133: Update handleEvent so EVENTS.TARGET_NOT_FOUND only stops
the tour and does not write ONBOARDING_KEY to localStorage; persist the
completion flag exclusively when status is STATUS.FINISHED or STATUS.SKIPPED.

In `@src/pages/auth/Login.tsx`:
- Around line 46-50: Update the onboarding completion check in Login.tsx (lines
46-50) and RedirectPage.tsx (lines 43-47) to use a user-specific server
completion state or storage key containing the authenticated user identifier
before choosing the /workspace redirect. Apply the same user-scoped behavior in
both login flows and preserve the existing safe return URL handling for users
who have completed onboarding.

In `@src/pages/workspace/InviteAcceptPage.tsx`:
- Around line 199-213: Update the status 안내 containers in the needLogin and
loading views to use role="status" with aria-live="polite" so screen readers
announce state changes. Keep countdown numbers from being announced every second
by applying aria-hidden to the numeric countdown portion while leaving the
surrounding 안내 text live.

In `@src/utils/dashboard/budget.ts`:
- Around line 89-105: Unify gauge-count decisions around the view model: in
src/utils/dashboard/budget.ts lines 89-105, update mapPlatformBudgetViewModel to
create the daily slice only when data.daily exists, passing data.daily directly
without the toAmountSlice fallback; in
src/components/dashboard/platform/SinglePlatformView.tsx line 91, use
budgetData.gauges.length > 1 for the rendered layout while retaining
supportsDailyBudget(platform) only for pre-data skeleton selection.

---

Outside diff comments:
In `@src/components/dashboard/charts/BudgetGaugeChart.tsx`:
- Around line 70-90: Update the status calculation in the budget gauge logic
around getBudgetStatus so isOverBudget takes precedence, including when
totalBudget is zero or negative. Ensure over-budget cases receive the
corresponding danger/over-budget status while preserving the existing
percentage-based thresholds for non-over-budget cases.

---

Nitpick comments:
In `@src/api/workspace/org.ts`:
- Around line 159-166: Rename the public acceptInvitaton function to
acceptInvitation and update its import and useCoreMutation reference in
InviteAcceptPage.tsx. In acceptInvitation, wrap token with encodeURIComponent
before interpolating it into the invitation request path.

In `@src/components/common/OnboardingTooltip.tsx`:
- Around line 31-33: Update the skip button in OnboardingTooltip to explicitly
use type="button", ensuring skipProps cannot override it by placing the explicit
type after the spread if needed. Add an aria-label to the progress indicator
containing the current step and total size so screen readers announce its
meaning clearly.

In `@src/components/dashboard/platform/PlatformTrafficChart.tsx`:
- Around line 285-294: Remove the fillHeight synchronization useEffect and its
state-reset logic, since the initial chartHeight and isHeightReady state already
derive from fillHeight and fillHeight remains stable for the component lifetime.
Preserve the existing initial-state behavior and avoid replacing it with another
effect.
- Around line 372-410: Update the error state returned by the
PlatformTrafficChart component to include role="alert", and update the empty
timeSeriesData state to include role="status", preserving their existing labels
and content. Mark the Skeleton shown while data is unavailable with
aria-hidden="true" because it is decorative.
- Around line 176-184: Memoize the chartOptions object and series value in
PlatformTrafficChart using useMemo to keep stable references across renders.
Include platformColor, xMin, xMax, yMax, anomalyTimestamp, anomalyY, fillHeight,
and seriesData in the relevant dependency arrays, while preserving the existing
chart configuration and series contents.

In `@src/components/dashboard/platform/SinglePlatformView.tsx`:
- Around line 210-245: Update the budget error message container in the
isBudgetError branch to include role="alert", and add role="status" to the
empty-data message container in the final fallback branch. Keep the existing
messages, styling, and rendering conditions unchanged.

In `@src/components/dashboard/platform/skeleton/PlatformSkeleton.tsx`:
- Around line 149-167: Move the reusable PlatformDualBudgetGaugeSkeleton and
related budget gauge skeleton components out of the platform-specific module
into an appropriate shared skeleton location, renaming them to the
BudgetGaugeSkeleton naming family. Update OverviewBudgetGaugeSkeleton and all
other consumers to import the shared symbols, preserving the existing rendering
and layout behavior.
- Around line 70-109: Consolidate PlatformBudgetGaugeCompactSkeleton and
PlatformSingleBudgetGaugeSkeleton into one shared skeleton component with a
compact option. Reuse the common header, progress bar, endpoint values, and
insight markup, while preserving the existing header differences and mb-3 versus
mb-6 spacing through the option. Update callers to use the unified component.

In `@src/hooks/auth/useDeleteMyAccount.ts`:
- Line 7: 통일된 내부 모듈 import를 위해 src/hooks/auth/useDeleteMyAccount.ts의
useCoreMutation import를 `@/hooks/customQuery로` 변경하고,
src/components/setting/WithdrawConfirmModal.tsx의 Button 및 Modal import를 각각
`@/components/common/`... alias 경로로 변경하세요.

In `@src/hooks/common/useOnboardingTour.ts`:
- Line 7: Make ONBOARDING_KEY in src/hooks/common/useOnboardingTour.ts a shared
exported constant, or move it to a common constants module. In
src/layout/main/MainLayout.tsx at lines 161-166, import and use that shared
constant instead of the "hasSeenOnboarding" string literal so both localStorage
reads and writes use the same key.
- Around line 135-140: In the steps selection near MEMBER_STEPS and ADMIN_STEPS,
remove the redundant ADMIN comparison and use a single
MEMBER_STEPS-versus-ADMIN_STEPS conditional with ADMIN_STEPS as the fallback.
Optionally extract the shared leading steps into a reusable array only if it can
be done without expanding the change beyond this cleanup.

In `@src/hooks/dashboard/useBudget.ts`:
- Around line 1-11: Update the TProviderType import in useBudget.ts to use the
defining "`@/types/dashboard/provider`" module instead of
"`@/types/dashboard/overview`", and apply the same direct import path in any
direct consumers such as overview.ts. Leave unrelated type imports unchanged.

In `@src/layout/main/MainLayout.tsx`:
- Around line 161-166: Update MainLayout’s onboarding state handling so
localStorage.getItem is called once through a useState initializer during mount,
then pass the stored value to OnboardingTour’s autoStart without reading
localStorage in the render body. Keep the existing onboarding condition
unchanged.

In `@src/pages/integration/PlatformIntegrationsPage.tsx`:
- Line 205: Remove the unused data-tour attribute from the integration item
element in PlatformIntegrationsPage, since useOnboardingTour’s ADMIN_STEPS and
MEMBER_STEPS define no matching tour-platform-* selectors. Keep the surrounding
provider rendering and item behavior unchanged.

In `@src/pages/setting/Setting.tsx`:
- Around line 116-117: Move the isWithdrawModalOpen state and its setter from
the Setting component’s local useState into an appropriate Zustand store under
src/store/. Update Setting to read and update this state through the store while
preserving the existing modal behavior.

In `@src/pages/workspace/InviteAcceptPage.tsx`:
- Around line 29-78: Update getInviteErrorCopy to classify invitation errors
primarily through an explicit mapping of confirmed server error codes, removing
message substring checks from the expired, already-completed, and email-mismatch
branches. Retain the existing message-based text only as the final fallback for
otherwise unrecognized errors, and preserve the current Korean title and
description for each mapped category.
- Around line 115-116: Move the acceptInviteRef.current assignment out of the
render body and into the relevant effect in InviteAcceptPage, while continuing
to use the existing mutate reference unchanged.

In `@src/routes/AuthRoutes.tsx`:
- Around line 32-35: Update the fallback passed to InviteAcceptPage’s loadable
call so it matches the page’s full-screen spinner/instruction layout, or use
null instead of AuthFormSkeleton; preserve the existing lazy import and route
behavior.

In `@src/types/dashboard/budget.ts`:
- Around line 1-13: 분류 식별자와 화면 표시 문자열이 결합된 TBudgetGaugeLabel을 분리해 유지보수성을 높이세요.
TBudgetGaugeLabel은 안정적인 키 값만 포함하도록 변경하고, 표시 문자열은 별도의 라벨 맵에서 관리하며
BudgetGaugeChart.tsx의 isBudgetTypeLabel 비교도 해당 키를 사용하도록 갱신하세요.

In `@src/utils/dashboard/budget.ts`:
- Around line 125-140: Update toBudgetQueryData to use the existing
SHOW_BUDGET_GAUGE_INSIGHT constant instead of hardcoding showInsight: true, or
omit the option to rely on toGaugeProps defaults. Add IBudgetQueryData to the
type imports and annotate toBudgetQueryData’s return type as IBudgetQueryData.
🪄 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 Plus

Run ID: ff53c87b-2d83-47e7-ae77-732a1a4bcf19

📥 Commits

Reviewing files that changed from the base of the PR and between cfac7e6 and 03d8e42.

⛔ Files ignored due to path filters (2)
  • package.json is excluded by none and included by none
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml, !pnpm-lock.yaml and included by none
📒 Files selected for processing (39)
  • src/api/auth/auth.ts
  • src/api/workspace/org.ts
  • src/components/auth/flows/signup/ProfileSetupStep.tsx
  • src/components/common/OnboardingTooltip.tsx
  • src/components/common/OnboardingTour.tsx
  • src/components/common/error/ErrorLayout.tsx
  • src/components/dashboard/charts/BudgetGaugeChart.tsx
  • src/components/dashboard/charts/TrafficChart.tsx
  • src/components/dashboard/charts/trafficChart.config.ts
  • src/components/dashboard/overview/skeleton/OverviewSkeleton.tsx
  • src/components/dashboard/platform/PlatformTrafficChart.tsx
  • src/components/dashboard/platform/SinglePlatformView.tsx
  • src/components/dashboard/platform/skeleton/PlatformSkeleton.tsx
  • src/components/setting/WithdrawConfirmModal.tsx
  • src/components/sidebar/Sidebar.tsx
  • src/constants/dashboard/trafficChartHeights.ts
  • src/hooks/auth/useDeleteMyAccount.ts
  • src/hooks/auth/useSocialLogin.ts
  • src/hooks/common/useOnboardingTour.ts
  • src/hooks/dashboard/useBudget.ts
  • src/layout/main/MainLayout.tsx
  • src/pages/auth/Login.tsx
  • src/pages/auth/RedirectPage.tsx
  • src/pages/auth/Signup.tsx
  • src/pages/dashboard/overview/OverviewDashboard.tsx
  • src/pages/dashboard/overview/sections/OverviewBudgetSection.tsx
  • src/pages/dashboard/overview/sections/OverviewKpiSection.tsx
  • src/pages/integration/PlatformIntegrationsPage.tsx
  • src/pages/setting/Setting.tsx
  • src/pages/workspace/InviteAcceptPage.tsx
  • src/pages/workspace/Workspace.tsx
  • src/routes/AuthRoutes.tsx
  • src/routes/Router.tsx
  • src/styles/utilities.css
  • src/types/dashboard/budget.ts
  • src/types/dashboard/common.ts
  • src/types/workspace/workspace.ts
  • src/utils/auth/returnUrl.ts
  • src/utils/dashboard/budget.ts
💤 Files with no reviewable changes (1)
  • src/pages/dashboard/overview/OverviewDashboard.tsx

Comment thread src/components/common/OnboardingTour.tsx
Comment thread src/components/dashboard/platform/PlatformTrafficChart.tsx
Comment thread src/components/sidebar/Sidebar.tsx
Comment thread src/hooks/common/useOnboardingTour.ts
Comment thread src/pages/auth/Login.tsx
Comment thread src/pages/workspace/InviteAcceptPage.tsx
Comment thread src/utils/dashboard/budget.ts
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.

3 participants