Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 0 additions & 49 deletions src/app/(team)/team/_components/MemberList/BreakEmail.tsx

This file was deleted.

30 changes: 14 additions & 16 deletions src/app/(team)/team/_components/MemberList/MemberCard.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import UserIcon from '@/components/user/UserIcon';
import BreakEmail from '@/app/(team)/team/_components/MemberList/BreakEmail';
import MemberMenu from '@/app/(team)/team/_components/MemberList/MemberMenu';
import MemberProfileModal from '@/components/common/Modal/content/MemberProfileModal';
import { useModalStore } from '@/store/useModalStore';
Expand All @@ -8,7 +7,9 @@ import { GroupResponse } from '@/lib/apis/group/type';
import {
memberCardContainerStyle,
memberCardItemWrapperStyle,
memberCardTextWrapperStyle,
memberCardProfileWrapperStyle,
memberCardNameStyle,
memberCardEmailStyle,
} from '@/app/(team)/team/_components/MemberList/styles';
import { toast } from 'react-toastify';
import { TOAST_MESSAGES } from '@/constants/messages';
Expand Down Expand Up @@ -68,28 +69,25 @@ const MemberCard = ({
}}
className={`${memberCardContainerStyle}`}
>
{/* 아이템 래퍼 */}
{/* left item */}
<div className={`${memberCardItemWrapperStyle}`}>
<div className="tablet:h-[33px] tablet:w-[146px] flex items-center gap-3">
{/* 프로필 아이콘 */}
{/* 프로필 아이콘 */}
<div className={`${memberCardProfileWrapperStyle}`}>
<UserIcon
image={profileImage}
sizeClass="tablet:size-8 size-6"
imageSize="32px"
/>

{/* 이름 + 이메일 */}
<div className={`${memberCardTextWrapperStyle}`}>
<p className="text-md-regular">{name}</p>
<BreakEmail email={email} />
</div>
</div>

