Skip to content

[feat-104] : 채팅 UI , 조 편성 페이지 UI ,잡무#107

Closed
hongik-luke wants to merge 13 commits intodevfrom
feat-104
Closed

[feat-104] : 채팅 UI , 조 편성 페이지 UI ,잡무#107
hongik-luke wants to merge 13 commits intodevfrom
feat-104

Conversation

@hongik-luke
Copy link
Copy Markdown
Contributor

📌 개요 (Summary)

  1. 조 편성 페이지 UI
    책장, 책장상세 페이지 API에 맞춰서 수정 -> dnd-kit 추가(스크롤 기능) -> 이후 조 편성 페이지 UI 제작

드래그로써 스크롤이 되는 기능을 추가하여 모바일 환경에서도 손 쉽게 조를 편성할 수 있게 만들었으며 조를 편성한 뒤, 확정을 하는 UI를 만듦으로써 오류와 무분별한 API 난사를 막았다.

  1. 채팅 UI

테블릿, 데스크톱 크기일 때 채팅창을 자유롭게 배치할 수 있도록 움직일 수 있게 설계하였고 뒤에 있는 발제에 대한 것들이나 정렬하기 등의 기능도 함께 사용가능하도록 설계하였다. 또한 채팅창의 크기를 고려하여 모바일 환경에서는 전체화면이 되게끔 만들었으며 이때 Float가 채팅 전송을 막는 것을 방지하기 위해 Float의 위 올라간다.

  1. 잡무
    없어져야할 페이지들 제거, 약간의 버그 수정, 폴더링 수정
    -> 불필요한(중복/미사용) 페이지 제거, 폴더 구조 정리, 자잘한 UI/동작 버그 수정

🛠️ 변경 사항 (Changes)

  • 새로운 기능 추가
  • 버그 수정
  • 코드 리팩토링
  • 문서 업데이트
  • 기타 (설명: )

📸 스크린샷 (Screenshots)

  1. 조 편성 페이지 UI
2026-02-20.014018.mp4
2026-02-20.014234.mp4
  1. 채팅 UI
2026-02-20.015719.mp4
화면 캡처 2026-02-20 015816

Copilot AI review requested due to automatic review settings February 19, 2026 17:05
@vercel
Copy link
Copy Markdown

vercel Bot commented Feb 19, 2026

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

Project Deployment Actions Updated (UTC)
check-mo Error Error Feb 25, 2026 2:16am
checkmo Error Error Feb 25, 2026 2:16am

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Feb 19, 2026

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat-104

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.

@gemini-code-assist
Copy link
Copy Markdown
Contributor

Summary of Changes

Hello @hongik-luke, 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은 조 편성 및 채팅 기능의 사용자 인터페이스와 경험을 크게 개선하는 데 중점을 둡니다. 사용자는 이제 직관적인 드래그 앤 드롭 방식으로 모임 조를 구성할 수 있으며, 다양한 기기에서 최적화된 채팅 환경을 경험할 수 있습니다. 더불어, 코드베이스의 불필요한 부분을 정리하고 구조를 개선하여 유지보수성을 높였습니다.

Highlights

  • 조 편성 페이지 UI 개선: dnd-kit 라이브러리를 도입하여 드래그 앤 드롭으로 조를 편성할 수 있는 기능을 추가했습니다. 모바일 환경에서도 스크롤 드래그를 통해 손쉽게 조를 편성할 수 있으며, 편성 확정 UI를 통해 불필요한 API 호출을 방지합니다.
  • 채팅 UI 개선: 태블릿 및 데스크톱 환경에서는 채팅창을 자유롭게 이동시키고 크기를 조절할 수 있도록 설계하여 다른 콘텐츠와 함께 사용할 수 있도록 했습니다. 모바일 환경에서는 채팅창이 전체 화면으로 표시되며, Float 버튼이 채팅 전송을 방해하지 않도록 위치를 조정했습니다.
  • 잡무 및 코드 정리: 불필요하거나 중복된 페이지를 제거하고, 폴더 구조를 정리했습니다. 또한, 자잘한 UI 및 동작 버그를 수정하여 전반적인 코드 품질을 향상시켰습니다.

