From a4131493bf65e4fd13ee8c1fd5112889d16794cb Mon Sep 17 00:00:00 2001 From: yejinleee Date: Wed, 21 Jan 2026 19:53:25 +0900 Subject: [PATCH 1/3] =?UTF-8?q?fix:=20=EC=A3=BC=EC=B5=9C=EC=9E=90=20?= =?UTF-8?q?=ED=88=AC=ED=91=9C=20=EB=B6=88=EA=B0=80=20=EC=9D=B4=EC=8A=88=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/meet/[meetingId]/page.tsx | 5 ++++- src/entities/meet/dto/meet.dto.ts | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/app/meet/[meetingId]/page.tsx b/src/app/meet/[meetingId]/page.tsx index 75f48fd..58fba0c 100644 --- a/src/app/meet/[meetingId]/page.tsx +++ b/src/app/meet/[meetingId]/page.tsx @@ -15,11 +15,14 @@ function getStatsFromParticipants( candidateDates: string[], participants: Participant[], ) { + // 투표한 참여자만 필터링 + const votedParticipants = participants.filter((p) => p.hasVoted); + return candidateDates.map((date) => { const can: Person[] = []; const cannot: Person[] = []; - participants.forEach((p) => { + votedParticipants.forEach((p) => { if (p.voteDates.includes(date)) { can.push({ id: String(p.id), name: p.name }); } else { diff --git a/src/entities/meet/dto/meet.dto.ts b/src/entities/meet/dto/meet.dto.ts index 83808ac..b8effb1 100644 --- a/src/entities/meet/dto/meet.dto.ts +++ b/src/entities/meet/dto/meet.dto.ts @@ -35,6 +35,7 @@ export const participantDto = z.object({ id: z.number(), name: z.string(), voteDates: z.array(z.string()), + hasVoted: z.boolean(), }); /** From 41dc27bc77f603e38c76c6059497312569796797 Mon Sep 17 00:00:00 2001 From: yejinleee Date: Wed, 21 Jan 2026 19:58:44 +0900 Subject: [PATCH 2/3] =?UTF-8?q?fix:=20=EB=82=A0=EC=A7=9C=20=EC=84=A0?= =?UTF-8?q?=ED=83=9D=20>=20=EC=8A=A4=ED=81=AC=EB=A1=A4=20=ED=95=98?= =?UTF-8?q?=EB=8B=A8=20=EB=B2=84=ED=8A=BC=20=EA=B0=80=EB=A6=AC=EC=A7=80=20?= =?UTF-8?q?=EC=95=8A=EB=8F=84=EB=A1=9D=20=ED=95=B4=EC=A3=BC=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vote-results-calendar/ui/VoteResultsShell.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/features/vote-results-calendar/ui/VoteResultsShell.tsx b/src/features/vote-results-calendar/ui/VoteResultsShell.tsx index 9b8fae7..582fefd 100644 --- a/src/features/vote-results-calendar/ui/VoteResultsShell.tsx +++ b/src/features/vote-results-calendar/ui/VoteResultsShell.tsx @@ -26,12 +26,12 @@ export function VoteResultsShell({ // Scroll to detail when opened useEffect(() => { if (selectedDate && detailRef.current) { - calendarRef?.current?.scrollIntoView({ + detailRef.current.scrollIntoView({ behavior: 'smooth', - block: 'start', + block: 'end', }); } - }, [selectedDate, calendarRef]); + }, [selectedDate]); return (
@@ -44,7 +44,7 @@ export function VoteResultsShell({ {selectedDate && (
From 05f622a02c3f4e0891dbc165161d70a7ffc0863b Mon Sep 17 00:00:00 2001 From: yejinleee Date: Wed, 21 Jan 2026 20:01:39 +0900 Subject: [PATCH 3/3] =?UTF-8?q?feat:=20=EB=A9=94=ED=83=80=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=84=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/layout.tsx | 4 ++-- src/app/meet/[meetingId]/page.tsx | 34 ++++++++++++++++++++++++------- 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 57a4dc8..5c5dc61 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -14,8 +14,8 @@ const geistMono = Geist_Mono({ }); export const metadata: Metadata = { - title: 'Create Next App', - description: 'Generated by create next app', + title: 'MOIT | 모두의 만남을 잇다, 모잇', + description: '모잇으로 모임 일정을 쉽게 조율해보세요', }; export default function RootLayout({ diff --git a/src/app/meet/[meetingId]/page.tsx b/src/app/meet/[meetingId]/page.tsx index 58fba0c..c9cc82a 100644 --- a/src/app/meet/[meetingId]/page.tsx +++ b/src/app/meet/[meetingId]/page.tsx @@ -1,3 +1,4 @@ +import { Metadata } from 'next'; import Link from 'next/link'; import { getMeetingById } from '@/entities/meet/api/getMeetingById'; @@ -10,6 +11,31 @@ import { VoteResultDataView } from '@/widgets/vote-result/ui/VoteResultDataView' import ParticipantHeader from './ParticipantHeader'; +interface PageProps { + params: Promise<{ + meetingId: string; + }>; +} + +export async function generateMetadata({ + params, +}: PageProps): Promise { + const { meetingId } = await params; + + try { + const meetingData = await getMeetingById(meetingId); + return { + title: `${meetingData.hostName}님이 초대한 ${meetingData.title}`, + description: 'MOIT | 모두의 만남을 잇다, 모잇', + }; + } catch { + return { + title: 'MOIT | 모두의 만남을 잇다, 모잇', + description: '모잇으로 모임 일정을 쉽게 조율해보세요', + }; + } +} + // Transform Logic function getStatsFromParticipants( candidateDates: string[], @@ -38,13 +64,7 @@ function getStatsFromParticipants( }); } -interface ResultPageProps { - params: Promise<{ - meetingId: string; - }>; -} - -export default async function ResultPage({ params }: ResultPageProps) { +export default async function ResultPage({ params }: PageProps) { const { meetingId } = await params; // Fetch meeting data from API const meetingData = await getMeetingById(meetingId);