From 7c98d39307c8ba289b730d0f5d3695cda625ee36 Mon Sep 17 00:00:00 2001 From: ponbac Date: Mon, 2 Mar 2026 12:27:55 +0100 Subject: [PATCH] fix: timer edit dialog overwriting non-saved content --- app/bun.lockb | Bin 298426 -> 301365 bytes app/eslint.config.mjs | 1 - app/package.json | 10 +-- .../notification-settings-dropdown.tsx | 1 + app/src/components/timer-edit-dialog.tsx | 78 +++++++++--------- .../board/-components/sprint-selector.tsx | 1 + .../_layout/prs/-components/data-table.tsx | 1 + .../-components/timeline-view.tsx | 1 + 8 files changed, 46 insertions(+), 47 deletions(-) diff --git a/app/bun.lockb b/app/bun.lockb index 6b315617b8e0bd7da4360c4139d3f3d3a1cabc03..42e4f6ce3af6bb4f4009ef46934d120ead521492 100755 GIT binary patch delta 38187 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 diff --git a/app/eslint.config.mjs b/app/eslint.config.mjs index 833aa7b0..172b4173 100644 --- a/app/eslint.config.mjs +++ b/app/eslint.config.mjs @@ -57,7 +57,6 @@ export default [ allowConstantExport: true, }, ], - "@typescript-eslint/no-empty-object-type": "off", }, }, diff --git a/app/package.json b/app/package.json index 847aee45..d007b921 100644 --- a/app/package.json +++ b/app/package.json @@ -44,9 +44,9 @@ "jotai": "^2.11.0", "ky": "^1.7.4", "lucide-react": "^0.469.0", - "react": "^19.0.0", + "react": "^19.2.0", "react-day-picker": "8.10.1", - "react-dom": "^19.0.0", + "react-dom": "^19.2.0", "react-hook-form": "^7.54.2", "react-markdown": "^9.0.1", "react-resizable-panels": "^2.1.7", @@ -65,8 +65,8 @@ "@tailwindcss/typography": "^0.5.15", "@tanstack/eslint-plugin-router": "^1.92.7", "@types/node": "^22.10.5", - "@types/react": "^19.0.2", - "@types/react-dom": "^19.0.2", + "@types/react": "^19.2.0", + "@types/react-dom": "^19.2.0", "@typescript-eslint/eslint-plugin": "^8.19.0", "@typescript-eslint/parser": "^8.19.0", "@vitejs/plugin-react": "^4.3.4", @@ -74,7 +74,7 @@ "babel-plugin-react-compiler": "^19.0.0-beta-55955c9-20241229", "eslint": "^9.17.0", "eslint-plugin-react-compiler": "^19.0.0-beta-55955c9-20241229", - "eslint-plugin-react-hooks": "^5.1.0", + "eslint-plugin-react-hooks": "^7.0.1", "eslint-plugin-react-refresh": "^0.4.16", "globals": "^15.14.0", "install": "^0.13.0", diff --git a/app/src/components/notifications-popover/notification-settings-dropdown.tsx b/app/src/components/notifications-popover/notification-settings-dropdown.tsx index a1bb9551..0432f918 100644 --- a/app/src/components/notifications-popover/notification-settings-dropdown.tsx +++ b/app/src/components/notifications-popover/notification-settings-dropdown.tsx @@ -95,6 +95,7 @@ export function NotificationSettingsDropdown() { }; useEffect(() => { + // eslint-disable-next-line react-hooks/set-state-in-effect setBrowserPermission(hasPushPermission()); const permissionChangeHandler = () => { diff --git a/app/src/components/timer-edit-dialog.tsx b/app/src/components/timer-edit-dialog.tsx index 82832a24..de5ddbc9 100644 --- a/app/src/components/timer-edit-dialog.tsx +++ b/app/src/components/timer-edit-dialog.tsx @@ -25,16 +25,14 @@ export const TimerEditDialog = (props: { timer: TimerResponse; }) => { const [projectId, setProjectId] = React.useState( - props.timer?.projectId ?? undefined, + props.timer.projectId ?? undefined, ); const [activityName, setActivityName] = React.useState( - props.timer?.activityName ?? undefined, - ); - const [note, setNote] = React.useState( - props.timer?.note ?? undefined, + props.timer.activityName ?? undefined, ); + const [note, setNote] = React.useState(props.timer.note); const [startTimeISO, setStartTimeISO] = React.useState( - props.timer?.startTime, + props.timer.startTime, ); const { projects, activities } = useTimeTrackingData({ @@ -51,38 +49,39 @@ export const TimerEditDialog = (props: { [activities, activityName], ); - const { mutate: updateTimerMutate } = - timeTrackingMutations.useEditTimer({ - onSuccess: () => { - props.onOpenChange(false); - }, - }); + const closeDialog = () => { + props.onOpenChange(false); + }; + + const { mutate: updateTimerMutate } = timeTrackingMutations.useEditTimer({ + onSuccess: closeDialog, + }); const updateTimer = () => { - updateTimerMutate( - { - projectId: projectId, - projectName: selectedProject?.projectName ?? "", - activityId: selectedActivity?.activity ?? "", - activityName: activityName, - userNote: note ?? "", - startTime: startTimeISO, - }, - { - onSuccess: () => { - props.onOpenChange(false); - }, - }, - ); + updateTimerMutate({ + projectId: projectId, + projectName: selectedProject?.projectName ?? "", + activityId: selectedActivity?.activity ?? "", + activityName: activityName, + userNote: note ?? "", + startTime: startTimeISO, + }); }; + const hydrateDraftFromCurrentTimer = React.useEffectEvent(() => { + setProjectId(props.timer.projectId ?? undefined); + setActivityName(props.timer.activityName ?? undefined); + setNote(props.timer.note); + setStartTimeISO(props.timer.startTime); + }); + React.useEffect(() => { - // Synchronize state with props.timer when it changes - setProjectId(props.timer?.projectId ?? undefined); - setActivityName(props.timer?.activityName ?? undefined); - setNote(props.timer?.note ?? undefined); // Convert null to undefined for consistency - setStartTimeISO(props.timer?.startTime); - }, [props.timer]); + // Initialize draft state only when dialog opens. + // While open, keep local edits as source of truth even if timer query refetches. + if (props.open) { + hydrateDraftFromCurrentTimer(); + } + }, [props.open]); const activitiesRef = React.useRef(null); const noteInputRef = React.useRef(null); @@ -93,13 +92,15 @@ export const TimerEditDialog = (props: { // Handle time input change from "HH:mm" const handleTimeInputChange = (newTimeValue: string) => { - if (!props.timer?.startTime) { + const baseStartTime = startTimeISO ?? props.timer.startTime; + + if (!baseStartTime) { console.warn( "Original timer start time not available to derive date for time input change.", ); return; } - const originalTimerDate = dayjs(props.timer.startTime); // Base date from original timer + const originalTimerDate = dayjs(baseStartTime); const [hours, minutes] = newTimeValue.split(":").map(Number); let newFullDateTime = originalTimerDate @@ -121,12 +122,7 @@ export const TimerEditDialog = (props: { if (!props.open || !projects) return null; return ( - { - props.onOpenChange(open); - }} - > +
({ // eslint-disable-next-line react-compiler/react-compiler "use no memo"; + // eslint-disable-next-line react-hooks/incompatible-library const table = useReactTable({ data, columns, diff --git a/app/src/routes/_layout/time-tracking/-components/timeline-view.tsx b/app/src/routes/_layout/time-tracking/-components/timeline-view.tsx index 4a2743b1..d9f10a89 100644 --- a/app/src/routes/_layout/time-tracking/-components/timeline-view.tsx +++ b/app/src/routes/_layout/time-tracking/-components/timeline-view.tsx @@ -625,6 +625,7 @@ export function TimelineView({ timeEntries, dateRange }: TimelineViewProps) { const to = parseISO(dateRange.to); const today = startOfDay(new Date()); const target = today >= from && today <= to ? today : from; + // eslint-disable-next-line react-hooks/set-state-in-effect setCurrentWeekStart(startOfWeek(target, { weekStartsOn: 1 })); setSelectedDate(target); }, [dateRange.from, dateRange.to]);