🧠 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
  • package-lock.json
    • @dnd-kit/core, @dnd-kit/utilities, @dnd-kit/accessibility 의존성이 추가되었습니다.
  • package.json
    • @dnd-kit/core, @dnd-kit/utilities 의존성이 추가되었습니다.
  • public/ArrowLeft3.svg
    • 왼쪽 화살표 SVG 아이콘이 추가되었습니다.
  • public/Polygon7.svg
    • 다각형 SVG 아이콘이 추가되었습니다.
  • public/icon_plus_2.svg
    • 플러스 아이콘 SVG가 추가되었습니다.
  • src/app/groups/[id]/admin/bookcase/[meetingId]/dummy.ts
    • 모임 팀 관리를 위한 더미 데이터와 더미 fetch 함수가 추가되었습니다.
  • src/app/groups/[id]/admin/bookcase/[meetingId]/layout.tsx
    • 모임 편집 페이지를 위한 새로운 레이아웃 파일이 추가되었습니다.
  • src/app/groups/[id]/admin/bookcase/[meetingId]/page.tsx
    • DndContext를 사용하여 드래그 앤 드롭 기반의 관리자 모임 팀 관리 페이지가 구현되었습니다.
  • src/app/groups/[id]/admin/bookcase/page.tsx
    • 기존 AdminBookcaseListPage 파일이 제거되었습니다.
  • src/app/groups/[id]/bookcase/[bookId]/MeetingTabSection.tsx
    • 도서 상세 페이지 내에서 모임 정보와 팀 세부 정보를 표시하는 MeetingTabSection 컴포넌트가 추가되었습니다.
  • src/app/groups/[id]/bookcase/[bookId]/meeting/page.tsx
    • 채팅 팀 선택 모달이 통합되었고, 정렬 로직 주석이 업데이트되었으며, 버튼에 호버 효과가 추가되었습니다.
  • src/app/groups/[id]/bookcase/[bookId]/page.tsx
    • MeetingTabSection을 사용하도록 도서 상세 페이지가 리팩토링되었고, URL 검색 매개변수와 활성 탭 동기화 및 팀 관리 페이지로의 탐색 처리가 추가되었습니다.
  • src/app/groups/[id]/bookcase/page.tsx
    • 새로운 API 응답 타입과 도서 상세 페이지로의 라우팅(탭 매개변수 포함)을 사용하도록 책장 목록 페이지가 업데이트되었습니다.
  • src/app/groups/[id]/layout.tsx
    • 모든 관리자 책장 경로에 대해 그룹 상세 레이아웃 적용이 제외되도록 수정되었습니다.
  • src/app/groups/[id]/page.tsx
    • "이번 모임 바로가기" 버튼의 탐색 로직이 업데이트되었습니다.
  • src/components/base-ui/Bookcase/Admin/bookdetailgrouping/MemberItem.tsx
    • 개별 팀 멤버를 표시하고 드래그 기능을 포함하는 MemberItem 컴포넌트가 추가되었습니다.
  • src/components/base-ui/Bookcase/Admin/bookdetailgrouping/MemberPool.tsx
    • 미배정 멤버를 위한 MemberPool 컴포넌트가 추가되었으며, 드래그 앤 드롭 기능과 확인 모달이 구현되었습니다.
  • src/components/base-ui/Bookcase/Admin/bookdetailgrouping/TeamBoard.tsx
    • 팀을 관리하고 표시하는 TeamBoard 컴포넌트가 추가되었으며, 멤버 드래그 앤 드롭, 팀 추가/제거 기능이 포함되었습니다.
  • src/components/base-ui/Bookcase/BookDetailNav.tsx
    • 탭에 대한 문자열 리터럴 타입과 레이블 매핑을 사용하도록 BookDetailNav가 리팩토링되었습니다.
  • src/components/base-ui/Bookcase/BookcaseCard.tsx
    • imageUrl 속성이 필수로 변경되었고, 이벤트 핸들러가 조정되었습니다.
  • src/components/base-ui/Bookcase/ChatTeamSelectModal.tsx
    • 채팅 팀 선택을 위한 ChatTeamSelectModal 컴포넌트가 추가되었으며, 태블릿/데스크톱에서 드래그 및 크기 조절 가능하고 모바일에서 전체 화면으로 표시됩니다.
  • src/components/base-ui/Bookcase/MeetingInfo.tsx
    • isAdmin 속성이 추가되었고, 날짜/위치 레이아웃이 업데이트되었습니다.
  • src/types/groups/bookcasedetail.ts
    • TeamMember, GetMeetingTeamsResult, TeamMemberListPutBody 등 팀 관리를 위한 새로운 타입 정의와 유틸리티 함수가 추가되었습니다.
  • src/types/groups/bookcasehome.ts
    • BookcaseApiResponse, BookShelfInfo, BookcaseCardModel 등 책장 홈 페이지를 위한 새로운 타입 정의와 세대별 책을 그룹화하는 유틸리티 함수가 추가되었습니다.
