From a163505f120c02e2fcefedf70a7e0d1139a92387 Mon Sep 17 00:00:00 2001 From: Shawn Kang Date: Tue, 18 Nov 2025 12:43:39 +0900 Subject: [PATCH 01/25] =?UTF-8?q?feat:=20=EC=8B=9C=EA=B0=84=ED=91=9C?= =?UTF-8?q?=EB=A1=9C=20=EB=8F=8C=EC=95=84=EA=B0=80=EA=B8=B0=20=EB=B2=84?= =?UTF-8?q?=ED=8A=BC=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/GoToOverviewButton.tsx | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/page/DebateEndPage/components/GoToOverviewButton.tsx diff --git a/src/page/DebateEndPage/components/GoToOverviewButton.tsx b/src/page/DebateEndPage/components/GoToOverviewButton.tsx new file mode 100644 index 00000000..5a789ea7 --- /dev/null +++ b/src/page/DebateEndPage/components/GoToOverviewButton.tsx @@ -0,0 +1,27 @@ +import { TbCalendarTime } from 'react-icons/tb'; +import { useNavigate } from 'react-router-dom'; + +interface GoToOverviewButtonProps { + tableId: number; +} + +export default function GoToOverviewButton({ + tableId, +}: GoToOverviewButtonProps) { + const navigate = useNavigate(); + const handleClick = (tableId: number) => { + navigate(`/overview/customize/${tableId}`); + }; + + return ( + + ); +} From 52885725bcfad4c103f5b87d897b767f5c920110 Mon Sep 17 00:00:00 2001 From: Shawn Kang Date: Tue, 18 Nov 2025 12:44:00 +0900 Subject: [PATCH 02/25] =?UTF-8?q?feat:=20=ED=86=A0=EB=A1=A0=20=EC=A2=85?= =?UTF-8?q?=EB=A3=8C=20=ED=99=94=EB=A9=B4=EC=97=90=20=EC=8B=9C=EA=B0=84?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EB=8F=8C=EC=95=84=EA=B0=80=EA=B8=B0=20?= =?UTF-8?q?=EB=B2=84=ED=8A=BC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/page/DebateEndPage/DebateEndPage.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/page/DebateEndPage/DebateEndPage.tsx b/src/page/DebateEndPage/DebateEndPage.tsx index bb535cf2..4a51e817 100644 --- a/src/page/DebateEndPage/DebateEndPage.tsx +++ b/src/page/DebateEndPage/DebateEndPage.tsx @@ -3,9 +3,9 @@ import { useNavigate, useParams } from 'react-router-dom'; import clapImage from '../../assets/debateEnd/clap.png'; import feedbackTimerImage from '../../assets/debateEnd/feedback_timer.png'; import voteStampImage from '../../assets/debateEnd/vote_stamp.png'; -import GoToHomeButton from '../../components/GoToHomeButton/GoToHomeButton'; import usePostPoll from '../../hooks/mutations/useCreatePoll'; import MenuCard from './components/MenuCard'; +import GoToOverviewButton from './components/GoToOverviewButton'; export default function DebateEndPage() { const { id: tableId } = useParams(); @@ -64,7 +64,7 @@ export default function DebateEndPage() {
- +
); From 78dc92498995840888513bd95fd644582a5c6e0f Mon Sep 17 00:00:00 2001 From: Shawn Kang Date: Tue, 18 Nov 2025 13:03:55 +0900 Subject: [PATCH 03/25] =?UTF-8?q?feat:=20=ED=86=A0=EB=A1=A0=20=EC=A2=85?= =?UTF-8?q?=EB=A3=8C=20=ED=99=94=EB=A9=B4=EC=9C=BC=EB=A1=9C=20=EB=8F=8C?= =?UTF-8?q?=EC=95=84=EA=B0=80=EA=B8=B0=20=EB=B2=84=ED=8A=BC=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GoToDebateEndButton.tsx | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 src/components/GoToDebateEndButton/GoToDebateEndButton.tsx diff --git a/src/components/GoToDebateEndButton/GoToDebateEndButton.tsx b/src/components/GoToDebateEndButton/GoToDebateEndButton.tsx new file mode 100644 index 00000000..422f6ed3 --- /dev/null +++ b/src/components/GoToDebateEndButton/GoToDebateEndButton.tsx @@ -0,0 +1,25 @@ +import { useNavigate } from 'react-router-dom'; + +interface GoToDebateEndButtonProps { + tableId: number; +} + +export default function GoToDebateEndButton({ + tableId, +}: GoToDebateEndButtonProps) { + const navigate = useNavigate(); + const handleClick = (tableId: number) => { + navigate(`/table/customize/${tableId}/end`); + }; + + return ( + + ); +} From 824ee2a72de324c4bfec001d6538d419c9c5696e Mon Sep 17 00:00:00 2001 From: Shawn Kang Date: Tue, 18 Nov 2025 13:04:10 +0900 Subject: [PATCH 04/25] =?UTF-8?q?feat:=20=ED=94=BC=EB=93=9C=EB=B0=B1=20?= =?UTF-8?q?=ED=83=80=EC=9D=B4=EB=A8=B8=EC=97=90=20=EB=8F=8C=EC=95=84?= =?UTF-8?q?=EA=B0=80=EA=B8=B0=20=EB=B2=84=ED=8A=BC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/page/TimerPage/FeedbackTimerPage.tsx | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/page/TimerPage/FeedbackTimerPage.tsx b/src/page/TimerPage/FeedbackTimerPage.tsx index cbb607bf..36483355 100644 --- a/src/page/TimerPage/FeedbackTimerPage.tsx +++ b/src/page/TimerPage/FeedbackTimerPage.tsx @@ -2,14 +2,23 @@ import { useEffect } from 'react'; import { useFeedbackTimer } from './hooks/useFeedbackTimer'; import FeedbackTimer from './components/FeedbackTimer'; import DefaultLayout from '../../layout/defaultLayout/DefaultLayout'; -import GoToHomeButton from '../../components/GoToHomeButton/GoToHomeButton'; +import GoToDebateEndButton from '../../components/GoToDebateEndButton/GoToDebateEndButton'; +import { useParams } from 'react-router-dom'; const INITIAL_TIME = 0; export default function FeedbackTimerPage() { const feedbackTimerInstance = useFeedbackTimer(); + const { id } = useParams(); + const rawTableId = Number(id); const { setTimer, setDefaultTimer } = feedbackTimerInstance; + // 테이블 ID 검증 로직 + if (rawTableId === null || isNaN(Number(rawTableId))) { + throw new Error('테이블 ID가 올바르지 않습니다.'); + } + const tableId = rawTableId ? Number(rawTableId) : 0; + useEffect(() => { // 페이지가 로드될 때 타이머의 초기 시간을 설정 setTimer(INITIAL_TIME); @@ -23,7 +32,7 @@ export default function FeedbackTimerPage() {
- +
From ff2f32d05dbe5b26c39165aef8848a780f8374ce Mon Sep 17 00:00:00 2001 From: Shawn Kang Date: Tue, 18 Nov 2025 13:58:00 +0900 Subject: [PATCH 05/25] =?UTF-8?q?feat:=20=ED=88=AC=ED=91=9C=20URL=EC=9D=B4?= =?UTF-8?q?=20=ED=85=8C=EC=9D=B4=EB=B8=94=20ID=EB=8F=84=20=ED=91=9C?= =?UTF-8?q?=EA=B8=B0=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/routes/routes.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/routes/routes.tsx b/src/routes/routes.tsx index 9bf5a5d5..6310ae14 100644 --- a/src/routes/routes.tsx +++ b/src/routes/routes.tsx @@ -55,12 +55,12 @@ const routesConfig = [ requiresAuth: true, }, { - path: '/table/customize/:id/end/vote', + path: '/table/customize/:tableId/end/vote/:pollId', element: , requiresAuth: true, }, { - path: '/table/customize/:id/end/vote/result', + path: '/table/customize/:tableId/end/vote/:pollId/result', element: , requiresAuth: true, }, From 00a8f5d55218f4cd276078a9da4e0f2652d22c8f Mon Sep 17 00:00:00 2001 From: Shawn Kang Date: Tue, 18 Nov 2025 13:58:23 +0900 Subject: [PATCH 06/25] =?UTF-8?q?feat:=20URL=20=EB=B3=80=EA=B2=BD=20?= =?UTF-8?q?=EC=82=AC=ED=95=AD=20=EA=B4=80=EB=A0=A8=20=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=EC=97=90=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/page/DebateEndPage/DebateEndPage.tsx | 2 +- src/page/DebateVotePage/DebateVotePage.tsx | 22 +++++++++++++++------- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/page/DebateEndPage/DebateEndPage.tsx b/src/page/DebateEndPage/DebateEndPage.tsx index 4a51e817..03809314 100644 --- a/src/page/DebateEndPage/DebateEndPage.tsx +++ b/src/page/DebateEndPage/DebateEndPage.tsx @@ -16,7 +16,7 @@ export default function DebateEndPage() { }; const handleVoteClick = (pollId: number) => { - navigate(`/table/customize/${pollId}/end/vote`); + navigate(`/table/customize/${tableId}/end/vote/${pollId}`); }; const { mutate } = usePostPoll(handleVoteClick); const backgroundStyle = { diff --git a/src/page/DebateVotePage/DebateVotePage.tsx b/src/page/DebateVotePage/DebateVotePage.tsx index dd08bcb1..f2fcfe5b 100644 --- a/src/page/DebateVotePage/DebateVotePage.tsx +++ b/src/page/DebateVotePage/DebateVotePage.tsx @@ -6,25 +6,31 @@ import { useGetPollInfo } from '../../hooks/query/useGetPollInfo'; import ErrorIndicator from '../../components/ErrorIndicator/ErrorIndicator'; import useFetchEndPoll from '../../hooks/mutations/useFetchEndPoll'; export default function DebateVotePage() { - const { id: pollIdParam } = useParams(); - const pollId = pollIdParam ? Number(pollIdParam) : NaN; - const isValidPollId = !!pollIdParam && !Number.isNaN(pollId); const navigate = useNavigate(); const baseUrl = import.meta.env.MODE !== 'production' ? undefined : import.meta.env.VITE_SHARE_BASE_URL; + + // 매개변수 검증 + const { pollId: rawPollId, tableId: rawTableId } = useParams(); + const pollId = rawPollId ? Number(rawPollId) : NaN; + const isPollIdValid = !!rawPollId && !Number.isNaN(pollId); + const tableId = rawTableId ? Number(rawTableId) : NaN; + const isTableIdValid = !!rawTableId && !Number.isNaN(tableId); + const isArgsValid = isPollIdValid && isTableIdValid; + const voteUrl = useMemo(() => { return `${baseUrl}/vote/${pollId}`; }, [baseUrl, pollId]); const handleGoToResult = () => { - navigate(`/table/customize/${pollId}/end/vote/result`); + navigate(`/table/customize/${tableId}/end/vote/result/${pollId}`); }; - const handleGoHome = () => { navigate('/'); }; + const { data, isLoading: isFetching, @@ -32,7 +38,7 @@ export default function DebateVotePage() { isRefetching, refetch, isRefetchError, - } = useGetPollInfo(pollId, { refetchInterval: 5000, enabled: isValidPollId }); + } = useGetPollInfo(pollId, { refetchInterval: 5000, enabled: isPollIdValid }); const { mutate } = useFetchEndPoll(handleGoToResult); const participants = data?.voterNames; @@ -48,7 +54,8 @@ export default function DebateVotePage() { ); } - if (!isValidPollId) { + + if (!isArgsValid) { return ( @@ -59,6 +66,7 @@ export default function DebateVotePage() { ); } + return ( From 955a9eafb578287b22a9015c2d74f3cf07a0c816 Mon Sep 17 00:00:00 2001 From: Shawn Kang Date: Tue, 18 Nov 2025 14:15:08 +0900 Subject: [PATCH 07/25] =?UTF-8?q?refactor:=20=EB=B2=84=ED=8A=BC=EB=93=A4?= =?UTF-8?q?=EC=9D=B4=20`className`=20=EB=B0=9B=EC=9D=84=20=EC=88=98=20?= =?UTF-8?q?=EC=9E=88=EA=B2=8C=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GoToDebateEndButton/GoToDebateEndButton.tsx | 10 ++++++++-- .../DebateEndPage/components/GoToOverviewButton.tsx | 8 +++++++- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/components/GoToDebateEndButton/GoToDebateEndButton.tsx b/src/components/GoToDebateEndButton/GoToDebateEndButton.tsx index 422f6ed3..b2d9943b 100644 --- a/src/components/GoToDebateEndButton/GoToDebateEndButton.tsx +++ b/src/components/GoToDebateEndButton/GoToDebateEndButton.tsx @@ -1,11 +1,14 @@ +import clsx from 'clsx'; import { useNavigate } from 'react-router-dom'; interface GoToDebateEndButtonProps { tableId: number; + className?: string; } export default function GoToDebateEndButton({ tableId, + className = '', }: GoToDebateEndButtonProps) { const navigate = useNavigate(); const handleClick = (tableId: number) => { @@ -17,9 +20,12 @@ export default function GoToDebateEndButton({ type="button" aria-label="토론 종료 화면으로 돌아가기" onClick={() => handleClick(tableId)} - className="button enabled neutral flex w-[492px] flex-row space-x-2 rounded-full p-[24px]" + className={clsx( + 'button enabled neutral flex flex-row rounded-full p-[24px]', + className, + )} > - 토론 종료 화면으로 돌아가기 → + 뒤로 가기 → ); } diff --git a/src/page/DebateEndPage/components/GoToOverviewButton.tsx b/src/page/DebateEndPage/components/GoToOverviewButton.tsx index 5a789ea7..3926830a 100644 --- a/src/page/DebateEndPage/components/GoToOverviewButton.tsx +++ b/src/page/DebateEndPage/components/GoToOverviewButton.tsx @@ -1,12 +1,15 @@ +import clsx from 'clsx'; import { TbCalendarTime } from 'react-icons/tb'; import { useNavigate } from 'react-router-dom'; interface GoToOverviewButtonProps { tableId: number; + className?: string; } export default function GoToOverviewButton({ tableId, + className = '', }: GoToOverviewButtonProps) { const navigate = useNavigate(); const handleClick = (tableId: number) => { @@ -18,7 +21,10 @@ export default function GoToOverviewButton({ type="button" aria-label="시간표로 돌아가기" onClick={() => handleClick(tableId)} - className="button enabled neutral flex w-[492px] flex-row space-x-2 rounded-full p-[24px]" + className={clsx( + 'button enabled neutral flex flex-row space-x-2 rounded-full p-[24px]', + className, + )} >

시간표로 돌아가기

From 9a3509b2508f1e25117f24d7159609f8930fc7fe Mon Sep 17 00:00:00 2001 From: Shawn Kang Date: Tue, 18 Nov 2025 14:16:47 +0900 Subject: [PATCH 08/25] =?UTF-8?q?refactor:=20=EB=B2=84=ED=8A=BC=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=20=EC=82=AC=ED=95=AD=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/page/DebateEndPage/DebateEndPage.tsx | 2 +- src/page/DebateVotePage/DebateVotePage.tsx | 14 +++----------- src/page/TimerPage/FeedbackTimerPage.tsx | 2 +- 3 files changed, 5 insertions(+), 13 deletions(-) diff --git a/src/page/DebateEndPage/DebateEndPage.tsx b/src/page/DebateEndPage/DebateEndPage.tsx index 03809314..db13a1a2 100644 --- a/src/page/DebateEndPage/DebateEndPage.tsx +++ b/src/page/DebateEndPage/DebateEndPage.tsx @@ -64,7 +64,7 @@ export default function DebateEndPage() {
- +
); diff --git a/src/page/DebateVotePage/DebateVotePage.tsx b/src/page/DebateVotePage/DebateVotePage.tsx index f2fcfe5b..337c7602 100644 --- a/src/page/DebateVotePage/DebateVotePage.tsx +++ b/src/page/DebateVotePage/DebateVotePage.tsx @@ -5,6 +5,7 @@ import DefaultLayout from '../../layout/defaultLayout/DefaultLayout'; import { useGetPollInfo } from '../../hooks/query/useGetPollInfo'; import ErrorIndicator from '../../components/ErrorIndicator/ErrorIndicator'; import useFetchEndPoll from '../../hooks/mutations/useFetchEndPoll'; +import GoToDebateEndButton from '../../components/GoToDebateEndButton/GoToDebateEndButton'; export default function DebateVotePage() { const navigate = useNavigate(); const baseUrl = @@ -27,9 +28,6 @@ export default function DebateVotePage() { const handleGoToResult = () => { navigate(`/table/customize/${tableId}/end/vote/result/${pollId}`); }; - const handleGoHome = () => { - navigate('/'); - }; const { data, @@ -120,17 +118,11 @@ export default function DebateVotePage() { - + diff --git a/src/page/TimerPage/FeedbackTimerPage.tsx b/src/page/TimerPage/FeedbackTimerPage.tsx index 36483355..6f8248d8 100644 --- a/src/page/TimerPage/FeedbackTimerPage.tsx +++ b/src/page/TimerPage/FeedbackTimerPage.tsx @@ -32,7 +32,7 @@ export default function FeedbackTimerPage() {
- +
From e02980bea9bff3a5abd1a17dc62f294b970067f3 Mon Sep 17 00:00:00 2001 From: Shawn Kang Date: Tue, 18 Nov 2025 14:17:29 +0900 Subject: [PATCH 09/25] =?UTF-8?q?fix:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EB=B0=B0=EA=B2=BD=EC=83=89=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/page/DebateVotePage/DebateVotePage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/page/DebateVotePage/DebateVotePage.tsx b/src/page/DebateVotePage/DebateVotePage.tsx index 337c7602..4e24860e 100644 --- a/src/page/DebateVotePage/DebateVotePage.tsx +++ b/src/page/DebateVotePage/DebateVotePage.tsx @@ -114,7 +114,7 @@ export default function DebateVotePage() { -
+
- ); -} From f54fe1b0995e700fe0cc80f676c6ea933b816f4b Mon Sep 17 00:00:00 2001 From: Shawn Kang Date: Tue, 18 Nov 2025 14:36:31 +0900 Subject: [PATCH 11/25] =?UTF-8?q?design:=20=EC=8D=A8=EB=8B=88=20=EC=9D=98?= =?UTF-8?q?=EA=B2=AC=EC=97=90=20=EB=94=B0=EB=9D=BC=20=EC=95=84=EC=9D=B4?= =?UTF-8?q?=EC=BD=98=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/page/DebateEndPage/components/GoToOverviewButton.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/page/DebateEndPage/components/GoToOverviewButton.tsx b/src/page/DebateEndPage/components/GoToOverviewButton.tsx index 3926830a..6300edf7 100644 --- a/src/page/DebateEndPage/components/GoToOverviewButton.tsx +++ b/src/page/DebateEndPage/components/GoToOverviewButton.tsx @@ -1,5 +1,5 @@ import clsx from 'clsx'; -import { TbCalendarTime } from 'react-icons/tb'; +import { RiCalendarScheduleLine } from 'react-icons/ri'; import { useNavigate } from 'react-router-dom'; interface GoToOverviewButtonProps { @@ -26,7 +26,7 @@ export default function GoToOverviewButton({ className, )} > - +

시간표로 돌아가기

); From 7eed4ecc74d9cd67dcf3b1bcf0fda49996b7de8d Mon Sep 17 00:00:00 2001 From: Shawn Kang Date: Wed, 19 Nov 2025 15:51:01 +0900 Subject: [PATCH 12/25] =?UTF-8?q?fix:=20=EB=9D=BC=EC=9A=B0=ED=8C=85=20?= =?UTF-8?q?=ED=85=8C=EC=9D=B4=EB=B8=94=EA=B3=BC=20=EC=8B=A4=EC=A0=9C=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=EA=B0=84=20=EA=B2=BD=EB=A1=9C=20?= =?UTF-8?q?=EB=8B=A4=EB=A5=B8=20=EB=AC=B8=EC=A0=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/page/DebateVotePage/DebateVotePage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/page/DebateVotePage/DebateVotePage.tsx b/src/page/DebateVotePage/DebateVotePage.tsx index 4e24860e..9cbca2fc 100644 --- a/src/page/DebateVotePage/DebateVotePage.tsx +++ b/src/page/DebateVotePage/DebateVotePage.tsx @@ -26,7 +26,7 @@ export default function DebateVotePage() { }, [baseUrl, pollId]); const handleGoToResult = () => { - navigate(`/table/customize/${tableId}/end/vote/result/${pollId}`); + navigate(`/table/customize/${tableId}/end/vote/${pollId}/result`); }; const { From b9ec785053f2fea8f38ecc15a5a16c1065853230 Mon Sep 17 00:00:00 2001 From: Shawn Kang Date: Wed, 19 Nov 2025 15:53:52 +0900 Subject: [PATCH 13/25] =?UTF-8?q?refactor:=20=ED=85=8C=EC=9D=B4=EB=B8=94?= =?UTF-8?q?=20ID=20=EA=B2=80=EC=A6=9D=20=EB=A1=9C=EC=A7=81=20=EB=B3=B4?= =?UTF-8?q?=EA=B0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/page/DebateEndPage/DebateEndPage.tsx | 15 +++++++++------ src/page/TimerPage/FeedbackTimerPage.tsx | 5 ++--- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/page/DebateEndPage/DebateEndPage.tsx b/src/page/DebateEndPage/DebateEndPage.tsx index db13a1a2..c695f400 100644 --- a/src/page/DebateEndPage/DebateEndPage.tsx +++ b/src/page/DebateEndPage/DebateEndPage.tsx @@ -8,22 +8,28 @@ import MenuCard from './components/MenuCard'; import GoToOverviewButton from './components/GoToOverviewButton'; export default function DebateEndPage() { - const { id: tableId } = useParams(); + const { id } = useParams(); + const tableId = Number(id); const navigate = useNavigate(); const handleFeedbackClick = () => { navigate(`/table/customize/${tableId}/end/feedback`); }; - const handleVoteClick = (pollId: number) => { navigate(`/table/customize/${tableId}/end/vote/${pollId}`); }; const { mutate } = usePostPoll(handleVoteClick); + const backgroundStyle = { background: 'radial-gradient(50% 50% at 50% 50%, #fecd4c21 0%, #ffffff42 100%)', }; + // 테이블 ID 검증 + if (!id || isNaN(tableId)) { + throw new Error('테이블 ID가 올바르지 않습니다.'); + } + return (
{ - if (!tableId) return; // NaN 방지 - mutate(Number(tableId)); - }} + onClick={() => mutate(tableId)} ariaLabel="승패투표 생성 및 진행" />
diff --git a/src/page/TimerPage/FeedbackTimerPage.tsx b/src/page/TimerPage/FeedbackTimerPage.tsx index 6f8248d8..4b92c316 100644 --- a/src/page/TimerPage/FeedbackTimerPage.tsx +++ b/src/page/TimerPage/FeedbackTimerPage.tsx @@ -10,14 +10,13 @@ const INITIAL_TIME = 0; export default function FeedbackTimerPage() { const feedbackTimerInstance = useFeedbackTimer(); const { id } = useParams(); - const rawTableId = Number(id); + const tableId = Number(id); const { setTimer, setDefaultTimer } = feedbackTimerInstance; // 테이블 ID 검증 로직 - if (rawTableId === null || isNaN(Number(rawTableId))) { + if (!id || isNaN(tableId)) { throw new Error('테이블 ID가 올바르지 않습니다.'); } - const tableId = rawTableId ? Number(rawTableId) : 0; useEffect(() => { // 페이지가 로드될 때 타이머의 초기 시간을 설정 From 078c1814b3b2076634756a2f0e609ee73bb6ab88 Mon Sep 17 00:00:00 2001 From: Shawn Kang Date: Wed, 19 Nov 2025 16:00:41 +0900 Subject: [PATCH 14/25] =?UTF-8?q?fix:=20=EC=BF=BC=EB=A6=AC=20=EC=8B=A4?= =?UTF-8?q?=ED=96=89=20=EC=A1=B0=EA=B1=B4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/page/DebateVotePage/DebateVotePage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/page/DebateVotePage/DebateVotePage.tsx b/src/page/DebateVotePage/DebateVotePage.tsx index 9cbca2fc..bb2a2019 100644 --- a/src/page/DebateVotePage/DebateVotePage.tsx +++ b/src/page/DebateVotePage/DebateVotePage.tsx @@ -36,7 +36,7 @@ export default function DebateVotePage() { isRefetching, refetch, isRefetchError, - } = useGetPollInfo(pollId, { refetchInterval: 5000, enabled: isPollIdValid }); + } = useGetPollInfo(pollId, { refetchInterval: 5000, enabled: isArgsValid }); const { mutate } = useFetchEndPoll(handleGoToResult); const participants = data?.voterNames; From 645effb3bb9f2cc08c337056b85848fef4b6d51e Mon Sep 17 00:00:00 2001 From: Shawn Kang Date: Thu, 20 Nov 2025 01:35:17 +0900 Subject: [PATCH 15/25] =?UTF-8?q?fix:=20=EB=A7=A4=EA=B0=9C=EB=B3=80?= =?UTF-8?q?=EC=88=98=20=EC=9D=B4=EB=A6=84=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/page/DebateVoteResultPage/DebateVoteResultPage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/page/DebateVoteResultPage/DebateVoteResultPage.tsx b/src/page/DebateVoteResultPage/DebateVoteResultPage.tsx index 69c19682..8d3b4570 100644 --- a/src/page/DebateVoteResultPage/DebateVoteResultPage.tsx +++ b/src/page/DebateVoteResultPage/DebateVoteResultPage.tsx @@ -8,7 +8,7 @@ import { useGetPollInfo } from '../../hooks/query/useGetPollInfo'; import ErrorIndicator from '../../components/ErrorIndicator/ErrorIndicator'; import { TeamKey } from '../../type/type'; export default function DebateVoteResultPage() { - const { id: pollIdParam } = useParams(); + const { pollId: pollIdParam } = useParams(); const pollId = pollIdParam ? Number(pollIdParam) : NaN; const isValidPollId = !!pollIdParam && !Number.isNaN(pollId); From a1cfe4a9ae75afac02b486bed331417f38746128 Mon Sep 17 00:00:00 2001 From: Shawn Kang Date: Thu, 20 Nov 2025 01:35:51 +0900 Subject: [PATCH 16/25] =?UTF-8?q?fix:=20VoteDetailResult=20=EB=AA=A8?= =?UTF-8?q?=EB=8B=AC=EC=97=90=EC=84=9C=20=EB=B2=84=ED=8A=BC=EC=9D=B4=20?= =?UTF-8?q?=EC=A0=9C=EB=8C=80=EB=A1=9C=20=EB=88=8C=EB=A6=AC=EC=A7=80=20?= =?UTF-8?q?=EC=95=8A=EB=8A=94=20=EB=AC=B8=EC=A0=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/VoteDetailResult.tsx | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/page/DebateVoteResultPage/components/VoteDetailResult.tsx b/src/page/DebateVoteResultPage/components/VoteDetailResult.tsx index 64eae086..90ad4af6 100644 --- a/src/page/DebateVoteResultPage/components/VoteDetailResult.tsx +++ b/src/page/DebateVoteResultPage/components/VoteDetailResult.tsx @@ -44,14 +44,17 @@ export default function VoteDetailResult({
{/* 하단 CTA 바 */} -
- -
+
+ ); From bfe171005c4e45582f8dd307c3c6d4d750128444 Mon Sep 17 00:00:00 2001 From: Shawn Kang Date: Thu, 20 Nov 2025 01:42:58 +0900 Subject: [PATCH 17/25] =?UTF-8?q?fix:=20=ED=95=B8=EB=93=A4=EB=A7=81=20?= =?UTF-8?q?=ED=95=A8=EC=88=98=20=EC=A4=91=EC=B2=A9=EB=90=98=EC=96=B4=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=EB=90=9C=20=EB=AC=B8=EC=A0=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DebateVoteResultPage/components/VoteDetailResult.tsx | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/page/DebateVoteResultPage/components/VoteDetailResult.tsx b/src/page/DebateVoteResultPage/components/VoteDetailResult.tsx index 90ad4af6..e22a2bcf 100644 --- a/src/page/DebateVoteResultPage/components/VoteDetailResult.tsx +++ b/src/page/DebateVoteResultPage/components/VoteDetailResult.tsx @@ -48,10 +48,7 @@ export default function VoteDetailResult({ onClick={onGoHome} className="flex w-full items-center justify-center bg-brand py-4 transition hover:opacity-90" > -
+
홈으로 돌아가기
From 25a059572e090700916fe1b42510866c382d71a1 Mon Sep 17 00:00:00 2001 From: Shawn Kang Date: Mon, 24 Nov 2025 20:39:45 +0900 Subject: [PATCH 18/25] =?UTF-8?q?design:=20=EB=92=A4=EB=A1=9C=20=EA=B0=80?= =?UTF-8?q?=EA=B8=B0=20=EB=B2=84=ED=8A=BC=20=ED=99=94=EC=82=B4=ED=91=9C=20?= =?UTF-8?q?=EB=B0=A9=ED=96=A5=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/GoToDebateEndButton/GoToDebateEndButton.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/GoToDebateEndButton/GoToDebateEndButton.tsx b/src/components/GoToDebateEndButton/GoToDebateEndButton.tsx index b2d9943b..a94bbc4f 100644 --- a/src/components/GoToDebateEndButton/GoToDebateEndButton.tsx +++ b/src/components/GoToDebateEndButton/GoToDebateEndButton.tsx @@ -25,7 +25,7 @@ export default function GoToDebateEndButton({ className, )} > - 뒤로 가기 → + 뒤로 가기 ← ); } From ff172886bbba08f5444ec133d78864e6849170ba Mon Sep 17 00:00:00 2001 From: Shawn Kang Date: Mon, 24 Nov 2025 20:40:30 +0900 Subject: [PATCH 19/25] =?UTF-8?q?feat:=20=ED=88=AC=ED=91=9C=20=EA=B2=B0?= =?UTF-8?q?=EA=B3=BC=20=ED=99=94=EB=A9=B4=EC=97=90=20=ED=86=A0=EB=A1=A0=20?= =?UTF-8?q?=EC=A2=85=EB=A3=8C=20=ED=99=94=EB=A9=B4=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EB=8F=8C=EC=95=84=EA=B0=80=EA=B8=B0=20=EB=B2=84=ED=8A=BC=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DebateVoteResultPage/DebateVoteResultPage.tsx | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/page/DebateVoteResultPage/DebateVoteResultPage.tsx b/src/page/DebateVoteResultPage/DebateVoteResultPage.tsx index 8d3b4570..fca9908d 100644 --- a/src/page/DebateVoteResultPage/DebateVoteResultPage.tsx +++ b/src/page/DebateVoteResultPage/DebateVoteResultPage.tsx @@ -7,6 +7,8 @@ import VoteDetailResult from './components/VoteDetailResult'; import { useGetPollInfo } from '../../hooks/query/useGetPollInfo'; import ErrorIndicator from '../../components/ErrorIndicator/ErrorIndicator'; import { TeamKey } from '../../type/type'; +import GoToDebateEndButton from '../../components/GoToDebateEndButton/GoToDebateEndButton'; +import Table from '../TableListPage/components/Table'; export default function DebateVoteResultPage() { const { pollId: pollIdParam } = useParams(); @@ -100,18 +102,12 @@ export default function DebateVoteResultPage() { - +
From bef54e047b0a1fa4ddacd538940a41a91678d9fe Mon Sep 17 00:00:00 2001 From: Shawn Kang Date: Mon, 24 Nov 2025 20:57:33 +0900 Subject: [PATCH 20/25] =?UTF-8?q?design:=20=EB=B2=84=ED=8A=BC=20=EC=9C=84?= =?UTF-8?q?=EC=B9=98=20=EC=8B=9C=EC=95=88=EC=97=90=20=EB=A7=9E=EA=B2=8C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/page/DebateVotePage/DebateVotePage.tsx | 2 +- src/page/DebateVoteResultPage/DebateVoteResultPage.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/page/DebateVotePage/DebateVotePage.tsx b/src/page/DebateVotePage/DebateVotePage.tsx index bb2a2019..70061bdc 100644 --- a/src/page/DebateVotePage/DebateVotePage.tsx +++ b/src/page/DebateVotePage/DebateVotePage.tsx @@ -115,6 +115,7 @@ export default function DebateVotePage() {
+ -
diff --git a/src/page/DebateVoteResultPage/DebateVoteResultPage.tsx b/src/page/DebateVoteResultPage/DebateVoteResultPage.tsx index fca9908d..2beecf03 100644 --- a/src/page/DebateVoteResultPage/DebateVoteResultPage.tsx +++ b/src/page/DebateVoteResultPage/DebateVoteResultPage.tsx @@ -99,6 +99,7 @@ export default function DebateVoteResultPage() {
+ -
From 521721ba19898099fa2d69c72c5c667a5ddb303f Mon Sep 17 00:00:00 2001 From: Shawn Kang Date: Mon, 24 Nov 2025 20:57:54 +0900 Subject: [PATCH 21/25] =?UTF-8?q?feat:=20=ED=88=AC=ED=91=9C=20=EC=84=B8?= =?UTF-8?q?=EB=B6=80=20=EA=B2=B0=EA=B3=BC=20=ED=8E=98=EC=9D=B4=EC=A7=80?= =?UTF-8?q?=EC=97=90=20=ED=99=95=EC=9D=B8=20=EB=AA=A8=EB=8B=AC=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DebateVoteResultPage.tsx | 62 +++++++++++++------ 1 file changed, 44 insertions(+), 18 deletions(-) diff --git a/src/page/DebateVoteResultPage/DebateVoteResultPage.tsx b/src/page/DebateVoteResultPage/DebateVoteResultPage.tsx index 2beecf03..825d777e 100644 --- a/src/page/DebateVoteResultPage/DebateVoteResultPage.tsx +++ b/src/page/DebateVoteResultPage/DebateVoteResultPage.tsx @@ -8,12 +8,18 @@ import { useGetPollInfo } from '../../hooks/query/useGetPollInfo'; import ErrorIndicator from '../../components/ErrorIndicator/ErrorIndicator'; import { TeamKey } from '../../type/type'; import GoToDebateEndButton from '../../components/GoToDebateEndButton/GoToDebateEndButton'; -import Table from '../TableListPage/components/Table'; +import { useState } from 'react'; +import DialogModal from '../../components/DialogModal/DialogModal'; export default function DebateVoteResultPage() { - const { pollId: pollIdParam } = useParams(); + // 매개변수 검증 + const { pollId: rawPollId, tableId: rawTableId } = useParams(); + const pollId = rawPollId ? Number(rawPollId) : NaN; + const isPollIdValid = !!rawPollId && !Number.isNaN(pollId); + const tableId = rawTableId ? Number(rawTableId) : NaN; + const isTableIdValid = !!rawTableId && !Number.isNaN(tableId); + const isArgsValid = isPollIdValid && isTableIdValid; - const pollId = pollIdParam ? Number(pollIdParam) : NaN; - const isValidPollId = !!pollIdParam && !Number.isNaN(pollId); + const [isConfirmed, setIsConfirmed] = useState(false); const navigate = useNavigate(); const { @@ -23,13 +29,15 @@ export default function DebateVoteResultPage() { isRefetching, refetch, isRefetchError, - } = useGetPollInfo(pollId, { enabled: isValidPollId }); + } = useGetPollInfo(pollId, { enabled: isArgsValid }); const handleGoHome = () => { navigate('/'); }; const isLoading = isFetching || isRefetching; const isError = isFetchError || isRefetchError; - const { openModal, ModalWrapper } = useModal(); + const { openModal, ModalWrapper, closeModal } = useModal({ + onClose: () => setIsConfirmed(false), + }); const getWinner = (result: { prosTeamName: string; @@ -57,7 +65,7 @@ export default function DebateVoteResultPage() { } }; - if (!isValidPollId) { + if (!isArgsValid) { return ( @@ -113,17 +121,35 @@ export default function DebateVoteResultPage() { - + {isConfirmed ? ( + + ) : ( + closeModal(), + }} + right={{ + text: '네', + onClick: () => setIsConfirmed(true), + isBold: true, + }} + > +
+ 정말로 세부 결과를 공개할까요? +
+
+ )}
); From 0a67d6de25c1886b35eec3e939f47485fa6523d6 Mon Sep 17 00:00:00 2001 From: Shawn Kang Date: Mon, 24 Nov 2025 21:02:33 +0900 Subject: [PATCH 22/25] =?UTF-8?q?refactor:=20=ED=88=AC=ED=91=9C=20?= =?UTF-8?q?=EA=B2=B0=EA=B3=BC=20=ED=99=94=EB=A9=B4=20=EC=8A=A4=ED=83=80?= =?UTF-8?q?=EC=9D=BC=20=ED=83=9C=EA=B7=B8=20=EC=9D=BC=EB=B6=80=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/page/DebateVoteResultPage/DebateVoteResultPage.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/page/DebateVoteResultPage/DebateVoteResultPage.tsx b/src/page/DebateVoteResultPage/DebateVoteResultPage.tsx index 825d777e..fad7319c 100644 --- a/src/page/DebateVoteResultPage/DebateVoteResultPage.tsx +++ b/src/page/DebateVoteResultPage/DebateVoteResultPage.tsx @@ -106,12 +106,12 @@ export default function DebateVoteResultPage() { -
- +
+