Skip to content

Feat 72: 모임홈_운영진 UI#73

Open
bini0918 wants to merge 15 commits intodevfrom
feat-72
Open

Feat 72: 모임홈_운영진 UI#73
bini0918 wants to merge 15 commits intodevfrom
feat-72

Conversation

@bini0918
Copy link
Contributor

@bini0918 bini0918 commented Feb 5, 2026

💡 To Reviewers

  • 해당 브랜치에서 새롭게 설치한 라이브러리가 있다면 함께 명시해 주세요.
  • 리뷰어가 코드를 이해하는 데 도움이 되는 정보나 참고사항이 있다면 자유롭게 작성해 주세요.
    groups/[id]/의 코드 재활용했습니다.

🔥 작업 내용 (가능한 구체적으로 작성해 주세요)

  • 모임홈_운영진 UI
  • 운영진용 버튼 추가

🤔 추후 작업 예정

  • 추가 구현이 필요한 부분이나 다음 작업 계획을 작성해 주세요.

📸 작업 결과 (스크린샷)

  • 작업 결과를 보여주는 스크린샷을 첨부해 주세요.
스크린샷 2026-02-06 오전 12 52 11

🔗 관련 이슈

@coderabbitai
Copy link

coderabbitai bot commented Feb 5, 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.

  • 🔍 Trigger a full 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-72

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

Summary of Changes

Hello @bini0918, 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은 모임 운영진이 그룹 홈을 효율적으로 관리할 수 있도록 새로운 관리자 UI를 도입합니다. 운영진은 이제 전용 페이지에서 공지사항을 작성하고 책장 항목을 추가할 수 있으며, 기존 댓글 기능에 운영진 전용 관리 옵션이 추가되어 콘텐츠 관리가 용이해졌습니다. 이를 통해 그룹 운영의 편의성과 기능성이 크게 향상될 것입니다.

Highlights

  • 모임 홈 운영진 UI 추가: 모임 홈에 운영진 전용 UI가 추가되어, 운영진이 공지사항 및 책장을 관리할 수 있게 되었습니다.
  • 공지사항 및 책장 작성 페이지 구현: 운영진을 위한 새로운 공지사항 작성 페이지와 책장 작성 페이지가 추가되었습니다. 공지사항 작성 시 투표, 이미지 첨부, 책장 연동 기능을 지원합니다.
  • 운영진 전용 레이아웃 및 내비게이션: 운영진 페이지에 맞는 전용 레이아웃과 내비게이션 탭이 적용되어, 일반 사용자 페이지와 구분됩니다.
  • 댓글 관리 기능 확장: 운영진 화면에서 댓글을 관리할 수 있도록 댓글 컴포넌트에 '가리기' 기능이 추가되었습니다.
  • 새로운 SVG 아이콘 추가: 캘린더, 숨기기, 이미지, 투표 관련 새로운 SVG 아이콘들이 추가되었습니다.

