Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
d68c6a9
feat(DEVING-86): 나의 모임에서 모임이 없는 경우 문구 표시
dbswl701 Mar 15, 2025
ac9dd3d
feat(DEVING-86): 댓글 별점, 내용 입력하지 않으면 등록하기 버튼 비활성화
dbswl701 Mar 15, 2025
bb51c87
feat(DEVING-86): 댓글 작성 토스트 수정
dbswl701 Mar 15, 2025
4e69568
fix(DEVING-86): 리뷰 작성 후 별점 반영 수정
dbswl701 Mar 15, 2025
674a1ed
fix(DEVING-86): 모달 내용은 클릭해도 모달 유지되도록 수정
dbswl701 Mar 15, 2025
2196a6a
feat(DEVING-86): 인삿말 없으면 에러 토스트 표시
dbswl701 Mar 15, 2025
6111f1a
feat(DEVING-86): 내가 만든 모임에서 좋아요 제거
dbswl701 Mar 15, 2025
db9d2c9
fix(DEVING-86): 비밀번호 수정 기능 숨김 처리
dbswl701 Mar 15, 2025
e5a4349
fix(DEVING-86): 로그아웃 처리 수정 - 로그아웃 시 캐시 모두 삭제
dbswl701 Mar 15, 2025
eddb3a6
style(DEVING-86): 로그인 반응형
dbswl701 Mar 15, 2025
4584718
style(DEVING-86): 회원가입 세로 마진 추가
dbswl701 Mar 15, 2025
0b622f2
fix(DEVING-86): 회원가입 시 포지션 한글로 수정
dbswl701 Mar 15, 2025
6e1624f
fix(DEVING-86): 상세 조회에서 주최자 여부 표시 수정
dbswl701 Mar 16, 2025
453bf3f
fix(DEVING-86): 모달보다 토스트가 앞에 나오도록 수정
dbswl701 Mar 16, 2025
21f1c16
fix(DEVING-86): 모달을 열면 최상단으로 스크롤 되는 문제 해결
dbswl701 Mar 16, 2025
a4bacf3
fix(DEVING-86): 프로필 보기에서 맴버 리스트로 돌아갔을 떄 맴버 상태 사라지는 문제 해결
dbswl701 Mar 16, 2025
33873e6
fix(DEVING-86): 맴버 프로필 모달에서 상태 수정 시 내가 만든 모임으로 이동
dbswl701 Mar 16, 2025
71d7288
fix(DEVING-86): 회원가입 유효성 검사 수정
dbswl701 Mar 16, 2025
4850cb3
fix(DEVING-86): 로그인 유효성 검사 수정
dbswl701 Mar 16, 2025
729888a
Merge branch 'dev' of https://github.com/MoimService/Moim-FE into fea…
dbswl701 Mar 16, 2025
4ef6f42
style(DEVING-86): GNB 하단에 공간 추가
dbswl701 Mar 16, 2025
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
3 changes: 3 additions & 0 deletions src/app/(user-page)/my-meeting/_features/CardRightSection.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,9 @@ const CardRightSection = ({
);
router.push(
`/my-meeting/my/user-list?meetingId=${meetingId}&type=${showPublicSelect ? 'created' : 'participated'}`,
{
scroll: false,
},
);
};

Expand Down
15 changes: 15 additions & 0 deletions src/app/(user-page)/my-meeting/_features/Created.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
hasNextPage,
isFetchingNextPage,
isLoading,
error,

Check warning on line 20 in src/app/(user-page)/my-meeting/_features/Created.tsx

View workflow job for this annotation

GitHub Actions / check

'error' is assigned a value but never used. Allowed unused vars must match /^_/u
} = useInfiniteMyMeetingManageQueries();

