Skip to content

[✨ Feature/300] 대시보드 삭제 버튼 + api 연결 #309

Merged
jung518 merged 126 commits intomainfrom
feature/300/editpage-deletebutton
Dec 2, 2025
Merged

[✨ Feature/300] 대시보드 삭제 버튼 + api 연결 #309
jung518 merged 126 commits intomainfrom
feature/300/editpage-deletebutton

Conversation

@jung518
Copy link
Contributor

@jung518 jung518 commented Dec 1, 2025

✅ PR 체크리스트

1. 코드 & 기능

  • 변수/함수 이름 이해 가능한지
  • 기능 정상 동작 & 콘솔 에러 없음

2. UI

  • UI 동작 및 레이아웃 확인

3. 컨벤션

  • 팀 컨벤션에 맞게 함수 이름을 정의했는지

🔗 이슈 번호

✨ 작업한 내용

대시보드 삭제 버튼 + api 연결

💁 리뷰 요청 / 코멘트

새로고침을 해야 사이드바 목록 변경사항이 반영되는데 이 부분은 어떻게 해야 할지 고민입니다.
사이드바 목록

💡 참고사항

Summary by CodeRabbit

  • 새 기능
    • 대시보드 삭제 흐름이 개선되어, 삭제 전에 확인 모달이 표시되어 의도치 않은 삭제를 방지합니다.
    • 확인 시 서버에 삭제 요청이 전송되고 삭제 완료 후 대시보드 목록 페이지로 이동합니다.

✏️ Tip: 리뷰 설정에서 이 요약을 사용자화할 수 있습니다.

apple added 30 commits November 20, 2025 15:18
@jung518 jung518 self-assigned this Dec 1, 2025
@jung518 jung518 added the ✨ Feature 새로운 기능 구현 label Dec 1, 2025
@coderabbitai
Copy link

coderabbitai bot commented Dec 1, 2025

Walkthrough

대시보드 삭제 API 함수 deleteDashboard(dashboardId: number)를 추가하고, 대시보드 편집 페이지에서 삭제 클릭 시 확인 모달을 띄워 확정하면 API 호출 후 /mydashboard로 이동하도록 클라이언트 흐름을 구현했습니다. (약 50단어 이내)

Changes

Cohort / File(s) 요약
API 추가
src/lib/apis/dashboards.ts
새로운 공개 함수 deleteDashboard(dashboardId: number) 추가 — DELETE /dashboards/{dashboardId} 요청을 보내고 응답 데이터를 반환
대시보드 편집 UI — 삭제 모달
src/pages/DashboardEdit.tsx
삭제 확인 모달 상태(isModalOpen, resetKey)와 핸들러(handleInitialDeleteClick, handleModalStateClose, handleModalDelete) 추가, BaseModalFramedeleteDashboard 임포트, 모달에서 삭제 확정 시 API 호출 후 /mydashboard로 네비게이션

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

  • 주의할 파일/영역:
    • DashboardEdit.tsx의 모달 상태/핸들러 로직 및 비동기 삭제 흐름 검증
    • deleteDashboard API의 에러 처리 및 호출 계약(엔드포인트/응답 형태) 확인
    • 대시보드 ID 타입 변환(memoization)과 라우팅 동작 확인

Possibly related issues

Suggested reviewers

  • hjiasdq
  • aahreum
  • yujin-fe

개요

대시보드 삭제 기능을 구현하는 변경사항입니다. 새로운 deleteDashboard API 함수를 추가하고, 대시보드 편집 페이지에 삭제 확인 모달 UI 플로우를 도입했습니다.

변경 사항

변경 내용 파일 요약
API 함수 추가
src/lib/apis/dashboards.ts
DELETE 요청을 /dashboards/{dashboardId} 로 발송하는 공개 API 함수 deleteDashboard() 추가
삭제 확인 모달 구현
src/pages/DashboardEdit.tsx
모달 상태 관리(isModalOpen), 핸들러 함수(handleInitialDeleteClick, handleModalStateClose, handleModalDelete) 추가, 확인 시 deleteDashboard() API 호출 후 /mydashboard로 이동

예상 코드 리뷰 소요 시간

🎯 3 (보통) | ⏱️ ~20분

  • 주의가 필요한 영역:
    • 모달 상태 및 이벤트 핸들러 로직 검증
    • 대시보드 ID의 타입 변환 및 memoization 구현 정확성
    • 삭제 후 네비게이션 플로우 검증

