diff --git a/apps/timo-web/api/generated/endpoints/focus/focus.ts b/apps/timo-web/api/generated/endpoints/focus/focus.ts index 26989958..0c767fec 100644 --- a/apps/timo-web/api/generated/endpoints/focus/focus.ts +++ b/apps/timo-web/api/generated/endpoints/focus/focus.ts @@ -10,7 +10,7 @@ import { useQuery } from "@tanstack/react-query"; import { customInstance } from "../../../client/custom-instance"; import type { ErrorType } from "../../../client/custom-instance"; -import type { ErrorDto, FocusTodoResponse } from "../../models"; +import type { BaseResponseFocusTodoResponse, ErrorDto } from "../../models"; import type { DataTag, DefinedInitialDataOptions, @@ -57,7 +57,7 @@ export const getFocusTodo = ( options?: SecondParameter, signal?: AbortSignal, ) => { - return customInstance( + return customInstance( { url: `/api/v1/focus`, method: "GET", signal }, options, ); diff --git a/apps/timo-web/api/generated/endpoints/focus/focus.zod.ts b/apps/timo-web/api/generated/endpoints/focus/focus.zod.ts index d403820a..814851cc 100644 --- a/apps/timo-web/api/generated/endpoints/focus/focus.zod.ts +++ b/apps/timo-web/api/generated/endpoints/focus/focus.zod.ts @@ -18,32 +18,38 @@ import * as zod from "zod"; * @summary 집중 모드 TODO 조회 */ export const GetFocusTodoResponse = zod.object({ - date: zod.iso.date(), - dayOfWeek: zod.enum(["MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"]), - hasTodo: zod.boolean(), - todo: zod + status: zod.number().optional(), + message: zod.string().optional(), + data: zod .object({ - todoId: zod.number(), - icon: zod.string().optional(), - title: zod.string(), - completed: zod.boolean(), - durationSeconds: zod.number().optional(), - priority: zod.string().optional(), - tag: zod + date: zod.iso.date(), + dayOfWeek: zod.enum(["MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"]), + hasTodo: zod.boolean(), + todo: zod .object({ - tagId: zod.number(), - name: zod.string(), + todoId: zod.number(), + icon: zod.string().optional(), + title: zod.string(), + completed: zod.boolean(), + durationSeconds: zod.number().optional(), + priority: zod.string().optional(), + tag: zod + .object({ + tagId: zod.number(), + name: zod.string(), + }) + .optional(), + isRepeated: zod.boolean(), + memo: zod.string().optional(), + subtasks: zod.array( + zod.object({ + subtaskId: zod.number(), + content: zod.string(), + completed: zod.boolean(), + }), + ), }) .optional(), - isRepeated: zod.boolean(), - memo: zod.string().optional(), - subtasks: zod.array( - zod.object({ - subtaskId: zod.number(), - content: zod.string(), - completed: zod.boolean(), - }), - ), }) .optional(), }); diff --git a/apps/timo-web/api/generated/models/index.ts b/apps/timo-web/api/generated/models/index.ts index e632f371..3e76db97 100644 --- a/apps/timo-web/api/generated/models/index.ts +++ b/apps/timo-web/api/generated/models/index.ts @@ -16,6 +16,7 @@ export * from "./baseResponseCalendarAuthorizeResponse"; export * from "./baseResponseCalendarConnectResponse"; export * from "./baseResponseCalendarDisconnectResponse"; export * from "./baseResponseCalendarEventsResponse"; +export * from "./baseResponseFocusTodoResponse"; export * from "./baseResponseHomeResponse"; export * from "./baseResponseListTimeBoxResponse"; export * from "./baseResponseObject"; diff --git a/apps/timo-web/app/[locale]/(main)/(with-time-sidebar)/home/_containers/HomeTodoContainer.tsx b/apps/timo-web/app/[locale]/(main)/(with-time-sidebar)/home/_containers/HomeTodoContainer.tsx index 208eba98..efa73bef 100644 --- a/apps/timo-web/app/[locale]/(main)/(with-time-sidebar)/home/_containers/HomeTodoContainer.tsx +++ b/apps/timo-web/app/[locale]/(main)/(with-time-sidebar)/home/_containers/HomeTodoContainer.tsx @@ -98,9 +98,7 @@ export const HomeTodoContainer = () => { }, [isWeekView, scrollRef]); const plannedMinutes = activeTimer - ? convertDurationToMinutes( - activeTimer.plannedSeconds + activeTimer.extendedSeconds, - ) + ? convertDurationToMinutes(activeTimer.plannedSeconds) : 0; const actualMinutes = activeTimer ? convertDurationToMinutes(activeTimer.elapsedSeconds) diff --git a/apps/timo-web/app/[locale]/(main)/(with-time-sidebar)/today/_containers/TodayTodoListContainer.tsx b/apps/timo-web/app/[locale]/(main)/(with-time-sidebar)/today/_containers/TodayTodoListContainer.tsx index 7f568744..c878be44 100644 --- a/apps/timo-web/app/[locale]/(main)/(with-time-sidebar)/today/_containers/TodayTodoListContainer.tsx +++ b/apps/timo-web/app/[locale]/(main)/(with-time-sidebar)/today/_containers/TodayTodoListContainer.tsx @@ -83,9 +83,7 @@ export const TodayTodoListContainer = () => { const completedCount = todos.filter((todo) => todo.completed).length; const plannedMinutes = activeTimer - ? convertDurationToMinutes( - activeTimer.plannedSeconds + activeTimer.extendedSeconds, - ) + ? convertDurationToMinutes(activeTimer.plannedSeconds) : 0; const actualMinutes = activeTimer ? convertDurationToMinutes(activeTimer.elapsedSeconds) diff --git a/apps/timo-web/app/[locale]/(main)/focus/_containers/FocusSessionContainer.tsx b/apps/timo-web/app/[locale]/(main)/focus/_containers/FocusSessionContainer.tsx index 39feabbb..ff5cf58e 100644 --- a/apps/timo-web/app/[locale]/(main)/focus/_containers/FocusSessionContainer.tsx +++ b/apps/timo-web/app/[locale]/(main)/focus/_containers/FocusSessionContainer.tsx @@ -121,7 +121,7 @@ export const FocusSessionContainer = () => { ref={focusSessionState.timerSessionControlsRef} isRunning={focusSessionState.isRunning} onTogglePlay={focusSessionActions.onTogglePlay} - plannedMinutes={focusSessionState.plannedMinutes} + plannedMinutes={focusSessionState.basePlannedMinutes} actualMinutes={focusSessionState.actualMinutes} feedbackText={feedbackText} isTimeUp={focusSessionState.isTimeUp} diff --git a/apps/timo-web/app/[locale]/(main)/focus/_hooks/use-focus-session.ts b/apps/timo-web/app/[locale]/(main)/focus/_hooks/use-focus-session.ts index 66230d81..7de03803 100644 --- a/apps/timo-web/app/[locale]/(main)/focus/_hooks/use-focus-session.ts +++ b/apps/timo-web/app/[locale]/(main)/focus/_hooks/use-focus-session.ts @@ -236,6 +236,10 @@ export const useFocusSession = ({ ) : 0; const plannedMinutes = convertDurationToMinutes(plannedSeconds); + // 완료 모달의 "계획"은 연장 시간을 제외한 순수 계획 시간만 보여줘야 한다 + const basePlannedMinutes = convertDurationToMinutes( + timer ? timer.plannedSeconds : (todo?.durationSeconds ?? 0), + ); const actualMinutes = convertDurationToMinutes(timer?.elapsedSeconds ?? 0); return { @@ -253,6 +257,7 @@ export const useFocusSession = ({ isOvertime, overtimeProgress, plannedMinutes, + basePlannedMinutes, actualMinutes, }, focusSessionActions: { diff --git a/apps/timo-web/app/[locale]/(main)/focus/_queries/use-focus-todo-query.ts b/apps/timo-web/app/[locale]/(main)/focus/_queries/use-focus-todo-query.ts index 5e4d597e..d0329ca0 100644 --- a/apps/timo-web/app/[locale]/(main)/focus/_queries/use-focus-todo-query.ts +++ b/apps/timo-web/app/[locale]/(main)/focus/_queries/use-focus-todo-query.ts @@ -12,5 +12,5 @@ export const useFocusTodoQuery = () => useSuspenseQuery({ queryKey: getGetFocusTodoQueryKey(), queryFn: ({ signal }) => getFocusTodo(undefined, signal), - select: (data) => focusViewSchema.parse(data), + select: ({ data }) => focusViewSchema.parse(data), }); diff --git a/apps/timo-web/components/layout/sidebar/time/TimerPanel.tsx b/apps/timo-web/components/layout/sidebar/time/TimerPanel.tsx index 10ca10f6..2f4bc03d 100644 --- a/apps/timo-web/components/layout/sidebar/time/TimerPanel.tsx +++ b/apps/timo-web/components/layout/sidebar/time/TimerPanel.tsx @@ -157,6 +157,10 @@ export const TimerPanel = () => { ) : 0; const plannedMinutes = convertDurationToMinutes(plannedSeconds); + // 완료 모달의 "계획"은 연장 시간을 제외한 순수 계획 시간만 보여줘야 한다 + const basePlannedMinutes = convertDurationToMinutes( + activeTimer?.plannedSeconds ?? 0, + ); const actualMinutes = convertDurationToMinutes( activeTimer?.elapsedSeconds ?? 0, ); @@ -177,7 +181,7 @@ export const TimerPanel = () => { ref={timerSessionControlsRef} isRunning={isRunning} onTogglePlay={handleTogglePlay} - plannedMinutes={plannedMinutes} + plannedMinutes={basePlannedMinutes} actualMinutes={actualMinutes} feedbackText={feedbackText} isTimeUp={isTimeUp}