Fix/kanban api#70
Conversation
팀 추가 기능이 모달에서 링크 방식으로 변경됨에 따라 사용하지 않는 모달 컴포넌트 파일들을 삭제 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- useKanbanTasks: task CRUD, 체크 상태, 모달 상태 관리 담당 - useKanbanDnd: 드래그 센서 설정 및 드롭 처리 담당 - KanbanBoard: 두 훅을 조합하는 얇은 컴포넌트로 전환
- TeamNavClient: 드로어 상태 관리 클라이언트 컴포넌트 생성 - TeamTabletHeader: onMenuClick prop을 지원하는 피처 전용 태블릿 헤더 생성 - 공유 MobileHeader의 onMenuClick을 드로어 open과 연결 - layout.tsx에서 TabletHeader/MobileHeader 래퍼를 TeamNavClient로 교체 - page.module.css에서 미사용 tabletHeaderWrapper/mobileHeaderWrapper 클래스 제거 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
팀 생성 시 currentUser 쿼리를 invalidate하지 않아 사이드바의 memberships 목록이 갱신되지 않던 문제를 수정 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Summary of ChangesHello @Jieunsse, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed! 이 PR은 팀 작업 관리를 위한 칸반 보드 기능을 도입하고, 그룹 및 태스크 목록 관리를 위한 API 통합을 완료합니다. 또한, 팀 멤버 초대 및 삭제 기능을 포함한 멤버 관리 기능을 강화하고, 다양한 디바이스에서 일관된 사용자 경험을 제공하기 위한 반응형 UI를 구현했습니다. 내부적으로는 API 통신을 프록시 방식으로 전환하여 보안과 유지보수성을 향상시켰습니다. Highlights
🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console. Changelog
Using Gemini Code AssistThe full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips. Invoking Gemini You can request assistance from Gemini at any point by creating a comment using either
Customization To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a Limitations & Feedback Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here. You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension. Footnotes
|
There was a problem hiding this comment.
Code Review
The pull request introduces a comprehensive Kanban board feature, including task management, member sections, and team dashboards. While the overall structure is solid and leverages modern React patterns like TanStack Query and dnd-kit, there are several critical logic issues. Specifically, the Kanban board's status derivation logic conflicts with its drag-and-drop functionality, and the progress reporting in the dashboard counts lists instead of individual tasks. There are also potential runtime issues with API response parsing and timezone handling for 'Today' reports.
| export function getGroupInvitation(groupId: number): Promise<string> { | ||
| return requestJson<string>(`/groups/${groupId}/invitation`, GROUP_ERROR_MESSAGE.invitation); | ||
| } |
There was a problem hiding this comment.
The requestJson helper calls response.json() internally. If the API returns a raw JWT string (as the comment on line 29 suggests), this will result in a syntax error during JSON parsing because a raw JWT is not a valid JSON value. If the response is indeed a raw string, you should use a helper that utilizes response.text() instead.
| function deriveStatus(items: TaskItem[]): KanbanStatus { | ||
| if (items.length === 0) return 'todo'; | ||
| const doneCount = items.filter((item) => item.checked).length; | ||
| if (doneCount === 0) return 'todo'; | ||
| if (doneCount === items.length) return 'done'; | ||
| return 'inProgress'; | ||
| } |
There was a problem hiding this comment.
The status of a task list is automatically derived from its items via deriveStatus. However, the Kanban board allows users to manually drag cards between columns, which updates the status in local state. Since this manual status change is not persisted to the backend and is overwritten by the derived status whenever the API data refreshes (due to the logic on lines 61-64), the drag-and-drop functionality is effectively non-functional. You should either implement persistence for the status change or rely solely on the derived status and disable manual dragging between columns.
| function getTodayDateString(): string { | ||
| return new Date().toISOString().split('T')[0]; | ||
| } |
There was a problem hiding this comment.
Using new Date().toISOString() to determine the current date results in a UTC-based date string. This can lead to the 'Today' report displaying the incorrect date for users in different timezones (e.g., a user in KST might see yesterday's date in the early morning). Consider using local date formatting to ensure the date is relative to the user's timezone.
| const totalTasks = taskListQueries.length; | ||
| const doneTasks = taskListQueries.filter((q) => isTaskListDone(q.data?.tasks ?? [])).length; |
There was a problem hiding this comment.
The totalTasks and doneTasks calculations are currently based on the number of task lists rather than individual tasks. This means the progress bar in the TodayReport reflects how many lists are fully completed, which may not accurately represent the user's actual workload progress. It is recommended to aggregate the total and completed task counts across all lists for a more granular progress report.
| function buildHeaders(options?: RequestInit): HeadersInit { | ||
| const method = (options?.method ?? 'GET').toUpperCase(); | ||
| const needsContentType = ['POST', 'PATCH', 'PUT'].includes(method) && options?.body !== undefined; | ||
| return needsContentType ? { 'Content-Type': 'application/json' } : {}; | ||
| } |
There was a problem hiding this comment.
The buildHeaders function unconditionally sets Content-Type: application/json for POST, PATCH, and PUT requests if a body is present. This will cause failures when the body is a FormData object (e.g., during file uploads), as the browser must be allowed to set the multipart boundary automatically. You should add a check to ensure the body is not an instance of FormData before adding this header.
Summary
Issue
Scope
포함
특이사항