feat: replace Date constructor with parseISO for improved date handling across calendar components #25

This commit is contained in:
Linus Rath
2026-03-26 17:42:44 +01:00
parent 9b25b6d03e
commit 733e99f094
9 changed files with 22 additions and 18 deletions
+1 -1
View File
@@ -49,7 +49,7 @@ export function CalendarAgendaView({
const grouped = useMemo(() => {
const sorted = [...events].sort((a, b) =>
new Date(a.start).getTime() - new Date(b.start).getTime()
parseISO(a.start).getTime() - parseISO(b.start).getTime()
);
const groups: DayGroup[] = [];
+3 -2
View File
@@ -121,13 +121,14 @@ export function CalendarMonthView({
try {
const data = JSON.parse(json);
const originalStart = parseISO(data.originalStart);
const event = useCalendarStore.getState().events.find(e => e.id === data.eventId);
const isAllDay = event?.showWithoutTime;
const newStart = new Date(day);
newStart.setHours(originalStart.getHours(), originalStart.getMinutes(), originalStart.getSeconds(), 0);
const newStartISO = format(newStart, "yyyy-MM-dd'T'HH:mm:ss");
const newStartISO = isAllDay ? format(newStart, "yyyy-MM-dd") : format(newStart, "yyyy-MM-dd'T'HH:mm:ss");
if (newStartISO === data.originalStart) return;
const client = useAuthStore.getState().client;
if (!client) return;
const event = useCalendarStore.getState().events.find(e => e.id === data.eventId);
const hasParticipants = event?.participants && Object.keys(event.participants).length > 0;
await useCalendarStore.getState().updateEvent(client, data.eventId, { start: newStartISO }, hasParticipants || undefined);
} catch {
+3 -3
View File
@@ -262,10 +262,10 @@ export function EventModal({
if (trimmedTitle.length > 500 || description.trim().length > 10000 || location.trim().length > 500) return;
const startStr = allDay
? `${startDate}T00:00:00`
? startDate
: `${startDate}T${startTime}:00`;
const start = new Date(startStr);
const start = allDay ? parseISO(startStr) : new Date(startStr);
let duration: string;
if (allDay) {
@@ -393,7 +393,7 @@ export function EventModal({
uid: newUid,
title: event.title,
description: event.description,
start: format(newStart, "yyyy-MM-dd'T'HH:mm:ss"),
start: event.showWithoutTime ? format(newStart, "yyyy-MM-dd") : format(newStart, "yyyy-MM-dd'T'HH:mm:ss"),
duration: event.duration,
timeZone: event.timeZone,
showWithoutTime: event.showWithoutTime,
+2 -2
View File
@@ -7,7 +7,7 @@ import {
startOfMonth, endOfMonth, startOfWeek, endOfWeek,
addMonths, subMonths, addYears, subYears, setMonth, setYear,
eachDayOfInterval, getMonth, getYear, getISOWeek, getWeek,
isSameDay, isSameMonth, isToday, format,
isSameDay, isSameMonth, isToday, format, parseISO,
} from "date-fns";
import { cn } from "@/lib/utils";
import type { CalendarEvent } from "@/lib/jmap/types";
@@ -54,7 +54,7 @@ export function MiniCalendar({
const eventDates = useMemo(() => {
const set = new Set<string>();
events.forEach(e => {
try { set.add(format(new Date(e.start), "yyyy-MM-dd")); } catch { /* skip */ }
try { set.add(format(parseISO(e.start), "yyyy-MM-dd")); } catch { /* skip */ }
});
return set;
}, [events]);
+1 -1
View File
@@ -97,7 +97,7 @@ export function TaskModal({
due = `${dueDate}T${dueTime}:00`;
showWithoutTime = false;
} else {
due = `${dueDate}T00:00:00`;
due = dueDate;
showWithoutTime = true;
}
}