{/* 메뉴 버튼 */}
{isAdmin && userId !== memberId && (
<MemberMenu memberId={memberId} name={name} onDelete={onDelete} />
)}
{/* 이름 */}
<p className={`${memberCardNameStyle}`}>{name}</p>
{/* 이메일 */}
<p className={`${memberCardEmailStyle}`}>{email}</p>
</div>
{/* 메뉴 버튼 */}
{isAdmin && userId !== memberId && (
<MemberMenu memberId={memberId} name={name} onDelete={onDelete} />
)}
</div>
);
};
Expand Down
2 changes: 1 addition & 1 deletion src/app/(team)/team/_components/MemberList/MemberMenu.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ const MemberMenu = ({ memberId, name, onDelete }: MemberMenuProps) => {

return (
<DropDown>
<DropDown.Trigger className="mb-0">
<DropDown.Trigger className="mb-0 shrink-0">
<TaskMenuButton size="sm" />
</DropDown.Trigger>
<DropDown.Menu align="right" className="mt-2 h-[40px] w-[120px]">
Expand Down
28 changes: 19 additions & 9 deletions src/app/(team)/team/_components/MemberList/styles.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,18 +21,28 @@ export const memberCardContainerStyle = clsx(
'flex items-center justify-center',
'laptop:max-w-[384px] tablet:h-[73px] h-[68px] min-w-0',
'bg-slate-800',
'p-3 rounded-[16px]',
'px-6 rounded-[16px]',
'cursor-pointer'
);

export const memberCardItemWrapperStyle = clsx(
'flex items-center justify-between',
'laptop:max-w-[336px] h-full',
'w-full'
export const memberCardItemWrapperStyle =
'grid grid-cols-[min-content_1fr] grid-rows-[auto_auto] gap-x-3 w-full';

export const memberCardProfileWrapperStyle = clsx(
'tablet:row-span-2 tablet:items-center',
'flex flex-col col-span-1 row-span-1 items-start justify-center'
);

export const memberCardTextWrapperStyle = clsx(
'flex flex-col justify-center gap-0.5',
'laptop:max-w-[200px] tablet:max-w-[120px] max-w-[85px]',
'w-full'
export const memberCardNameStyle = clsx(
'text-md-medium',
'col-span-1 col-start-2 row-span-1 row-start-1 self-center text-left',
'truncate'
);

export const memberCardEmailStyle = clsx(
'text-xs-regular text-slate-300',
'tablet:col-span-1 tablet:col-start-2',
'col-span-2 col-start-1 row-span-1 row-start-2 text-left',
'mt-0.5',
'truncate'
);
2 changes: 1 addition & 1 deletion src/app/(team)/team/_components/ReportBanner/styles.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ export const reportCardsWrapperStyle = clsx(
export const reportCardContainerStyle = clsx(
'flex items-center justify-center',
'max-w-[400px]',
'laptop:h-[76.5px] h-[80px] w-full min-w-0 p-4',
'h-[77px] w-full min-w-0 p-4',
'bg-slate-700',
RADIUS
);
Expand Down
71 changes: 71 additions & 0 deletions src/app/(team)/team/_components/TeamBanner/TeamBannerMenu.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
import DropDown from '@/components/common/Dropdown';
import IconRenderer from '@/components/common/Icons/IconRenderer';
import { useIsAdmin } from '@/hooks/useIsAdmin';
import { deleteGroupMemberById } from '@/lib/apis/group';
import { GroupResponse } from '@/lib/apis/group/type';
import { useModalStore } from '@/store/useModalStore';
import { useRouter } from 'next/navigation';
import { ROUTES } from '@/constants/routes';
import { toast } from 'react-toastify';

interface TeamBannerMenuProps {
group: GroupResponse;
userId: number;
}

const TeamBannerMenu = ({ group, userId }: TeamBannerMenuProps) => {
const router = useRouter();
const isAdmin = useIsAdmin({ membersData: group.members, userId });
const { openModal } = useModalStore();

const handleTeamLeave = async () => {
try {
await deleteGroupMemberById({ groupId: group.id, memberId: userId });
router.push(ROUTES.HOME);
toast.success(`'${group.name}' 팀을 탈퇴했습니다.`);
} catch (error) {
console.error('탈퇴 실패', error);
toast.error('탈퇴에 실패했습니다. 잠시 후 다시 시도해 주세요.');
}
};

const openTeamLeaveModal = () => {
openModal({
variant: 'danger',
title: `'${group.name}' 팀에서 나가시겠어요?`,
button: {
number: 2,
text: '확인',
onRequest: () => handleTeamLeave(),
},
});
};

if (isAdmin) {
return (
<IconRenderer
onClick={() => router.push(ROUTES.TEAM_EDIT(group.id))}
name="GearIcon"
className="cursor-pointer"
/>
);
}

return (
<DropDown>
<DropDown.Trigger>
<IconRenderer name="GearIcon" className="cursor-pointer" />
</DropDown.Trigger>
<DropDown.Menu align="right" className="mt-2 h-[40px] w-[120px]">
<DropDown.Item
onClick={openTeamLeaveModal}
className="text-md-regular h-[38px] w-full"
>
탈퇴하기
</DropDown.Item>
</DropDown.Menu>
</DropDown>
);
};

export default TeamBannerMenu;
33 changes: 0 additions & 33 deletions src/app/(team)/team/_components/TeamBanner/TeamMenu.tsx

This file was deleted.

7 changes: 2 additions & 5 deletions src/app/(team)/team/_components/TeamBanner/index.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
'use client';
import Image from 'next/image';
import TeamDropdownMenu from '@/app/(team)/team/_components/TeamBanner/TeamMenu';
import TeamBannerMenu from '@/app/(team)/team/_components/TeamBanner/TeamBannerMenu';
import GradientScrollable from '@/components/common/Scroll/GradientScrollable';
import { useIsAdmin } from '@/hooks/useIsAdmin';
import { GroupResponse } from '@/lib/apis/group/type';
import {
teamBannerWrapperStyle,
Expand All @@ -17,8 +16,6 @@ const TeamBanner = ({
group: GroupResponse;
userId: number;
}) => {
const isAdmin = useIsAdmin({ membersData: group.members, userId });

return (
<div className={`${teamBannerWrapperStyle}`}>
<Image
Expand All @@ -34,7 +31,7 @@ const TeamBanner = ({
<GradientScrollable>{group.name}</GradientScrollable>
</div>

{isAdmin && <TeamDropdownMenu group={group} />}
<TeamBannerMenu group={group} userId={userId} />
</div>
);
};
Expand Down