const lastMeetingRef = useInfiniteScroll({
Expand Down Expand Up @@ -61,6 +61,7 @@
className="flex-row"
meetingId={meeting.meetingId}
category={''}
showLikeButton={false}
>
<CardRightSection
memberList={meeting.memberList}
Expand Down Expand Up @@ -91,6 +92,7 @@
className=""
meetingId={meeting.meetingId}
category={''}
showLikeButton={false}
/>
<CardRightSection
memberList={meeting.memberList}
Expand Down Expand Up @@ -120,6 +122,7 @@
className=""
meetingId={meeting.meetingId}
category={''}
showLikeButton={false}
/>
<CardRightSection
memberList={meeting.memberList}
Expand All @@ -133,6 +136,18 @@
))}
</div>
))}
{/* 추가 데이터 로딩 중 표시 */}
{isFetchingNextPage && <MeetingListSkeleton />}

{/* 데이터가 없는 경우 표시 */}
{meetingData.pages[0].content.length === 0 && (
<div className="typo-head3 flex h-[60vh] w-full items-center justify-center text-center text-Cgray500">
<div>
<p className="mb-2">내가 만든 모임이 없어요.</p>
<p>원하는 모임을 만들어보세요!</p>
</div>
</div>
)}
</div>
);
};
Expand Down
2 changes: 1 addition & 1 deletion src/app/(user-page)/my-meeting/_features/Likes.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ const Likes = () => {

{/* 데이터가 없는 경우 표시 */}
{meetingData.pages[0].content.length === 0 && (
<div className="flex h-[60vh] w-full items-center justify-center text-center text-Cgray500">
<div className="typo-head3 flex h-[60vh] w-full items-center justify-center pt-[130px] text-center text-Cgray500">
<div>
<p className="mb-2">찜한 모임이 없어요.</p>
<p>원하는 모임을 찜해보세요!</p>
Expand Down
3 changes: 3 additions & 0 deletions src/app/(user-page)/my-meeting/_features/ModalUserList.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@ const ModalUserList = ({
const handleProfileClick = (user: Member) => {
router.push(
`/my-meeting/my/profile?meetingId=${meetingId}&userId=${user.userId}&memberStatus=${user.memberStatus}`,
{
scroll: false,
},
);
};

Expand Down
2 changes: 1 addition & 1 deletion src/app/(user-page)/my-meeting/_features/Participated.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -223,7 +223,7 @@ const Participated = () => {

{/* 데이터가 없는 경우 표시 */}
{meetingData.pages[0].content.length === 0 && (
<div className="flex h-[60vh] w-full items-center justify-center text-center text-Cgray500">
<div className="typo-head3 flex h-[60vh] w-full items-center justify-center text-center text-Cgray500">
<div>
<p className="mb-2">내가 참여하고있는 모임이 없어요.</p>
<p>원하는 모임에 참가하세요!</p>
Expand Down
9 changes: 6 additions & 3 deletions src/app/(user-page)/my-meeting/_features/Writable.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -48,11 +48,14 @@ const Writable = () => {
return (
<div>
{allMeetings.length === 0 && (
<div className="py-8 text-center text-Cgray500">
리뷰 작성 가능한 모임이 없습니다. <br />
모임에 참여하고 리뷰를 작성해보세요!
<div className="typo-head3 flex h-[60vh] w-full items-center justify-center text-center text-Cgray500">
<div>
<p className="mb-2">리뷰 작성 가능한 모임이 없습니다.</p>
<p>모임에 참여하고 리뷰를 작성해보세요!</p>
</div>
</div>
)}

<div>
{allMeetings.map((meeting) => (
<div key={meeting.meetingId}>
Expand Down
9 changes: 6 additions & 3 deletions src/app/(user-page)/my-meeting/_features/Written.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -50,11 +50,14 @@ const Written = () => {
<div>
{/* 데이터가 없는 경우 표시 */}
{allComments.length === 0 && (
<div className="py-8 text-center text-Cgray500">
작성한 리뷰가 없습니다. <br />
모임에 참여하고 리뷰를 작성해보세요!
<div className="typo-head3 flex h-[60vh] w-full items-center justify-center text-center text-Cgray500">
<div>
<p className="mb-2">작성한 리뷰가 없습니다.</p>
<p>모임에 참여하고 리뷰를 작성해보세요!</p>
</div>
</div>
)}

<div>
{allComments.map((comment) => (
<div key={comment.meetingId}>
Expand Down
11 changes: 7 additions & 4 deletions src/app/(user-page)/my-meeting/my/@modal/(.)profile/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,10 @@ export default function UserListModal({
setMemberStatus: 'APPROVED',
userId: selectedUser.userId,
});
router.replace(`/my-meeting/my?type=created`, { scroll: false });
} else {
router.back();
}

router.replace(`/my-meeting/my/user-list?meetingId=${meetingId}`);
};

const handleSecondModalCancel = () => {
Expand All @@ -54,14 +55,16 @@ export default function UserListModal({
setMemberStatus: 'REJECTED',
userId: selectedUser.userId,
});
router.replace(`/my-meeting/my?type=created`, { scroll: false });
} else if (memberStatus === 'APPROVED') {
expelMutate({
setMemberStatus: 'EXPEL',
userId: selectedUser.userId,
});
router.replace(`/my-meeting/my?type=created`, { scroll: false });
} else {
router.back();
}

router.replace(`/my-meeting/my/user-list?meetingId=${meetingId}`);
};

if (!selectedUser) return <SkeletonProfile />;
Expand Down
3 changes: 3 additions & 0 deletions src/app/(user-page)/my-meeting/my/@modal/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export default function DefaultModal() {
return null; // 기본적으로 모달 없음
}
2 changes: 1 addition & 1 deletion src/app/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
return res.data.data;
} catch (error) {
if (error instanceof AxiosError) {
console.log('error: ', error.status);

Check warning on line 34 in src/app/layout.tsx

View workflow job for this annotation

GitHub Actions / check

Unexpected console statement
}
return null;
}
Expand All @@ -50,7 +50,7 @@
<ReactQueryProviders>
<ToastProvider>
<Header userInfo={userInfo} />
<div className="m-auto max-w-[1340px]">{children}</div>
<div className="m-auto max-w-[1340px] pt-20">{children}</div>
</ToastProvider>
</ReactQueryProviders>
<div id="modal-root" />
Expand Down
10 changes: 4 additions & 6 deletions src/app/login/_features/LoginForm.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import { Button } from '@/components/ui/Button';
import useLoginForm from '@/hooks/useLoginForm';
import Link from 'next/link';

Check warning on line 5 in src/app/login/_features/LoginForm.tsx

View workflow job for this annotation

GitHub Actions / check

'Link' is defined but never used. Allowed unused vars must match /^_/u
import { useRouter } from 'next/navigation';

import EmailInput from './EmailInput';
Expand Down Expand Up @@ -35,14 +35,12 @@
errors={errors}
trigger={trigger}
/>
<div className="flex justify-between sm:hidden sm:flex-col sm:gap-[8px]">
<p className="text-Cgray700 sm:text-[14px]">
비밀번호를 잊으셨나요?
</p>
<Link href="/" className="text-main underline sm:text-[14px]">
{/* <div className="flex justify-between">
<p className="text-Cgray700">비밀번호를 잊으셨나요?</p>
<Link href="/" className="text-main underline">
비밀번호 수정
</Link>
</div>
</div> */}
</div>
</div>
<div className="flex flex-col gap-[16px] sm:gap-[12px]">
Expand Down
18 changes: 12 additions & 6 deletions src/app/meeting/[category]/@modal/[id]/(.)intro-input/page.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
'use client';

import ModalRegisterInput from '@/app/meeting/_features/modal-content/ModalRegisterInput';
import { useToast } from '@/components/common/ToastContext';
import ModalPortal from '@/components/ui/modal/ModalPortal';
import { useMeetingMutation } from '@/hooks/mutations/useMeetingMutation';
import { translateCategoryNameToEng } from '@/util/searchFilter';
Expand All @@ -14,6 +15,7 @@ export default function UserListModal({
}) {
const router = useRouter();
const [value, setValue] = useState('');
const { showToast } = useToast();

const meetingId = Number(params.id);
const category = params.category;
Expand All @@ -33,12 +35,16 @@ export default function UserListModal({
});

const handleConfirm = () => {
mutate({ message: value });
setValue('');
router.push(
`/meeting/${translateCategoryNameToEng(category)}/${meetingId}/intro-input`,
{ scroll: false },
);
if (!value) {
showToast('인삿말을 입력해주세요!', 'error');
} else {
mutate({ message: value });
setValue('');
router.push(
`/meeting/${translateCategoryNameToEng(category)}/${meetingId}/intro-input`,
{ scroll: false },
);
}
};

return (
Expand Down
15 changes: 2 additions & 13 deletions src/app/meeting/_features/CardRightSection.tsx
Original file line number Diff line number Diff line change
@@ -1,15 +1,11 @@
'use client';

import { Button } from '@/components/ui/Button';
import { meetingKeys } from '@/hooks/queries/useMeetingQueries';
import { QUERY_KEYS } from '@/hooks/queries/useMyPageQueries';
import { getAccessToken } from '@/lib/serverActions';
import { getDDay } from '@/util/date';
import { translateCategoryNameToEng } from '@/util/searchFilter';
import { useQueryClient } from '@tanstack/react-query';
import { useRouter } from 'next/navigation';
import { MeetingDetail, MeetingManager } from 'service/api/meeting';
import { IBanner } from 'types/myMeeting';
import { MeetingDetail } from 'service/api/meeting';

const CardRightSection = ({ meeting }: { meeting: MeetingDetail }) => {
const router = useRouter();
Expand All @@ -35,14 +31,7 @@ const CardRightSection = ({ meeting }: { meeting: MeetingDetail }) => {
router.push('/my-meeting/my?type=created');
};

const queryClient = useQueryClient();
const leader = queryClient.getQueryData<MeetingManager>(
meetingKeys.detailInfoUser(meeting.meetingId),
);
const user = queryClient.getQueryData<IBanner>(QUERY_KEYS.banner());

const status =
leader?.email === user?.email ? 'LEADER' : meeting.memberStatus;
const status = meeting.isMeetingManager ? 'LEADER' : meeting.memberStatus;

return (
<div className="flex w-full flex-col justify-end gap-[24px] py-[16px] md:p-[16px] lg:h-[208px] lg:w-[318px]">
Expand Down
4 changes: 3 additions & 1 deletion src/app/meeting/_features/ReviewInput.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,10 @@ import { useState } from 'react';
const ReviewInput = ({ meetingId }: { meetingId: number }) => {
const [selectedRating, setSelectedRating] = useState<number>(0);
const [review, setReview] = useState('');

const { mutate } = useCommentMutation(meetingId);

const isReady = !!selectedRating && !!review;

const handleSubmit = () => {
const req = {
score: selectedRating,
Expand Down Expand Up @@ -42,6 +43,7 @@ const ReviewInput = ({ meetingId }: { meetingId: number }) => {
<Button
className="h-[40px] w-full rounded-[12px] sm:h-full sm:w-[88px]"
onClick={handleSubmit}
disabled={!isReady}
>
등록하기
</Button>
Expand Down
2 changes: 1 addition & 1 deletion src/app/signup/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ export const metadata = {

export default function Signup() {
return (
<div className="flex min-h-screen items-center justify-center">
<div className="my-[80px] flex min-h-screen items-center justify-center">
<SignupForm />
</div>
);
Expand Down
23 changes: 8 additions & 15 deletions src/components/common/Header.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
'use client';

import Logo from '@/assets/icon/logo.svg';
import { useLogoutMutation } from '@/hooks/mutations/useUserMutation';
import { QUERY_KEYS } from '@/hooks/queries/useMyPageQueries';
import { removeAccessToken } from '@/lib/serverActions';
import { translateCategoryNameToKor } from '@/util/searchFilter';
import { useQueryClient } from '@tanstack/react-query';
import { MEETING_TYPES } from 'constants/category/category';
Expand All @@ -15,7 +15,6 @@ import { useEffect, useState } from 'react';
import { IBanner } from 'types/myMeeting';

import Dropdown from './Dropdown';
import { useToast } from './ToastContext';

interface IUserInfo {
userId: number;
Expand All @@ -40,7 +39,8 @@ const BeforeLogin = () => {

const AfterLogin = ({ userInfo }: { userInfo: IUserInfo }) => {
const router = useRouter();
const { showToast } = useToast();
const { mutate } = useLogoutMutation();

const menu = [
{
value: 'mymeeting',
Expand All @@ -55,11 +55,7 @@ const AfterLogin = ({ userInfo }: { userInfo: IUserInfo }) => {
{
value: 'logout',
label: '로그아웃',
onSelect: async () => {
await removeAccessToken();
// 로그아웃 관련 토스트바 노출
showToast('로그아웃 되었습니다.', 'success');
},
onSelect: () => mutate(),
},
];
return (
Expand All @@ -73,7 +69,7 @@ const AfterLogin = ({ userInfo }: { userInfo: IUserInfo }) => {
sideOffset={10}
imageProps={{
component: (
<div className="flex flex-col items-center bg-transparent">
<div className="flex flex-row items-center bg-transparent">
<div className="group relative h-10 w-10">
<div className="absolute inset-0 -m-1 rounded-full border-2 border-white opacity-0 transition-opacity duration-300 group-hover:opacity-100"></div>
<Image
Expand Down Expand Up @@ -119,7 +115,7 @@ const MobileBeforeLogin = () => {
};

const MobileAfterLogin = ({ userInfo }: { userInfo: IUserInfo }) => {
const { showToast } = useToast();
const { mutate } = useLogoutMutation();
return (
<div className="flex flex-col py-[24px]">
<div className="flex flex-col items-center justify-between">
Expand All @@ -140,11 +136,8 @@ const MobileAfterLogin = ({ userInfo }: { userInfo: IUserInfo }) => {
</div>
</div>
<button
className="typo-head3 flex items-center gap-2 self-start p-[16px] text-left text-Cgray500 text-warning hover:text-Cgray700"
onClick={async () => {
await removeAccessToken();
showToast('로그아웃 되었습니다.', 'success');
}}
className="typo-head3 flex items-center gap-2 self-start p-[16px] text-left text-warning hover:text-Cgray700"
onClick={() => mutate()}
>
로그아웃
<LogOut size={16} />
Expand Down
12 changes: 6 additions & 6 deletions src/components/common/PositionSelect.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,22 +11,22 @@ export const PositionSelect = ({
<div className="flex w-full gap-[8px]">
<Chip
className={`flex-1 hover:cursor-pointer`}
isActive={position === 'Frontend'}
onClick={() => setPosition('Frontend')}
isActive={position === '프론트엔드'}
onClick={() => setPosition('프론트엔드')}
>
프론트엔드
</Chip>
<Chip
className={`flex-1 hover:cursor-pointer`}
isActive={position === 'Backend'}
onClick={() => setPosition('Backend')}
isActive={position === '백엔드'}
onClick={() => setPosition('백엔드')}
>
백엔드
</Chip>
<Chip
className={`flex-1 hover:cursor-pointer`}
isActive={position === 'Designer'}
onClick={() => setPosition('Designer')}
isActive={position === '디자이너'}
onClick={() => setPosition('디자이너')}
>
디자이너
</Chip>
Expand Down
2 changes: 1 addition & 1 deletion src/components/common/ToastContext.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ export const ToastProvider = ({ children }: { children: ReactNode }) => {
return (
<ToastContext.Provider value={{ showToast }}>
{children}
<div className="fixed bottom-[40px] left-1/2 flex -translate-x-1/2 transform flex-col gap-2">
<div className="fixed bottom-[40px] left-1/2 z-[60] flex -translate-x-1/2 transform flex-col gap-2">
{toasts.map((toast) => (
<Toast
key={toast.id}
Expand Down
Loading
Loading