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
22 changes: 22 additions & 0 deletions src/app/(user-page)/my-meeting/_features/CardRightSection.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,12 @@
useExpelMutation,
useMemberStatusMutation,
} from '@/hooks/mutations/useMyMeetingMutation';
import { myMeetingKeys } from '@/hooks/queries/useMyMeetingQueries';
import { useBannerQueries } from '@/hooks/queries/useMyPageQueries';
import { useQueryClient } from '@tanstack/react-query';
import Image from 'next/image';
import { useState } from 'react';
import { getMyMeetingMemberProfile } from 'service/api/mymeeting';
import type { Member } from 'types/myMeeting';

import ModalProfile from './ModalProfile';
Expand Down Expand Up @@ -82,10 +85,27 @@
setIsUserProfileModalOpen(true);
};

const queryClient = useQueryClient();

const handlePrefetchProfile = async (member: Member) => {
const queryKey = myMeetingKeys.memberProfile(meetingId, member.userId);

// ์บ์‹œ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธ
const cachedData = queryClient.getQueryData(queryKey);

if (!cachedData) {
await queryClient.prefetchQuery({
queryKey,
queryFn: () =>
getMyMeetingMemberProfile({ meetingId, userId: member.userId }),
});
}
};

Comment on lines +88 to +104
Copy link
Contributor

Choose a reason for hiding this comment

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

onMouseEnter ์— ๊ฑธ์–ด๋‘์…จ๊ตฐ์š” ์ž˜๋ดค์Šต๋‹ˆ๋‹ค!

// ํ”„๋กœํ•„ ๋ณด๊ธฐ ํ•  ์œ ์ €
const [selectedUser, setSelectedUser] = useState<Member | null>(null);

const { data: currentUser, isLoading, error } = useBannerQueries();

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

View workflow job for this annotation

GitHub Actions / check

'error' is assigned a value but never used. Allowed unused vars must match /^_/u
if (isLoading || !currentUser) {
return;
}
Expand Down Expand Up @@ -124,6 +144,7 @@
variant={'outline'}
className="h-[40px] w-[93px]"
onClick={(e) => handleOpenProfileModal(e, member)}
onMouseEnter={() => handlePrefetchProfile(member)}
>
ํ”„๋กœํ•„๋ณด๊ธฐ
</Button>
Expand Down Expand Up @@ -180,6 +201,7 @@
setIsUserProfileModalOpen={setIsUserProfileModalOpen}
setIsUserListModalOpen={setIsUserListModalOpen}
currentUser={currentUser}
handlePrefetchProfile={handlePrefetchProfile}
/>
</Modal>
</div>
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
@@ -1,8 +1,8 @@
import { Tag } from '@/components/ui/Tag';
import { useBannerQueries } from '@/hooks/queries/useMyPageQueries';

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

View workflow job for this annotation

GitHub Actions / check

'useBannerQueries' is defined but never used. Allowed unused vars must match /^_/u
import Image from 'next/image';
import React from 'react';
import { Dispatch, SetStateAction, useState } from 'react';

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

View workflow job for this annotation

GitHub Actions / check

'useState' is defined but never used. Allowed unused vars must match /^_/u
import type { IBanner, Member } from 'types/myMeeting';

