diff --git a/src/app/(protected)/dashboard/[id]/edit/page.tsx b/src/app/(protected)/dashboard/[id]/edit/page.tsx index 58ec974..3f9b6bf 100644 --- a/src/app/(protected)/dashboard/[id]/edit/page.tsx +++ b/src/app/(protected)/dashboard/[id]/edit/page.tsx @@ -9,17 +9,18 @@ import Input from "@/components/form/Input"; import Label from "@/components/form/Label"; import InviteModal from "@/components/modal/InviteModal"; import MyButton from "@/components/common/Button"; -import Pagination from "@/components/common/Pagination"; +import { useQueryClient } from "@tanstack/react-query"; import { getDashboardById, updateDashboard, deleteDashboard, getDashboardInvitations, cancelDashboardInvitation, - // inviteToDashboard, } from "@/features/dashboard/api"; import { getMembers, deleteMember } from "@/features/members/api"; -import { useQueryClient } from "@tanstack/react-query"; + +import InviteList from "@/components/common/dashboard/edit/InviteList"; +import MembersList from "@/components/common/dashboard/edit/MembersList"; export default function DashboardIdEdit() { const { id } = useParams<{ id: string }>(); @@ -221,122 +222,23 @@ export default function DashboardIdEdit() { {/* 구성원 리스트 */} -
-
-

구성원

-
- - {totalMemberPages} 페이지 중 {memberPage} - -
- -
-
-
- {/* 라벨 */} -
- -
- -
+ {/* 초대 내역 */} -
-
-

초대 내역

-
- - {totalInvitePages} 페이지 중 {invitePage} - -
- -
- setInviteOpen(true)} - color="buttonBlue" - className="tablet:flex hidden h-8 w-[105px] items-center justify-center gap-2 rounded-md text-sm" - > - 초대하기 - 초대하기 - -
-
- {/* 모바일 전용 라벨*/} -
- - setInviteOpen(true)} - color="buttonBlue" - className="flex h-[26px] w-[86px] items-center justify-center gap-2 rounded-md text-xs font-medium" - > - 초대하기 - 초대하기 - -
- - {/* tablet+ 전용 라벨 */} -
- -
- -
+ setInviteOpen(true)} + /> {/* 삭제 버튼 */} void; + onCancel: (inviteId: number) => void; + onOpenInviteModal: () => void; +} + +export default function InviteList({ + invites, + page, + totalPages, + setPage, + onCancel, + onOpenInviteModal, +}: InviteListProps) { + return ( +
+
+

초대 내역

+
+ + {Math.max(totalPages, 1)} 페이지 중 {page} + +
+ +
+ + 초대하기 + 초대하기 + +
+
+ + {/* 모바일 전용 라벨 */} +
+ + + 초대하기 + 초대하기 + +
+ + {/* tablet+ 전용 라벨 */} +
+ +
+ +
    + {invites.map((i, idx) => ( +
  • + {i.email} + onCancel(i.id)} + color="buttonBasic" + className="tablet:w-21 tablet:text-sm text-brand-blue-500 h-8 w-13 rounded-md px-3 py-1 text-xs font-medium" + > + 취소 + +
  • + ))} +
+
+ ); +} diff --git a/src/components/common/dashboard/edit/MembersList.tsx b/src/components/common/dashboard/edit/MembersList.tsx new file mode 100644 index 0000000..a0dc8e5 --- /dev/null +++ b/src/components/common/dashboard/edit/MembersList.tsx @@ -0,0 +1,85 @@ +"use client"; + +import MyButton from "@/components/common/Button"; +import Label from "@/components/form/Label"; +import Pagination from "@/components/common/Pagination"; + +type Member = { + id: number; + userId: number; + email: string; + nickname: string; + profileImageUrl?: string; + isOwner?: boolean; +}; + +interface MembersListProps { + members: Member[]; + page: number; + totalPages: number; + setPage: (page: number) => void; + onDeleteMember: (memberId: number) => void; +} + +export default function MembersList({ + members, + page, + totalPages, + setPage, + onDeleteMember, +}: MembersListProps) { + return ( +
+
+

구성원

+
+ + {totalPages} 페이지 중 {page} + +
+ +
+
+
+ + {/* 라벨 */} +
+ +
+ +
    + {members.map((m, idx) => { + const isOwner = m?.isOwner; + + return ( +
  • +
    + {m.nickname} + {m.nickname} +
    + + {!isOwner && ( + onDeleteMember(m.id)} + color="buttonBasic" + className="tablet:w-21 tablet:text-sm text-brand-blue-500 h-8 w-13 rounded-md px-3 py-1 text-xs font-medium" + > + 삭제 + + )} +
  • + ); + })} +
+
+ ); +}