Using Gemini Code Assist

The 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 /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

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 .gemini/ folder in the base of the repository. Detailed instructions can be found here.

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

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

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

Code Review

이번 PR은 채팅 및 조 편성 UI를 개선하고 관련 코드를 리팩토링하는 내용을 담고 있습니다. 전반적으로 dnd-kit을 도입하여 드래그 앤 드롭 기능을 구현하고, 컴포넌트 분리와 타입 정의를 통해 코드 구조를 개선한 점이 인상적입니다. 몇 가지 코드 안정성 및 유지보수성 향상을 위한 제안 사항을 남깁니다. 하드코딩된 URL 수정, 중복되는 드래그 앤 드롭 로직 제거, 사용되지 않는 prop 정리 등을 검토해 주시면 좋겠습니다.

<ButtonWithoutImg
text="이번 모임 바로가기"
onClick={() => router.push(joinUrl)}
onClick={() => router.push(`${Number(groupId)}/notice/4`)}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

high

"이번 모임 바로가기" 버튼의 onClick 핸들러에 notice/4라는 특정 URL이 하드코딩되어 있습니다. 이는 동적으로 변해야 하는 값으로 보이며, 테스트나 개발 중에 임시로 추가된 것으로 추측됩니다. API 응답에서 받은 동적인 URL(joinUrl)을 사용하거나, 올바른 경로를 동적으로 생성하도록 수정해야 합니다.

Suggested change
onClick={() => router.push(`${Number(groupId)}/notice/4`)}
onClick={() => router.push(joinUrl)}

Comment thread src/app/groups/[id]/admin/bookcase/[meetingId]/page.tsx Outdated
iconSrc="/icons_chat.svg"
iconAlt="채팅"
onClick={() => setIsChatTeamModalOpen(true)}
className={`${isChatTeamModalOpen ? "mb-15 t:mb-0" : ""}`}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

medium

mb-15와 같은 매직 넘버를 클래스명으로 직접 사용하는 것은 유지보수를 어렵게 만듭니다. 이 값의 의미를 알기 어렵고, 여러 곳에서 사용될 경우 일관성을 유지하기 힘듭니다. tailwind.config.jstheme.spacingsafe-area-bottom과 같이 의미 있는 이름으로 변수를 추가하여 사용하는 것을 권장합니다. 이렇게 하면 코드의 가독성이 향상되고 디자인 시스템을 일관되게 관리할 수 있습니다.