연관 이슈

추천 리뷰어

  • hjiasdq
  • aahreum

Pre-merge checks and finishing touches

❌ 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%. You can run @coderabbitai generate docstrings to improve docstring coverage.
Description check ❓ Inconclusive PR 설명이 대부분 필수 섹션을 포함하고 있으나, 이슈 번호가 명시적으로 지정되지 않아 불완전합니다. 이슈 번호 필드에 구체적인 번호(예: #309)를 명시하고, 작업 내용을 더 상세히 기술해주세요.
✅ Passed checks (1 passed)
Check name Status Explanation
Title check ✅ Passed PR 제목이 변경사항의 주요 내용을 명확하게 설명하고 있습니다. 대시보드 삭제 버튼 기능과 API 연결이라는 핵심 변경사항을 잘 요약하고 있으며, 팀의 컨벤션인 [✨ Feature/이슈번호] 형식을 따르고 있습니다.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feature/300/editpage-deletebutton

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions
Copy link

github-actions bot commented Dec 1, 2025

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (4)
src/lib/apis/dashboards.ts (2)

48-53: 변수명 일관성을 위해 res 사용을 권장합니다.

이 파일의 다른 API 함수들(createDashboard, getDashboards, getDashboardDetail, changeDashboard)은 모두 res 변수명을 사용하는데, 이 함수만 response를 사용하고 있습니다. 코드베이스 전체의 일관성을 위해 res로 통일하는 것이 좋습니다.

-  const response = await api.delete(`/dashboards/${dashboardId}`);
-  return response.data;
+  const res = await api.delete(`/dashboards/${dashboardId}`);
+  return res.data;

50-53: 반환 타입 명시를 고려해보세요.

changeDashboard 함수는 명시적인 반환 타입(Promise<AxiosResponse<Dashboard>>)을 가지고 있지만, 이 함수는 타입 명시가 없습니다. 타입 안정성과 코드 가독성을 위해 반환 타입을 명시하는 것을 권장합니다.

-export const deleteDashboard = async (dashboardId: number) => {
+export const deleteDashboard = async (dashboardId: number): Promise<void> => {
   const response = await api.delete(`/dashboards/${dashboardId}`);
   return response.data;
 };

참고: API 응답이 특정 데이터를 반환한다면 해당 타입을 사용하세요.

src/pages/DashboardEdit.tsx (2)

18-20: 불필요한 useMemo 사용을 재고해보세요.

dashboardId를 숫자로 변환하는 단순한 연산에 useMemo를 사용하고 있습니다. useParams의 값은 이미 안정적이고, Number() 변환 비용이 매우 낮기 때문에 메모이제이션이 불필요합니다.

-  const numericDashboardId = useMemo(() => {
-    return dashboardId ? Number(dashboardId) : null;
-  }, [dashboardId]);
+  const numericDashboardId = dashboardId ? Number(dashboardId) : null;

59-65: 삭제 확인 모달에 취소 버튼이 없습니다.

현재 BaseModalFrame은 "확인" 버튼만 제공하며, 사용자가 실수로 삭제 버튼을 클릭했을 경우 취소할 방법이 없습니다. 파괴적인 작업(삭제)에는 취소 옵션을 제공하는 것이 일반적인 UX 패턴입니다.

BaseModalFrame을 수정하거나, 커스텀 모달을 만들어서 "취소"와 "삭제" 두 버튼을 제공하는 것을 권장합니다. 또는 모달 바깥 영역을 클릭하면 닫히도록 dimmed 영역에 클릭 핸들러를 추가할 수 있습니다.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 0092302 and 63a0bf6.

📒 Files selected for processing (2)
  • src/lib/apis/dashboards.ts (1 hunks)
  • src/pages/DashboardEdit.tsx (2 hunks)
🧰 Additional context used
📓 Path-based instructions (2)
**/*.ts

⚙️ CodeRabbit configuration file

**/*.ts: language: "ko-KR"

reviews:
instructions: |
우리 팀은 다음의 코드 스타일 가이드를 따릅니다:

[기본 규칙]
- 변수는 항상 const 우선 사용
- 파일명은 camelCase로 작성
- 필요 없는 코드는 즉시 제거 (미사용 변수/함수 금지)
- 함수를 제외한 유틸 파일은 default export 대신 named export 권장

[함수 네이밍 규칙]
- 모든 함수는 **동사 + 목적어** 형태로 작성
- 데이터 조회 함수: get / fetch / load
- 데이터 수정 함수: set / update / save / remove
- 이벤트 함수: handle 사용
- 계산 / 변환 함수: calculate / convert / parse / format
- 조건 검사 함수: is / has / can

[디렉토리 & 파일 구조]
- 디렉토리명은 kebab-case 사용
- 에셋(icon, image, logos)은 index 파일을 통한 일괄 export
- import 시 `@/assets/icons` 형태로 그룹 단위 import

[상수 / 환경 변수]
- SNAKE_CASE 사용
- 예: PAGE_SIZE, API_URL

[주석 & 문서화]
- TODO 주석 적극 활용 (급한 PR / 미구현 영역)
- TSDoc 사용 가능 (컴포넌트 설명, 사용 예시 추가)
- @param은 TypeScript 타입으로 설명하기 때문에 비사용

Files:

  • src/lib/apis/dashboards.ts
**/*.tsx

⚙️ CodeRabbit configuration file

**/*.tsx: reviews:
instructions: |
우리 팀은 다음의 코드 스타일 가이드를 따릅니다:

[기본 규칙]
- 변수는 const 우선 사용
- 파일명은 PascalCase로 작성
- 컴포넌트는 default export를 사용
- 파일명과 컴포넌트명은 반드시 일치 (PascalCase)
- 불필요한 props는 전달하지 않기
- UI 관련 상태는 명확한 이름 사용 (isOpen, isLoading 등)

[함수 네이밍 규칙]
- 모든 함수는 **동사 + 목적어**
- UI 이벤트 핸들러는 handle* 사용 (handleClick, handleToggle 등)
- 내부 로직은 calculate / convert / format 등 의미 기반 네이밍 사용

[디렉토리 & 파일 구조]
- 디렉토리는 kebab-case
- 컴포넌트 파일은 PascalCase
- assets는 index 기반 export (Icons, Images, Logos 등)
- import 시 그룹 단위 import 사용

[상수 / 환경 변수]
- SNAKE_CASE 사용
- 예: PAGE_SIZE, API_URL

[함수 선언 규칙]
- 컴포넌트는 선언식 function Component() 형태
- 컴포넌트 내부의 로직 함수는 화살표 함수 사용
- 유틸성 컴포넌트가 아니면 default export

[주석 & 문서화]
- TODO 주석 사용 (미완성 코드 표시)
- TSDoc을 컴포넌트 단위로 활용
- 예시를 포함한 간단한 설명 추가

Files:

  • src/pages/DashboardEdit.tsx
🧠 Learnings (2)
📚 Learning: 2025-11-28T14:56:38.460Z
Learnt from: aahreum
Repo: sprint-19-part3-7team/Taskify-Frontend PR: 239
File: src/components/dashboard/header/Header.tsx:79-81
Timestamp: 2025-11-28T14:56:38.460Z
Learning: In src/components/dashboard/header/Header.tsx, the mobile-only Title component intentionally shows only {title} (from getBasicTitle) without the dashboard name fallback. On /dashboard/:id routes, the mobile header title should remain empty per requirements.

Applied to files:

  • src/pages/DashboardEdit.tsx
📚 Learning: 2025-11-22T16:39:21.177Z
Learnt from: aahreum
Repo: sprint-19-part3-7team/Taskify-Frontend PR: 93
File: src/components/dashboard/dropdown/DropdownMenuSearchTrigger.tsx:32-63
Timestamp: 2025-11-22T16:39:21.177Z
Learning: In the DropdownMenuSearchTrigger component (src/components/dashboard/dropdown/DropdownMenuSearchTrigger.tsx), a div element is intentionally used instead of a button because the component conditionally renders an input element when open, and nesting input inside button is invalid HTML.

Applied to files:

  • src/pages/DashboardEdit.tsx
🧬 Code graph analysis (2)
src/lib/apis/dashboards.ts (2)
src/lib/axios/index.ts (1)
  • api (40-40)
src/lib/apis/Invitations.ts (2)
  • dashboardId (31-35)
  • dashboardId (4-7)
src/pages/DashboardEdit.tsx (3)
src/lib/apis/dashboards.ts (1)
  • deleteDashboard (50-53)
src/components/common/Button.tsx (1)
  • Button (64-85)
src/components/common/modal/BaseModalFrame.tsx (1)
  • BaseModalFrame (28-59)
🔇 Additional comments (1)
src/pages/DashboardEdit.tsx (1)

1-1: 필요한 임포트가 올바르게 추가되었습니다.

useState, useMemo, BaseModalFrame, deleteDashboard가 새로운 모달 삭제 플로우를 위해 적절하게 임포트되었습니다.

Also applies to: 4-4, 9-9

@github-actions
Copy link

github-actions bot commented Dec 1, 2025

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

♻️ Duplicate comments (1)
src/pages/DashboardEdit.tsx (1)

27-39: 에러 핸들링이 여전히 누락되어 있습니다.

이전 리뷰에서 지적된 대로, deleteDashboard API 호출에 에러 처리가 없습니다. 현재 구현에서는:

  1. 모달이 API 호출 전에 먼저 닫힘 (line 28)
  2. API 실패 시에도 /mydashboard로 이동함
  3. 사용자가 삭제 실패 여부를 알 수 없음

이전 리뷰의 제안대로 try/catch를 추가하고, 성공 시에만 모달을 닫고 navigate하도록 수정해주세요.

🧹 Nitpick comments (1)
src/pages/DashboardEdit.tsx (1)

16-21: resetKey는 불필요한 상태입니다.

resetKey는 line 35에서 증가되지만, 바로 다음에 navigate('/mydashboard')가 호출되어 컴포넌트가 언마운트됩니다. 따라서 resetKey 증가는 아무런 효과가 없습니다.

불필요한 상태를 제거하세요:

  const [isModalOpen, setIsModalOpen] = useState(false);
-  const [resetKey, setResetKey] = useState(0);

그리고 line 35의 setResetKey((prev) => prev + 1);와 line 51의 key={resetKey}도 함께 제거하세요.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 63a0bf6 and 187dc65.

📒 Files selected for processing (2)
  • src/lib/apis/dashboards.ts (1 hunks)
  • src/pages/DashboardEdit.tsx (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/lib/apis/dashboards.ts
🧰 Additional context used
📓 Path-based instructions (1)
**/*.tsx

⚙️ CodeRabbit configuration file

**/*.tsx: reviews:
instructions: |
우리 팀은 다음의 코드 스타일 가이드를 따릅니다:

[기본 규칙]
- 변수는 const 우선 사용
- 파일명은 PascalCase로 작성
- 컴포넌트는 default export를 사용
- 파일명과 컴포넌트명은 반드시 일치 (PascalCase)
- 불필요한 props는 전달하지 않기
- UI 관련 상태는 명확한 이름 사용 (isOpen, isLoading 등)

[함수 네이밍 규칙]
- 모든 함수는 **동사 + 목적어**
- UI 이벤트 핸들러는 handle* 사용 (handleClick, handleToggle 등)
- 내부 로직은 calculate / convert / format 등 의미 기반 네이밍 사용

[디렉토리 & 파일 구조]
- 디렉토리는 kebab-case
- 컴포넌트 파일은 PascalCase
- assets는 index 기반 export (Icons, Images, Logos 등)
- import 시 그룹 단위 import 사용

[상수 / 환경 변수]
- SNAKE_CASE 사용
- 예: PAGE_SIZE, API_URL

[함수 선언 규칙]
- 컴포넌트는 선언식 function Component() 형태
- 컴포넌트 내부의 로직 함수는 화살표 함수 사용
- 유틸성 컴포넌트가 아니면 default export

[주석 & 문서화]
- TODO 주석 사용 (미완성 코드 표시)
- TSDoc을 컴포넌트 단위로 활용
- 예시를 포함한 간단한 설명 추가

Files:

  • src/pages/DashboardEdit.tsx
🔇 Additional comments (2)
src/pages/DashboardEdit.tsx (2)

1-9: LGTM!

import 구문이 올바르게 구성되어 있으며, 추가된 모든 import가 컴포넌트에서 사용되고 있습니다.


23-25: LGTM!

핸들러 네이밍이 팀 컨벤션(handle*)을 따르고 있습니다.

@aahreum
Copy link
Member

aahreum commented Dec 2, 2025

사이드바 목록은 삭제 성공하면 대시보드 사이드바 데이터를 refetch 해오면 될 것 같습니다!

@jung518 jung518 merged commit 5bcd8a8 into main Dec 2, 2025
2 checks passed
@jung518 jung518 deleted the feature/300/editpage-deletebutton branch December 2, 2025 04:37
yujin-fe added a commit to yujin-fe/Taskify-Frontend that referenced this pull request Dec 2, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

✨ Feature 새로운 기능 구현

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants