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
4 changes: 2 additions & 2 deletions apps/timo-web/api/generated/endpoints/focus/focus.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -57,7 +57,7 @@ export const getFocusTodo = (
options?: SecondParameter<typeof customInstance>,
signal?: AbortSignal,
) => {
return customInstance<FocusTodoResponse>(
return customInstance<BaseResponseFocusTodoResponse>(
{ url: `/api/v1/focus`, method: "GET", signal },
options,
);
Expand Down
50 changes: 28 additions & 22 deletions apps/timo-web/api/generated/endpoints/focus/focus.zod.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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(),
});
1 change: 1 addition & 0 deletions apps/timo-web/api/generated/models/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,9 +98,7 @@ export const HomeTodoContainer = () => {
}, [isWeekView, scrollRef]);

const plannedMinutes = activeTimer
? convertDurationToMinutes(
activeTimer.plannedSeconds + activeTimer.extendedSeconds,
)
? convertDurationToMinutes(activeTimer.plannedSeconds)
: 0;
Comment on lines 100 to 102

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

연장 시간을 제외하는 회귀 테스트를 추가해 주세요.

plannedSecondsextendedSeconds가 모두 있는 경우 완료 모달에는 전자만 표시되는지 검증하면, 이번 계약이 다시 합산 방식으로 되돌아가는 회귀를 막을 수 있습니다. React Testing Library의 render와 사용자 중심 쿼리 방식을 참고하면 됩니다. (testing-library.com)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@apps/timo-web/app/`[locale]/(main)/(with-time-sidebar)/home/_containers/HomeTodoContainer.tsx
around lines 100 - 102, In the tests covering the completion modal and the
HomeTodoContainer timer flow, add a regression test using React Testing Library
render and user-focused queries with both plannedSeconds and extendedSeconds
populated; assert that the modal displays only the planned duration and does not
include the extended time.

const actualMinutes = activeTimer
? convertDurationToMinutes(activeTimer.elapsedSeconds)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -253,6 +257,7 @@ export const useFocusSession = ({
isOvertime,
overtimeProgress,
plannedMinutes,
basePlannedMinutes,
actualMinutes,
},
focusSessionActions: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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),
});
6 changes: 5 additions & 1 deletion apps/timo-web/components/layout/sidebar/time/TimerPanel.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,10 @@ export const TimerPanel = () => {
)
: 0;
const plannedMinutes = convertDurationToMinutes(plannedSeconds);
// 완료 모달의 "계획"은 연장 시간을 제외한 순수 계획 시간만 보여줘야 한다
const basePlannedMinutes = convertDurationToMinutes(
activeTimer?.plannedSeconds ?? 0,
);
const actualMinutes = convertDurationToMinutes(
activeTimer?.elapsedSeconds ?? 0,
);
Expand All @@ -177,7 +181,7 @@ export const TimerPanel = () => {
ref={timerSessionControlsRef}
isRunning={isRunning}
onTogglePlay={handleTogglePlay}
plannedMinutes={plannedMinutes}
plannedMinutes={basePlannedMinutes}
actualMinutes={actualMinutes}
feedbackText={feedbackText}
isTimeUp={isTimeUp}
Expand Down
Loading