Skip to content

[feat] 관리자 회원 상세 페이지 UI 구현#145

Open
nonoididnt wants to merge 1 commit intodevfrom
feat/138-customer-detail-ui
Open

[feat] 관리자 회원 상세 페이지 UI 구현#145
nonoididnt wants to merge 1 commit intodevfrom
feat/138-customer-detail-ui

Conversation

@nonoididnt
Copy link
Contributor

📌 개요 (Summary)

  • 변경 사항에 대한 간략한 요약을 적어주세요.
    관리자 회원 상세 페이지 UI 구현
    현재 더미 데이터를 기반으로 구현되었으며, API 연결 후 세부 UI 보완 예정

🛠️ 변경 사항 (Changes)

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

📸 스크린샷 (Screenshots)

(UI 변경 사항이 있다면 첨부해주세요)
image
image
image
image

✅ 체크리스트 (Checklist)

  • 빌드가 성공적으로 수행되었나요? (pnpm build)
  • 린트 에러가 없나요? (pnpm lint)
  • 불필요한 콘솔 로그나 주석을 제거했나요?

@vercel
Copy link

vercel bot commented Feb 26, 2026

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

Project Deployment Actions Updated (UTC)
check-mo Ready Ready Preview Feb 26, 2026 3:16pm

@coderabbitai
Copy link

coderabbitai bot commented Feb 26, 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/138-customer-detail-ui

Tip

Try Coding Plans. Let us write the prompt for your AI agent so you can ship faster (with fewer bugs).
Share your feedback on Discord.


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
Contributor

Summary of Changes

Hello @nonoididnt, 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 컴포넌트 추가: 관리자 회원 상세 페이지를 구성하는 AdminCategory, AdminUserProfile, AdminUserTab, BookStoryList, MeetingList, NewsList, ReportList 및 관련 아이템 컴포넌트들이 새로 구현되었습니다.
  • 더미 데이터 기반 초기 구현: 현재는 더미 데이터를 기반으로 UI가 구현되었으며, 향후 API 연동을 통해 실제 데이터가 반영될 예정입니다.

🧠 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
  • src/app/(admin)/admin/(app)/users/[id]/page.tsx
    • 관리자 회원 상세 페이지를 새로 추가하여 사용자 프로필, 카테고리, 탭 기반 콘텐츠를 통합했습니다.
  • src/app/(admin)/admin/(app)/users/page.tsx
    • 관리자 회원 목록에서 각 회원의 상세 페이지로 이동하는 Link 컴포넌트를 추가했습니다.
  • src/components/base-ui/Admin/users/AdminCategory.tsx
    • 선택된 사용자 카테고리를 표시하는 컴포넌트를 추가했습니다.
  • src/components/base-ui/Admin/users/AdminUserProfile.tsx
    • 관리자 사용자의 프로필 정보를 표시하는 컴포넌트를 추가했습니다.
  • src/components/base-ui/Admin/users/AdminUserTab.tsx
    • 관리자 회원 상세 페이지의 탭 내비게이션 컴포넌트를 추가했습니다.
  • src/components/base-ui/Admin/users/BookStoryList.tsx
    • 관리자 사용자의 책 이야기 목록을 표시하는 컴포넌트를 추가했습니다.
  • src/components/base-ui/Admin/users/MeetingList.tsx
    • 관리자 사용자의 모임 목록을 표시하는 컴포넌트를 추가했습니다.
  • src/components/base-ui/Admin/users/NewsList.tsx
    • 관리자 사용자의 소식 목록을 표시하는 컴포넌트를 추가했습니다.
  • src/components/base-ui/Admin/users/ReportList.tsx
    • 관리자 사용자의 신고 목록을 표시하는 컴포넌트를 추가했습니다.
  • src/components/base-ui/Admin/users/items/AdminBookStoryCard.tsx
    • 관리자 컨텍스트에서 개별 책 이야기를 표시하는 카드 컴포넌트를 추가했습니다.
  • src/components/base-ui/Admin/users/items/AdminMeetingCard.tsx
    • 관리자 컨텍스트에서 개별 모임을 표시하는 카드 컴포넌트를 추가했습니다.
  • src/components/base-ui/Admin/users/items/AdminNewsItem.tsx
    • 관리자 컨텍스트에서 개별 소식 게시물을 표시하는 아이템 컴포넌트를 추가했습니다.
  • src/components/base-ui/Admin/users/items/AdminReportItem.tsx
    • 관리자 컨텍스트에서 개별 신고 항목을 표시하는 아이템 컴포넌트를 추가했습니다.
Activity
  • 현재까지 이 PR에 대한 특별한 활동(댓글, 리뷰 등)은 없습니다.
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
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

관리자 회원 상세 페이지 UI 구현에 대한 변경 사항을 검토했습니다. 전반적으로 UI 구성은 잘 되어 있으나, 더미 데이터 사용 및 API 연동 계획에 따라 몇 가지 개선 사항이 있습니다. 특히, 사용자 상세 페이지에서 특정 사용자의 데이터를 가져와야 하는 컴포넌트들이 현재 로그인한 사용자의 데이터를 가져오는 것으로 보이는 부분이 있습니다. 이 부분은 API 연동 시 수정이 필요해 보입니다.

<dd className="body_1_2 text-Gray-7">{user.name}</dd>

<dt className="body_1_3 text-Gray-4">이름</dt>
<dd className="body_1_2 text-Gray-7">윤현일</dd>
Copy link
Contributor

Choose a reason for hiding this comment

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

high