Comment on lines +17 to +38
<div
draggable={draggable}
onDragStart={(e) => {
if (!draggable) return;
e.dataTransfer.setData(
"application/x-checkmo-member",
JSON.stringify({
clubMemberId: member.clubMemberId,
fromTeamNumber: member.teamNumber,
})
);
e.dataTransfer.effectAllowed = "move";
}}
className={[
"flex items-center gap-2.5",
"w-full self-stretch",
"px-5 py-4",
"rounded-[8px]",
"bg-White",
draggable ? "cursor-grab active:cursor-grabbing" : "",
].join(" ")}
>
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

medium

이 컴포넌트는 상위 컴포넌트에서 dnd-kit을 통해 드래그 기능이 제어되고 있습니다. MemberItem 자체에 네이티브 HTML 드래그 속성(draggable, onDragStart)을 두는 것은 중복이며 dnd-kit의 동작과 충돌할 수 있습니다. draggable prop과 관련 로직을 모두 제거하고, 드래그 관련 책임(커서 스타일 포함)은 dnd-kit을 사용하는 상위 컴포넌트에 위임하는 것이 좋습니다.

Suggested change
<div
draggable={draggable}
onDragStart={(e) => {
if (!draggable) return;
e.dataTransfer.setData(
"application/x-checkmo-member",
JSON.stringify({
clubMemberId: member.clubMemberId,
fromTeamNumber: member.teamNumber,
})
);
e.dataTransfer.effectAllowed = "move";
}}
className={[
"flex items-center gap-2.5",
"w-full self-stretch",
"px-5 py-4",
"rounded-[8px]",
"bg-White",
draggable ? "cursor-grab active:cursor-grabbing" : "",
].join(" ")}
>
<div
className={[
"flex items-center gap-2.5",
"w-full self-stretch",
"px-5 py-4",
"rounded-[8px]",
"bg-White",
].join(" ")}
>

import Image from "next/image";