import { Button } from '../../../../components/ui/Button';
Expand All @@ -14,13 +14,15 @@
setSelectedUser,
currentUser,
className,
handlePrefetchProfile,
}: {
memberList: Member[];
setSelectedUser: Dispatch<React.SetStateAction<Member | null>>;
setIsUserProfileModalOpen: Dispatch<SetStateAction<boolean>>;
setIsUserListModalOpen: Dispatch<SetStateAction<boolean>>;
currentUser: IBanner;
className?: string;
handlePrefetchProfile: (member: Member) => Promise<void>;
}) => {
const handleProfileClick = (user: Member) => {
setSelectedUser(user);
Expand Down Expand Up @@ -55,6 +57,7 @@
onClick={() => handleProfileClick(user)}
variant="outline"
size="sm"
onMouseEnter={() => handlePrefetchProfile(user)}
>
ํ”„๋กœํ•„ ๋ณด๊ธฐ
</Button>
Expand Down
38 changes: 36 additions & 2 deletions src/app/(user-page)/my-meeting/my/page.tsx
Original file line number Diff line number Diff line change
@@ -1,22 +1,56 @@
import NotYet from '@/components/common/NotYet';
import { myMeetingKeys } from '@/hooks/queries/useMyMeetingQueries';
import { QUERY_KEYS } from '@/hooks/queries/useMyPageQueries';
import {
HydrationBoundary,
QueryClient,
dehydrate,
} from '@tanstack/react-query';
import { getMyMeetingManage } from 'service/api/mymeeting';
import { getBanner } from 'service/api/mypageProfile';
import { Paginated } from 'types/meeting';
import { IMyMeetingManage } from 'types/myMeeting';

import Created from '../_features/Created';
// import Joined from '../../components/Joined';
import Tab from '../_features/Tab';

export default function Page({
export default async function Page({
searchParams,
}: {
searchParams: { type: string };
}) {
const type = searchParams?.type;

const queryClient = new QueryClient();

// ๋ฐฐ๋„ˆ
await queryClient.prefetchQuery({
queryKey: QUERY_KEYS.banner(),
queryFn: () => getBanner(),
});

if (type === 'created') {
// ๋‚ด๊ฐ€ ๋งŒ๋“  ๋ชจ์ž„ ๋ฆฌ์ŠคํŠธ prefetch
await queryClient.prefetchInfiniteQuery({
queryKey: myMeetingKeys.manage(),
queryFn: ({ pageParam }) => getMyMeetingManage(pageParam),
getNextPageParam: (lastPage: Paginated<IMyMeetingManage>) =>
lastPage.nextCursor ?? false,
initialPageParam: 0,
Copy link
Contributor

Choose a reason for hiding this comment

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

ํ•œ๋‚˜๋‹˜์€ 1๋กœ ์œค์ง€๋‹˜์€ 0์œผ๋กœ ์„ค์ • ํ•˜์…จ๋„ค์šฉ? ์‹œ์ž‘ ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ๊ฐ€ 0์ธ์ง€ 1์ธ์ง€ ํ™•์ธ ํ›„์— ๋งž์ถ”์‹œ๋ฉด ๋  ๊ฑฐ ๊ฐ™์Šต๋‹ˆ๋‹ค!

});
} else {
// ์ฐธ์—ฌ ์ค‘์ธ ๋ชจ์ž„ prefetch
}

return (
<div>
<div className="mt-6 flex flex-col gap-[24px]">
<Tab type={type} />
</div>
{type === 'created' ? <Created /> : <NotYet />}
<HydrationBoundary state={dehydrate(queryClient)}>
{type === 'created' ? <Created /> : <NotYet />}
</HydrationBoundary>
</div>
);
}
4 changes: 3 additions & 1 deletion src/hooks/queries/useMyMeetingQueries.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ import {
getMyMeetingManage,
getMyMeetingMemberProfile,
} from 'service/api/mymeeting';
import { Paginated } from 'types/meeting';
import { IMyMeetingManage } from 'types/myMeeting';

export const myMeetingKeys = {
all: ['mymeeting'] as const,
Expand All @@ -19,7 +21,7 @@ export const useInfiniteMyMeetingManageQueries = () => {
queryKey: myMeetingKeys.manage(),
queryFn: ({ pageParam }) => getMyMeetingManage(pageParam),
initialPageParam: 0,
getNextPageParam: (lastPage, pages) => {
getNextPageParam: (lastPage: Paginated<IMyMeetingManage>, pages) => {
console.log('[mutation] lastPage: ', lastPage);
return lastPage.nextCursor ?? null;
},
Expand Down
Loading