Skip to content

Commit 565f6d0

Browse files
Update full-day date range defaults (#69)
* Update full-day date range defaults * Refine full-day date range defaults
1 parent 4961e36 commit 565f6d0

2 files changed

Lines changed: 58 additions & 24 deletions

File tree

src/components/create-event-form.test.tsx

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -285,16 +285,18 @@ describe("CreateEventForm", () => {
285285
global.fetch = fetchMock as typeof fetch;
286286

287287
renderCreateEventForm();
288-
vi.useRealTimers();
289-
const user = userEvent.setup();
290288

291-
await user.type(screen.getByLabelText("Event title"), "Offsite days");
292-
await user.click(screen.getByRole("radio", { name: /Full days/i }));
289+
fireEvent.change(screen.getByLabelText("Event title"), {
290+
target: { value: "Offsite days" },
291+
});
292+
fireEvent.click(screen.getByRole("radio", { name: /Full days/i }));
293293

294294
expect(screen.queryByRole("combobox", { name: "Daily start" })).not.toBeInTheDocument();
295295
expect(screen.queryByRole("combobox", { name: "Slot size" })).not.toBeInTheDocument();
296+
expect(screen.getAllByText("Apr 2, 2026 - May 2, 2026").length).toBeGreaterThan(0);
296297

297-
await user.click(screen.getByRole("button", { name: "Create event" }));
298+
vi.useRealTimers();
299+
fireEvent.click(screen.getByRole("button", { name: "Create event" }));
298300

299301
await waitFor(() => {
300302
expect(fetchMock).toHaveBeenCalledTimes(1);
@@ -307,7 +309,21 @@ describe("CreateEventForm", () => {
307309
};
308310

309311
expect(payload.eventType).toBe("full_day");
310-
expect(payload.dates).toEqual(["2026-04-03"]);
312+
expect(payload.dates[0]).toBe("2026-04-02");
313+
expect(payload.dates[payload.dates.length - 1]).toBe("2026-05-01");
314+
});
315+
316+
it("uses the current day when switching a still-default range to full-day after midnight", async () => {
317+
vi.useFakeTimers();
318+
vi.setSystemTime(new Date("2026-04-02T10:00:00.000Z"));
319+
320+
renderCreateEventForm();
321+
322+
vi.setSystemTime(new Date("2026-04-03T00:30:00.000Z"));
323+
324+
fireEvent.click(screen.getByRole("radio", { name: /Full days/i }));
325+
326+
expect(screen.getAllByText("Apr 3, 2026 - May 3, 2026").length).toBeGreaterThan(0);
311327
});
312328

313329
it("submits the optional notification email when alerts are available", async () => {

src/components/create-event-form.tsx

Lines changed: 36 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"use client";
22

3-
import { addDays, eachDayOfInterval, format, isAfter, startOfToday } from "date-fns";
3+
import { addDays, addMonths, eachDayOfInterval, format, isAfter, startOfToday } from "date-fns";
44
import type { DateRange } from "react-day-picker";
55
import {
66
CalendarDaysIcon,
@@ -36,6 +36,7 @@ import {
3636
import { meetingDurationOptions, slotMinuteOptions } from "@/lib/constants";
3737
import { useI18n } from "@/lib/i18n/context";
3838
import { buildTimezoneOptions } from "@/lib/timezone-options";
39+
import type { EventType } from "@/lib/types";
3940
import { cn } from "@/lib/utils";
4041
import { createEventCreateSchema } from "@/lib/validators";
4142

@@ -93,6 +94,21 @@ const defaultSelectedWeekdays = weekdayOptions
9394
.filter((weekday) => weekday.defaultSelected)
9495
.map((weekday) => weekday.value);
9596

97+
function getDefaultDateRange(eventType: EventType, today: Date): DateRange {
98+
if (eventType === "full_day") {
99+
return {
100+
from: today,
101+
to: addMonths(today, 1),
102+
};
103+
}
104+
105+
const tomorrow = addDays(today, 1);
106+
return {
107+
from: tomorrow,
108+
to: addDays(tomorrow, 2),
109+
};
110+
}
111+
96112
function sortWeekdays(values: number[]) {
97113
return [...values].sort(
98114
(left, right) =>
@@ -171,23 +187,13 @@ export function CreateEventForm({
171187
const [errorMessage, setErrorMessage] = useState<string | null>(null);
172188
const [fieldErrors, setFieldErrors] = useState<EventFormErrors>({});
173189
const [isRangePickerOpen, setIsRangePickerOpen] = useState(false);
174-
const [eventType, setEventType] = useState<"time_grid" | "full_day">("time_grid");
190+
const [initialDateRange] = useState(() => getDefaultDateRange("time_grid", startOfToday()));
191+
const [eventType, setEventType] = useState<EventType>("time_grid");
175192
const [title, setTitle] = useState("");
176193
const [notificationEmail, setNotificationEmail] = useState("");
177-
const [dateRange, setDateRange] = useState<DateRange | undefined>(() => {
178-
const tomorrow = addDays(new Date(), 1);
179-
return {
180-
from: tomorrow,
181-
to: addDays(tomorrow, 2),
182-
};
183-
});
184-
const [draftDateRange, setDraftDateRange] = useState<DateRange | undefined>(() => {
185-
const tomorrow = addDays(new Date(), 1);
186-
return {
187-
from: tomorrow,
188-
to: addDays(tomorrow, 2),
189-
};
190-
});
194+
const [dateRange, setDateRange] = useState<DateRange | undefined>(initialDateRange);
195+
const [draftDateRange, setDraftDateRange] = useState<DateRange | undefined>(initialDateRange);
196+
const [usesDefaultDateRange, setUsesDefaultDateRange] = useState(true);
191197
const [timezone, setTimezone] = useState(() => {
192198
const browserTimezone =
193199
typeof window !== "undefined"
@@ -309,6 +315,7 @@ export function CreateEventForm({
309315
}
310316

311317
setDateRange(draftDateRange);
318+
setUsesDefaultDateRange(false);
312319
clearErrors("dates");
313320
setIsRangePickerOpen(false);
314321
}
@@ -324,6 +331,17 @@ export function CreateEventForm({
324331
clearErrors("weekdays", "dates");
325332
}
326333

334+
function selectEventType(nextEventType: EventType) {
335+
if (usesDefaultDateRange) {
336+
const nextDefaultRange = getDefaultDateRange(nextEventType, startOfToday());
337+
setDateRange(nextDefaultRange);
338+
setDraftDateRange(nextDefaultRange);
339+
clearErrors("dates", "weekdays");
340+
}
341+
342+
setEventType(nextEventType);
343+
}
344+
327345
function onSubmit(event: React.FormEvent<HTMLFormElement>) {
328346
event.preventDefault();
329347
setErrorMessage(null);
@@ -446,7 +464,7 @@ export function CreateEventForm({
446464
eventType === "time_grid" && "border-primary bg-primary/8",
447465
)}
448466
onClick={() => {
449-
setEventType("time_grid");
467+
selectEventType("time_grid");
450468
clearErrors("eventType");
451469
}}
452470
>
@@ -469,7 +487,7 @@ export function CreateEventForm({
469487
eventType === "full_day" && "border-primary bg-primary/8",
470488
)}
471489
onClick={() => {
472-
setEventType("full_day");
490+
selectEventType("full_day");
473491
clearErrors(
474492
"eventType",
475493
"dayStartMinutes",

0 commit comments

Comments
 (0)