🧠 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
  • public/Calendar.svg
    • 새로운 캘린더 SVG 아이콘 추가
  • public/Hide.svg
    • 새로운 숨기기 SVG 아이콘 추가
  • public/image.svg
    • 새로운 이미지 SVG 아이콘 추가
  • public/vote.svg
    • 새로운 투표 SVG 아이콘 추가
  • src/app/groups/[id]/admin/bookcase/new/layout.tsx
    • 새로운 책장 생성 페이지를 위한 레이아웃 파일 추가
  • src/app/groups/[id]/admin/bookcase/new/page.tsx
    • 책 선택, 기수, 태그, 모임 정보, 본문 등을 입력할 수 있는 새로운 책장 생성 페이지 추가
  • src/app/groups/[id]/admin/bookcase/page.tsx
    • 운영진용 책장 목록 페이지 추가 및 BookDetailCard 컴포넌트 활용
  • src/app/groups/[id]/admin/notice/[noticeId]/page.tsx
    • 운영진용 공지사항 상세 페이지 추가 (일반/투표 공지 구분 및 댓글 관리 기능 포함)
  • src/app/groups/[id]/admin/notice/new/layout.tsx
    • 새로운 공지사항 생성 페이지를 위한 레이아웃 파일 추가
  • src/app/groups/[id]/admin/notice/new/page.tsx
    • 제목, 내용, 투표 옵션 (복수, 익명, 중요), 이미지 업로드, 책장 연동 기능을 포함하는 새로운 공지사항 생성 페이지 추가
  • src/app/groups/[id]/admin/notice/page.tsx
    • 운영진용 공지사항 목록 페이지 추가 및 공지사항 작성 버튼 포함
  • src/app/groups/[id]/admin/page.tsx
    • 운영진용 모임 홈 페이지 추가 (최근 공지, 모임 정보, '모임 관리하기' 버튼 포함)
  • src/app/groups/[id]/layout.tsx
    • 운영진 페이지 ('/admin/notice/new', '/admin/bookcase/new')에 대한 레이아웃 조건부 적용 로직 추가
    • 운영진 여부에 따라 내비게이션 탭 경로를 동적으로 설정하도록 수정
  • src/components/base-ui/Bookcase/BookDetailCard.tsx
    • 도서 이미지, 제목, 저자, 카테고리, 별점, 설명을 표시하는 BookDetailCard 컴포넌트 추가
  • src/components/base-ui/Comment/comment_item.tsx
    • isAdminView prop 추가 및 운영진 화면에서 '신고하기' 버튼을 '가리기'로 변경하는 로직 구현
  • src/components/base-ui/Comment/comment_list_notice.tsx
    • isAdminView prop을 CommentItem 컴포넌트로 전달하도록 수정
  • src/components/base-ui/Comment/comment_section_notice.tsx
    • isAdminView prop을 CommentListNotice 컴포넌트로 전달하도록 수정
  • src/components/base-ui/Group/BookshelfModal.tsx
    • 책장 항목을 선택할 수 있는 BookshelfModal 컴포넌트 추가
  • src/components/base-ui/Group/vote_notice_detail.tsx
    • isAdmin prop 추가 및 운영진을 위한 공지사항 수정/삭제 메뉴 추가
Activity
  • bini0918님이 모임 홈 운영진 UI를 구현하기 위한 초기 작업을 시작했습니다.
  • 새로운 SVG 아이콘들이 추가되어 UI 요소들을 시각적으로 풍부하게 만들었습니다.
  • 운영진 전용 공지사항 및 책장 관리 페이지를 위한 Next.js 라우팅 및 컴포넌트 구조가 설정되었습니다.
  • 기존 댓글 컴포넌트에 운영진 모드 기능이 통합되어 댓글 관리 유연성이 향상되었습니다.
  • 모임 상세 레이아웃이 운영진 경로를 인식하고 적절한 내비게이션을 제공하도록 업데이트되었습니다.
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

@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를 추가하는 작업으로, 공지사항과 책장 관리 페이지 등 많은 기능이 추가되었습니다. 전반적으로 코드가 잘 구성되어 있지만, 몇 가지 개선점을 발견했습니다. 특히 '임시저장' 버튼의 오작동 가능성, 미구현된 기능, 반응형 레이아웃 문제 등은 수정이 필요해 보입니다. 또한, 일부 페이지 컴포넌트가 비대하므로 추후 리팩토링을 통해 더 작은 단위로 분리하면 유지보수성이 향상될 것입니다. 자세한 내용은 각 파일에 남긴 코멘트를 참고해주세요.

<div className="flex justify-center t:justify-end gap-2 ">
<button
type="button"
onClick={handleCancel}

Choose a reason for hiding this comment

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

high

'임시저장' 버튼이 handleCancel 함수를 호출하고 있어, router.back()이 실행됩니다. 이는 사용자가 입력한 내용을 저장하지 않고 뒤로 가기 때문에 버그로 보입니다. 임시저장 기능을 구현하려면 입력된 데이터를 저장하는 별도의 핸들러를 구현해야 합니다. 예를 들어, localStorage에 저장하거나 서버에 임시 저장 요청을 보낼 수 있습니다.

Comment on lines +226 to +236
<div className="flex items-center gap-3">
<div className="relative w-6 h-6">
<Image
src="/Calendar.svg"
alt="날짜"
fill
className="object-contain"
/>
</div>
<span className="body_1_2 text-Gray-4">날짜선택</span>
</div>

Choose a reason for hiding this comment

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

high

투표 마감 날짜를 선택하는 기능이 구현되어 있지 않습니다. 현재는 UI만 표시되고 실제 날짜를 선택하거나 상태를 업데이트하는 로직이 없습니다. onClick 핸들러를 추가하여 날짜 선택 모달을 열거나, <input type="date" /> 등을 사용하여 사용자가 날짜를 선택하고 voteDate 상태를 업데이트할 수 있도록 구현해야 합니다.

<div className="flex w-full max-w-[1040px] justify-center t:justify-end gap-4 mt-6">
<button
type="button"
onClick={handleCancel}

Choose a reason for hiding this comment

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

high

'임시저장' 버튼이 handleCancel 함수를 호출하여 router.back()을 실행합니다. 이는 사용자가 작성한 내용을 저장하지 않고 이전 페이지로 돌아가게 되므로 버그로 보입니다. 임시저장 기능을 구현하려면 폼 데이터를 저장하는 별도의 로직이 필요합니다.

</div>

{/* 2. 상세 정보 영역 (Frame 2087328745) */}
<div className="flex h-[230px] w-[857px] flex-col items-start gap-[20px]">

Choose a reason for hiding this comment

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

high

w-[857px]와 같이 고정된 너비 값을 사용하면 화면 크기가 줄어들었을 때 레이아웃이 깨질 수 있습니다. w-full이나 max-w-full과 같은 반응형 유틸리티를 사용하거나, flex-grow 속성을 활용하여 유연한 레이아웃을 만드는 것을 권장합니다. 다른 고정 너비 값들(w-[132px], w-[115px], w-[61px])도 함께 검토해보시면 좋을 것 같습니다.

Suggested change
<div className="flex h-[230px] w-[857px] flex-col items-start gap-[20px]">
<div className="flex h-[230px] flex-1 flex-col items-start gap-[20px] min-w-0">

Comment on lines +221 to +227
<input
type="text"
value={meetingStartDate}
onChange={(e) => setMeetingStartDate(e.target.value)}
placeholder="2000.00.00의 양식으로 작성해주세요"
className="flex-1 px-4 py-3 h-14 rounded-[8px] border border-Subbrown-4 bg-White text-Gray-7 body_1_3 placeholder:text-Gray-3"
/>

Choose a reason for hiding this comment

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

medium

모임 날짜를 type="text"로 받고 있어 사용자가 형식에 맞지 않게 입력할 수 있습니다. 이는 데이터 일관성을 해칠 수 있고 사용자 경험에도 좋지 않습니다. 브라우저 네이티브 <input type="date" />를 사용하거나, 일관된 UI를 위해 별도의 달력/데이트 피커 컴포넌트를 사용하는 것을 고려해보세요.

Suggested change
<input
type="text"
value={meetingStartDate}
onChange={(e) => setMeetingStartDate(e.target.value)}
placeholder="2000.00.00의 양식으로 작성해주세요"
className="flex-1 px-4 py-3 h-14 rounded-[8px] border border-Subbrown-4 bg-White text-Gray-7 body_1_3 placeholder:text-Gray-3"
/>
<input
type="date"
value={meetingStartDate}
onChange={(e) => setMeetingStartDate(e.target.value)}
className="flex-1 px-4 py-3 h-14 rounded-[8px] border border-Subbrown-4 bg-White text-Gray-7 body_1_3 placeholder:text-Gray-3"
/>

Comment on lines +164 to +178
{[0, 1, 2, 3].map((index) => (
<div
key={index}
className="w-full rounded-[8px] border border-Subbrown-4 bg-White px-5 py-5"
>
<input
value={voteItems[index]}
onChange={(e) =>
handleVoteItemChange(index, e.target.value)
}
placeholder={`투표 항목 ${index + 1} 입력`}
className="w-full bg-transparent outline-none text-Gray-7 body_1_2 placeholder:text-Gray-3"
/>
</div>
))}

Choose a reason for hiding this comment

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

medium

투표 항목이 4개로 고정되어 있습니다. 사용자가 투표 항목을 동적으로 추가하거나 삭제할 수 있도록 기능을 개선하면 사용성이 더 좋아질 것 같습니다. 예를 들어, voteItems 상태를 배열로 관리하고, 항목을 추가/삭제하는 버튼을 제공할 수 있습니다.

content={notice.content}
date={notice.date}
isPinned={true}
onClick={() => handleNoticeClick(notice.id!)}

Choose a reason for hiding this comment

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

medium

notice.id!와 같이 non-null assertion !을 사용하고 있습니다. 현재 더미 데이터에서는 id가 항상 존재하지만, 실제 API 응답에서는 idundefined일 가능성을 배제할 수 없습니다. onClick={() => notice.id && handleNoticeClick(notice.id)} 와 같이 id가 존재할 때만 함수를 호출하도록 하여 더 안전한 코드를 작성하는 것이 좋습니다. 이 패턴이 90번 줄에도 반복됩니다.

Suggested change
onClick={() => handleNoticeClick(notice.id!)}
onClick={() => notice.id && handleNoticeClick(notice.id)}

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