이름 필드가 "윤현일"로 하드코딩되어 있습니다. user.name 또는 profileData.nickname을 사용하여 동적으로 표시해야 합니다. 현재 user.name아이디 필드에 사용되고 있어 혼란을 줄 수 있습니다.

Suggested change
<dd className="body_1_2 text-Gray-7">윤현일</dd>
<dd className="body_1_2 text-Gray-7">{user.name}</dd>

import { useMyClubsQuery } from "@/hooks/queries/useClubQueries";

const MyMeetingList = () => {
const { data, isLoading, isError } = useMyClubsQuery();
Copy link
Contributor

Choose a reason for hiding this comment

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

high

useMyClubsQuery()는 현재 로그인한 사용자의 모임 목록을 가져오는 훅으로 보입니다. 관리자 페이지에서 특정 사용자의 상세 정보를 볼 때는 [id] 라우트 파라미터에 해당하는 사용자의 모임 목록을 가져오도록 수정해야 합니다. 이는 데이터의 정확성에 영향을 미칠 수 있는 중요한 부분입니다.

<section className="w-[1040px] mx-auto pt-[80px]">
<div className="flex items-start justify-between gap-10">
<div className="flex-1">
<AdminUserProfile />
Copy link
Contributor

Choose a reason for hiding this comment

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

high

AdminUserProfile 컴포넌트가 현재 page.tsx에서 정의된 user 객체를 props로 받지 않고 있습니다. AdminUserProfile 내부에서 useProfileQuery를 사용하여 데이터를 가져오는 것으로 보입니다. 만약 AdminUserProfile[id] 라우트 파라미터에 해당하는 특정 사용자의 프로필을 표시해야 한다면, useProfileQueryid를 전달하거나 page.tsx에서 가져온 user 데이터를 props로 전달하여 일관성을 유지해야 합니다. 현재 page.tsxuser 객체는 사용되지 않고 있습니다.

isFetchingNextPage,
isLoading,
isError,
} = useMyInfiniteStoriesQuery();
Copy link
Contributor

Choose a reason for hiding this comment

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

high

useMyInfiniteStoriesQuery()는 현재 로그인한 사용자의 책 이야기를 가져오는 훅으로 보입니다. 관리자 페이지에서 특정 사용자의 상세 정보를 볼 때는 [id] 라우트 파라미터에 해당하는 사용자의 책 이야기를 가져오도록 수정해야 합니다. 이는 데이터의 정확성에 영향을 미칠 수 있는 중요한 부분입니다.

import MyMeetingCard from "./items/AdminMeetingCard";
import { useMyClubsQuery } from "@/hooks/queries/useClubQueries";

const MyMeetingList = () => {
Copy link
Contributor

Choose a reason for hiding this comment

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

medium

컴포넌트 이름이 MyMeetingList로 되어 있지만, 파일 이름은 MeetingList.tsx입니다. 일관성을 위해 컴포넌트 이름을 파일 이름과 동일하게 MeetingList로 변경하는 것이 좋습니다.

Suggested change
const MyMeetingList = () => {
const MeetingList = () => {

Comment on lines +6 to +20
const reports = [
{
id: 1,
category: "일반",
reporterName: "hy_0716",
content: "부적절한 언어 사용이 있습니다.",
date: "2025.01.01",
},
{
id: 2,
category: "욕설",
reporterName: "user123",
content: "커뮤니티 가이드 위반입니다.",
date: "2025.01.02",
},
Copy link
Contributor

Choose a reason for hiding this comment

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

medium

reports 배열에 더미 데이터가 포함되어 있습니다. 이 부분은 실제 API를 통해 신고 목록을 가져오도록 구현되어야 합니다.

Comment on lines +29 to +32
profileImgSrc = "/profile2.svg",
createdAt,
viewCount,
coverImgSrc = "/bookstorycard.svg",
Copy link
Contributor

Choose a reason for hiding this comment

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

medium

profileImgSrccoverImgSrc의 기본값이 하드코딩된 경로로 설정되어 있습니다. 이러한 이미지 경로는 상수로 관리하거나, 이미지 에셋을 중앙에서 관리하는 유틸리티를 사용하는 것이 좋습니다. 이는 유지보수성을 높이고 '매직 스트링'을 피하는 데 도움이 됩니다.

className="flex items-center justify-center shrink-0"
>
<Image
src="/ant-design_more-outlined.svg"
Copy link
Contributor

Choose a reason for hiding this comment

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

medium

이미지 src"/ant-design_more-outlined.svg"로 하드코딩되어 있습니다. 이 또한 상수로 관리하여 유지보수성을 높이는 것이 좋습니다.

Comment on lines +35 to +40
"w-[1040px] h-[185px] p-[20px]",
"rounded-[8px] border border-Subbrown-4 bg-white",
"justify-between gap-[122px]",
id ? "cursor-pointer hover:opacity-80 transition-opacity" : "",
className,
].join(" ")}
Copy link
Contributor

Choose a reason for hiding this comment

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

medium

조건부 클래스 이름을 처리하기 위해 [].join(" ")을 사용하는 것은 가독성이 떨어질 수 있습니다. clsx 또는 classnames와 같은 라이브러리를 사용하면 더 깔끔하고 유지보수하기 쉬운 코드를 작성할 수 있습니다.

<div className="relative h-[24px] w-[24px] shrink-0">
<Image
src="/profile.svg"
alt="profile"
Copy link
Contributor

Choose a reason for hiding this comment

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

medium

이미지 src"/profile.svg"로 하드코딩되어 있습니다. 이 또한 상수로 관리하여 유지보수성을 높이는 것이 좋습니다.

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.

1 participant