From fe8c545aa6da88857a6fd96276883bc46e679bab Mon Sep 17 00:00:00 2001 From: yumin-kim4757 Date: Tue, 14 Jul 2026 05:22:21 +0900 Subject: [PATCH 01/75] =?UTF-8?q?feat(web):=20=ED=86=B5=EA=B3=84=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20API=20=EC=97=B0=EA=B2=B0=20(#165)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../StatisticsCalendarContainer.tsx | 10 ++- .../_containers/StatisticsContainer.tsx | 66 +++++++++++-------- 2 files changed, 46 insertions(+), 30 deletions(-) diff --git a/apps/timo-web/app/[locale]/(main)/statistics/_containers/StatisticsCalendarContainer.tsx b/apps/timo-web/app/[locale]/(main)/statistics/_containers/StatisticsCalendarContainer.tsx index 551696fe..343fb686 100644 --- a/apps/timo-web/app/[locale]/(main)/statistics/_containers/StatisticsCalendarContainer.tsx +++ b/apps/timo-web/app/[locale]/(main)/statistics/_containers/StatisticsCalendarContainer.tsx @@ -1,7 +1,8 @@ "use client"; +import { useGetCalendar } from "@/api/generated/endpoints/statistics/statistics"; import { StatisticsCalendar } from "@/app/[locale]/(main)/statistics/_components/StatisticsCalendar"; -import { MOCK_STATISTICS_CALENDAR } from "@/app/[locale]/(main)/statistics/_mocks/statistics-calendar"; +import { formatDateKey } from "@/utils/date"; interface StatisticsCalendarContainerProps { currentMonth: Date; @@ -14,12 +15,17 @@ export const StatisticsCalendarContainer = ({ selectedDate, onSelectDate, }: StatisticsCalendarContainerProps) => { + const yearMonth = formatDateKey(currentMonth).slice(0, 7); + const calendarQuery = useGetCalendar({ yearMonth }); + const calendarData = calendarQuery.data?.data; + if (!calendarData) return null; + return ( ); }; diff --git a/apps/timo-web/app/[locale]/(main)/statistics/_containers/StatisticsContainer.tsx b/apps/timo-web/app/[locale]/(main)/statistics/_containers/StatisticsContainer.tsx index c0ff4f02..04a4709e 100644 --- a/apps/timo-web/app/[locale]/(main)/statistics/_containers/StatisticsContainer.tsx +++ b/apps/timo-web/app/[locale]/(main)/statistics/_containers/StatisticsContainer.tsx @@ -3,16 +3,16 @@ import { useLocale } from "next-intl"; import { useState } from "react"; +import { + useGetDaily, + useGetSummary, +} from "@/api/generated/endpoints/statistics/statistics"; import { StatisticsSidePanel, type StatisticsSidePanelProps, } from "@/app/[locale]/(main)/statistics/_components/StatisticsSidePanel"; import { StatisticsCalendarContainer } from "@/app/[locale]/(main)/statistics/_containers/StatisticsCalendarContainer"; import { StatisticsHeaderContainer } from "@/app/[locale]/(main)/statistics/_containers/StatisticsHeaderContainer"; -import { - MOCK_STATISTICS_DAY_DETAILS, - MOCK_STATISTICS_MONTH_SUMMARY, -} from "@/app/[locale]/(main)/statistics/_mocks/statistics-calendar"; import { formatStatisticsSidePanelDate } from "@/app/[locale]/(main)/statistics/_utils/format-statistics-date"; import { formatDateKey } from "@/utils/date"; @@ -20,40 +20,50 @@ export const StatisticsContainer = () => { const locale = useLocale(); const [currentMonth, setCurrentMonth] = useState(() => new Date()); const [selectedDate, setSelectedDate] = useState(() => new Date()); - const [sidePanelProps, setSidePanelProps] = - useState({ - variant: "month", - summary: MOCK_STATISTICS_MONTH_SUMMARY, - }); + const [sidePanelVariant, setSidePanelVariant] = + useState("month"); + + const yearMonth = formatDateKey(currentMonth).slice(0, 7); + const summaryQuery = useGetSummary({ yearMonth }); - const getStatisticsDayDetail = (date: Date) => { - const selectedDateKey = formatDateKey(date); - const selectedDetailBase = MOCK_STATISTICS_DAY_DETAILS[selectedDateKey] ?? { - date: selectedDateKey, - totalRecordMinutes: 0, - todos: [], - }; + const selectedDateKey = formatDateKey(selectedDate); + const dailyQuery = useGetDaily({ date: selectedDateKey }); + const daily = dailyQuery.data?.data; - return { - ...selectedDetailBase, - date: formatStatisticsSidePanelDate(date, locale), - }; + const summary = summaryQuery.data?.data ?? { + totalRecordMinutes: 0, + activeDayCount: 0, + averageRecordedMinutes: 0, + completedTodoCount: 0, + totalTodoCount: 0, }; + const dayDetail = { + date: formatStatisticsSidePanelDate(selectedDate, locale), + totalRecordMinutes: daily?.totalRecordMinutes ?? 0, + todos: + daily?.todos.map((todo) => ({ + todoId: todo.todoId, + title: todo.title, + actualTimeMinutes: todo.actualTimeMinutes, + estimatedTimeMinutes: todo.estimatedTimeMinutes ?? 0, + tagName: todo.tag?.name ?? "", + })) ?? [], + }; + + const sidePanelProps: StatisticsSidePanelProps = + sidePanelVariant === "month" + ? { variant: "month", summary } + : { variant: "day", detail: dayDetail }; + const handleChangeMonth = (updater: (prev: Date) => Date) => { setCurrentMonth(updater); - setSidePanelProps({ - variant: "month", - summary: MOCK_STATISTICS_MONTH_SUMMARY, - }); + setSidePanelVariant("month"); }; const handleSelectDate = (date: Date) => { setSelectedDate(date); - setSidePanelProps({ - variant: "day", - detail: getStatisticsDayDetail(date), - }); + setSidePanelVariant("day"); }; return ( From 79e1c445d767d7e0024606a1079e7f69298be71c Mon Sep 17 00:00:00 2001 From: yumin-kim4757 Date: Tue, 14 Jul 2026 05:25:07 +0900 Subject: [PATCH 02/75] =?UTF-8?q?refactor(web):=20=ED=86=B5=EA=B3=84=20API?= =?UTF-8?q?=20=EC=BF=BC=EB=A6=AC=20=ED=9B=85=20=EB=B6=84=EB=A6=AC=20(#165)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../_containers/StatisticsCalendarContainer.tsx | 4 ++-- .../_containers/StatisticsContainer.tsx | 12 ++++++------ .../(main)/statistics/_queries/.gitkeep | 0 .../statistics/_queries/statistics-queries.ts | 17 +++++++++++++++++ 4 files changed, 25 insertions(+), 8 deletions(-) delete mode 100644 apps/timo-web/app/[locale]/(main)/statistics/_queries/.gitkeep create mode 100644 apps/timo-web/app/[locale]/(main)/statistics/_queries/statistics-queries.ts diff --git a/apps/timo-web/app/[locale]/(main)/statistics/_containers/StatisticsCalendarContainer.tsx b/apps/timo-web/app/[locale]/(main)/statistics/_containers/StatisticsCalendarContainer.tsx index 343fb686..5bd94e17 100644 --- a/apps/timo-web/app/[locale]/(main)/statistics/_containers/StatisticsCalendarContainer.tsx +++ b/apps/timo-web/app/[locale]/(main)/statistics/_containers/StatisticsCalendarContainer.tsx @@ -1,7 +1,7 @@ "use client"; -import { useGetCalendar } from "@/api/generated/endpoints/statistics/statistics"; import { StatisticsCalendar } from "@/app/[locale]/(main)/statistics/_components/StatisticsCalendar"; +import { useStatisticsCalendarQuery } from "@/app/[locale]/(main)/statistics/_queries/statistics-queries"; import { formatDateKey } from "@/utils/date"; interface StatisticsCalendarContainerProps { @@ -16,7 +16,7 @@ export const StatisticsCalendarContainer = ({ onSelectDate, }: StatisticsCalendarContainerProps) => { const yearMonth = formatDateKey(currentMonth).slice(0, 7); - const calendarQuery = useGetCalendar({ yearMonth }); + const calendarQuery = useStatisticsCalendarQuery(yearMonth); const calendarData = calendarQuery.data?.data; if (!calendarData) return null; diff --git a/apps/timo-web/app/[locale]/(main)/statistics/_containers/StatisticsContainer.tsx b/apps/timo-web/app/[locale]/(main)/statistics/_containers/StatisticsContainer.tsx index 04a4709e..e24c6838 100644 --- a/apps/timo-web/app/[locale]/(main)/statistics/_containers/StatisticsContainer.tsx +++ b/apps/timo-web/app/[locale]/(main)/statistics/_containers/StatisticsContainer.tsx @@ -3,16 +3,16 @@ import { useLocale } from "next-intl"; import { useState } from "react"; -import { - useGetDaily, - useGetSummary, -} from "@/api/generated/endpoints/statistics/statistics"; import { StatisticsSidePanel, type StatisticsSidePanelProps, } from "@/app/[locale]/(main)/statistics/_components/StatisticsSidePanel"; import { StatisticsCalendarContainer } from "@/app/[locale]/(main)/statistics/_containers/StatisticsCalendarContainer"; import { StatisticsHeaderContainer } from "@/app/[locale]/(main)/statistics/_containers/StatisticsHeaderContainer"; +import { + useStatisticsDailyQuery, + useStatisticsSummaryQuery, +} from "@/app/[locale]/(main)/statistics/_queries/statistics-queries"; import { formatStatisticsSidePanelDate } from "@/app/[locale]/(main)/statistics/_utils/format-statistics-date"; import { formatDateKey } from "@/utils/date"; @@ -24,10 +24,10 @@ export const StatisticsContainer = () => { useState("month"); const yearMonth = formatDateKey(currentMonth).slice(0, 7); - const summaryQuery = useGetSummary({ yearMonth }); + const summaryQuery = useStatisticsSummaryQuery(yearMonth); const selectedDateKey = formatDateKey(selectedDate); - const dailyQuery = useGetDaily({ date: selectedDateKey }); + const dailyQuery = useStatisticsDailyQuery(selectedDateKey); const daily = dailyQuery.data?.data; const summary = summaryQuery.data?.data ?? { diff --git a/apps/timo-web/app/[locale]/(main)/statistics/_queries/.gitkeep b/apps/timo-web/app/[locale]/(main)/statistics/_queries/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/apps/timo-web/app/[locale]/(main)/statistics/_queries/statistics-queries.ts b/apps/timo-web/app/[locale]/(main)/statistics/_queries/statistics-queries.ts new file mode 100644 index 00000000..0b3dfcee --- /dev/null +++ b/apps/timo-web/app/[locale]/(main)/statistics/_queries/statistics-queries.ts @@ -0,0 +1,17 @@ +import { + useGetCalendar, + useGetDaily, + useGetSummary, +} from "@/api/generated/endpoints/statistics/statistics"; + +export const useStatisticsSummaryQuery = (yearMonth: string) => { + return useGetSummary({ yearMonth }); +}; + +export const useStatisticsDailyQuery = (date: string) => { + return useGetDaily({ date }); +}; + +export const useStatisticsCalendarQuery = (yearMonth: string) => { + return useGetCalendar({ yearMonth }); +}; From f2b5d6819073edda283ca9b713beea382f7271b4 Mon Sep 17 00:00:00 2001 From: yumin-kim4757 Date: Tue, 14 Jul 2026 05:37:35 +0900 Subject: [PATCH 03/75] =?UTF-8?q?refactor(web):=20=EC=98=81=EC=96=B4=20?= =?UTF-8?q?=EB=82=A0=EC=A7=9C=20=ED=91=9C=EC=8B=9C=20=ED=98=95=EC=8B=9D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20(#165)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../_components/StatisticsSidePanel.tsx | 4 ++- .../_utils/format-statistics-date.ts | 28 +++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/apps/timo-web/app/[locale]/(main)/statistics/_components/StatisticsSidePanel.tsx b/apps/timo-web/app/[locale]/(main)/statistics/_components/StatisticsSidePanel.tsx index 75d5cf29..50fd94d4 100644 --- a/apps/timo-web/app/[locale]/(main)/statistics/_components/StatisticsSidePanel.tsx +++ b/apps/timo-web/app/[locale]/(main)/statistics/_components/StatisticsSidePanel.tsx @@ -91,7 +91,9 @@ export const StatisticsSidePanel = (props: StatisticsSidePanelProps) => { return (