type Props = {
meetingId?: number;
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

medium

meetingId prop이 추가되었지만 컴포넌트 내에서 사용되지 않고 있습니다. 불필요한 prop은 코드의 복잡성을 높이고 혼란을 줄 수 있으므로, 사용하지 않는다면 제거하는 것이 좋습니다.

Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Adds new UI flows for group bookcase/meeting pages, including an admin team-grouping (drag & drop) interface and a chat team selection modal, while aligning bookcase screens to API-shaped types/models.

Changes:

  • Introduced API-aligned types + mappers for bookcase home/detail data and updated bookcase list/detail pages to use meetingId + tab query.
  • Added admin “조 편성” management page using dnd-kit (with supporting UI components) and updated layout routing exclusions.
  • Added a movable/responsive chat team selection modal and integrated it into the meeting page floating button.

Reviewed changes

Copilot reviewed 20 out of 25 changed files in this pull request and generated 9 comments.

Show a summary per file
File Description
src/types/groups/bookcasehome.ts Adds API response/view-model types and mapping/grouping utilities for bookcase home.
src/types/groups/bookcasedetail.ts Adds team/member types and helpers for team labeling/normalization.
src/components/base-ui/Bookcase/MeetingInfo.tsx Updates meeting info card UI and gates “조 관리하기” by admin flag.
src/components/base-ui/Bookcase/ChatTeamSelectModal.tsx Adds responsive/movable chat team selection + placeholder chat UI modal.
src/components/base-ui/Bookcase/BookcaseCard.tsx Tightens imageUrl prop typing (now required).
src/components/base-ui/Bookcase/BookDetailNav.tsx Refactors tabs to stable keys (topic/review/meeting) and maps to labels.
src/components/base-ui/Bookcase/Admin/bookdetailgrouping/TeamBoard.tsx Adds droppable team board and draggable member items using dnd-kit.
src/components/base-ui/Bookcase/Admin/bookdetailgrouping/MemberPool.tsx Adds droppable “unassigned members” pool + save confirmation UI.
src/components/base-ui/Bookcase/Admin/bookdetailgrouping/MemberItem.tsx Adds reusable member row UI component.
src/components/base-ui/Bookcase/Admin/.gitkeep Keeps Admin directory tracked.
src/app/groups/[id]/page.tsx Updates “이번 모임 바로가기” navigation behavior on desktop.
src/app/groups/[id]/layout.tsx Expands layout-exclusion condition to cover all /admin/bookcase routes.
src/app/groups/[id]/bookcase/page.tsx Replaces dummy grouping with API-shaped mock + groupByGeneration mapping; routes by meetingId + tab.
src/app/groups/[id]/bookcase/[bookId]/page.tsx Syncs active tab with ?tab= query and adds link to admin team management page.
src/app/groups/[id]/bookcase/[bookId]/meeting/page.tsx Integrates chat team modal with floating button and refines UI interactions.
src/app/groups/[id]/bookcase/[bookId]/MeetingTabSection.tsx Adds meeting-tab container that renders MeetingInfo + team filter/section from meeting detail payload.
src/app/groups/[id]/admin/bookcase/page.tsx Removes the old admin bookcase list page (dummy-based).
src/app/groups/[id]/admin/bookcase/[meetingId]/page.tsx Adds admin team management page with dnd-kit DnDContext and submit payload building.
src/app/groups/[id]/admin/bookcase/[meetingId]/layout.tsx Adds a route-level layout wrapper for the admin team management page.
src/app/groups/[id]/admin/bookcase/[meetingId]/dummy.ts Adds dummy fetch + response for meeting team management.
public/icon_plus_2.svg Adds plus icon asset for “팀 추가”.
public/Polygon7.svg Adds polygon icon asset used for mobile back button.
public/ArrowLeft3.svg Adds left arrow icon asset.
package.json Adds @dnd-kit/core and @dnd-kit/utilities dependencies.
package-lock.json Locks new dnd-kit dependency tree.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

export type MeetingInfo = {
meetingId: number;
generation: number; // 1,2,3...
tag: "MEETING" | string; // 서버가 더 늘리면 string으로 대응
Copy link

Copilot AI Feb 19, 2026

Choose a reason for hiding this comment

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

tag: "MEETING" | string는 TypeScript에서 결국 string과 동일한 타입이라(리터럴이 string에 흡수됨) 의미가 없습니다. 서버 확장을 염두에 둔 거라면 tag: string으로 단순화하거나, 실제로 제한하고 싶다면 tag: "MEETING" | "..."처럼 구체적인 리터럴 유니온으로 관리하는 편이 유지보수에 유리합니다.

Suggested change
tag: "MEETING" | string; // 서버가 더 늘리면 string으로 대응
tag: string; // 서버가 더 늘리면 string으로 대응

Copilot uses AI. Check for mistakes.

type Props = {
imageUrl?: string;
imageUrl: string;
Copy link

Copilot AI Feb 19, 2026

Choose a reason for hiding this comment

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

imageUrl prop을 필수로 바꾸면서(Props에서 imageUrl: string) 기존 호출부 중 imageUrl을 전달하지 않는 곳(예: src/components/base-ui/Group/BookshelfModal.tsx)에서 타입 에러가 발생합니다. 컴포넌트 내부는 여전히 기본값(imageUrl = "/dummy_book_cover.png")을 두고 있어 API가 불일치하니, (1) imageUrl을 다시 optional로 돌리거나 (2) 모든 호출부에 imageUrl을 넘기고 기본값을 제거하는 쪽으로 정리하는 게 필요합니다.

Suggested change
imageUrl: string;
imageUrl?: string;

Copilot uses AI. Check for mistakes.
</div>

{/* 입력창 */}
<div className="w-full mb-15 t:mb-0">
Copy link

Copilot AI Feb 19, 2026

Choose a reason for hiding this comment

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

mb-15는 기본 Tailwind spacing 스케일에 없는 클래스라서(현재 tailwind.config.js에서도 spacing 확장이 없음) 실제로 스타일이 적용되지 않습니다. 떠있는 입력창/Float 간격을 확보하려는 의도라면 mb-16 같은 유효한 값으로 바꾸거나, bottom-*/translate-y로 위치를 조정하는 방식으로 수정이 필요합니다.

Suggested change
<div className="w-full mb-15 t:mb-0">
<div className="w-full mb-16 t:mb-0">

Copilot uses AI. Check for mistakes.
<ButtonWithoutImg
text="이번 모임 바로가기"
onClick={() => router.push(joinUrl)}
onClick={() => router.push(`${Number(groupId)}/notice/4`)}
Copy link

Copilot AI Feb 19, 2026

Choose a reason for hiding this comment

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

데스크톱 버튼의 router.push(${Number(groupId)}/notice/4)는 앞에 /groups/가 없어 현재 경로 기준 상대경로로 이동할 가능성이 큽니다(예: /groups/123에서 123/notice/4로 push하면 /groups/123/123/notice/4가 됨). 모바일 구간은 여전히 joinUrl을 사용하고 있어 동작이 불일치하니, 데스크톱도 joinUrl을 사용하거나 /groups/${groupId}/notice/4처럼 절대경로로 맞춰주세요.

Suggested change
onClick={() => router.push(`${Number(groupId)}/notice/4`)}
onClick={() => router.push(`/groups/${Number(groupId)}/notice/4`)}

Copilot uses AI. Check for mistakes.
Comment on lines +47 to +48
{/* ✅ UI는 기존 MemberItem 그대로 재사용 */}
<MemberItem member={member} />
Copy link

Copilot AI Feb 19, 2026

Choose a reason for hiding this comment

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

dnd-kit의 useDraggable로 드래그를 처리하는데, 내부에서 렌더링하는 MemberItem이 기본값으로 draggable={true} + onDragStart(native HTML5 drag&drop)를 활성화하고 있어 두 드래그 시스템이 충돌할 수 있습니다(브라우저 기본 drag ghost 이미지/이벤트가 같이 뜨는 케이스). MemberItem을 여기서 사용할 때는 draggable={false}로 끄거나, MemberItem에서 native drag 로직을 제거/옵트인으로 바꿔주세요.

Suggested change
{/* ✅ UI는 기존 MemberItem 그대로 재사용 */}
<MemberItem member={member} />
{/* ✅ UI는 기존 MemberItem 그대로 재사용하되, dnd-kit와 충돌하지 않도록 native drag 비활성화 */}
<MemberItem member={member} draggable={false} />

Copilot uses AI. Check for mistakes.
iconSrc="/icons_chat.svg"
iconAlt="채팅"
onClick={() => setIsChatTeamModalOpen(true)}
className={`${isChatTeamModalOpen ? "mb-15 t:mb-0" : ""}`}
Copy link

Copilot AI Feb 19, 2026

Choose a reason for hiding this comment

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

FloatingFab에 적용한 mb-15는 기본 Tailwind spacing 스케일에 없는 클래스라서(현재 tailwind.config.js에서 spacing 확장 없음) 실제로 버튼 위치가 올라가지 않습니다. 모달이 열렸을 때 버튼을 위로 올려 입력/전송을 막지 않게 하려는 목적이라면 mb-16 등 유효한 클래스나 bottom-* 조정으로 변경해 주세요.

Suggested change
className={`${isChatTeamModalOpen ? "mb-15 t:mb-0" : ""}`}
className={`${isChatTeamModalOpen ? "mb-16 t:mb-0" : ""}`}

Copilot uses AI. Check for mistakes.
Comment on lines +215 to +231
/**
* 조 선택하면 "채팅 페이지"로 이동 (입장만)
* - chat은 "현재 경로 하위의 chat"으로 이동시키는 상대 경로
* - teamId/teamName을 쿼리로 넘겨서 다음 페이지에서 어떤 방인지 알게 함
*/
const handleEnterChat = (team: ChatTeam) => {
setIsChatTeamModalOpen(false);

// 상대경로: 현재 페이지가 .../meeting 이면 .../meeting/chat 로 감
router.push(
`chat?teamId=${team.teamId}&teamName=${encodeURIComponent(team.teamName)}`
);

// ❗️만약 상대경로가 안 맞으면 절대경로로 바꿔야 함:
// router.push(`/groups/${params.groupId}/meeting/${bookId}/chat?teamId=${team.teamId}`);
};

Copy link

Copilot AI Feb 19, 2026

Choose a reason for hiding this comment

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

handleEnterChat가 선언되어 있지만 현재 어떤 컴포넌트에도 전달/호출되지 않아(dead code) 유지보수에 혼란을 줄 수 있습니다. 조 선택 후 채팅 진입을 의도한 거라면 ChatTeamSelectModalonSelectTeam(또는 onEnterChat) 같은 콜백 prop을 추가해 연결하고, 모달 내부의 view === "chat" 전환 로직과 역할을 정리해 주세요. 의도가 모달 내 채팅 UI라면 이 핸들러/주석은 제거하는 게 안전합니다.

Suggested change
/**
* 선택하면 "채팅 페이지" 이동 (입장만)
* - chat은 "현재 경로 하위의 chat"으로 이동시키는 상대 경로
* - teamId/teamName을 쿼리로 넘겨서 다음 페이지에서 어떤 방인지 알게
*/
const handleEnterChat = (team: ChatTeam) => {
setIsChatTeamModalOpen(false);
// 상대경로: 현재 페이지가 .../meeting 이면 .../meeting/chat 로 감
router.push(
`chat?teamId=${team.teamId}&teamName=${encodeURIComponent(team.teamName)}`
);
// ❗️만약 상대경로가 안 맞으면 절대경로로 바꿔야 함:
// router.push(`/groups/${params.groupId}/meeting/${bookId}/chat?teamId=${team.teamId}`);
};

Copilot uses AI. Check for mistakes.
Comment on lines +28 to +33
// Next가 params를 Record<string, string | string[]>로 주는 케이스가 있어서 안전빵
const groupId = Array.isArray(params?.id) ? params?.id[0] : (params?.id as string | undefined);
const meetingId = Array.isArray(params?.meetingId)
? params?.meetingId[0]
: (params?.meetingId as string | undefined);

Copy link

Copilot AI Feb 19, 2026

Choose a reason for hiding this comment

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

groupId/meetingId를 params에서 파싱해두었지만 현재 로직에서 실제로 사용되지 않습니다(주석에만 등장). Next/TS eslint 설정에서는 unused 변수가 경고/에러가 될 수 있고, 읽는 사람 입장에서도 “여기서 API 호출을 하는가?” 혼동이 생깁니다. 아직 미사용이라면 제거하고, 곧 API 연동 예정이라면 handleSubmit/fetch 쪽에서 실제로 사용하도록 연결해 주세요.

Copilot uses AI. Check for mistakes.
Comment on lines +73 to +77
const handleAddTeam = () => {
setTeams((prev) => {
if (prev.length >= 7) return prev;
return [...prev, prev.length + 1];
});
Copy link

Copilot AI Feb 19, 2026

Choose a reason for hiding this comment

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

팀 추가 로직에서 최대 팀 수를 7로 하드코딩하고 있는데, 같은 PR에서 MAX_TEAMS 상수를 이미 정의/사용하고 있습니다(TeamBoardMAX_TEAMS 기반). 한쪽만 변경되어 불일치가 생기지 않도록 여기서도 MAX_TEAMS를 사용해 주세요.

Copilot uses AI. Check for mistakes.
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants