(null);
-
- // Listen to createEvent slice state for success/error
- const createEventState = useSelector((state: RootState) => state.createEvent);
-
- // Handle task deletion on successful event creation or cleanup on error
- useEffect(() => {
- const eventId = processingEventId.current;
- if (!eventId) return;
-
- // Check if we've transitioned from processing to a final state
- if (!createEventState.isProcessing) {
- const deleteTask = pendingTaskDeletions.current.get(eventId);
-
- if (createEventState.isSuccess && deleteTask) {
- // Event was created successfully, delete the task
- deleteTask();
- }
-
- // Clean up regardless of success or error to prevent memory leaks
- pendingTaskDeletions.current.delete(eventId);
- processingEventId.current = null;
- }
- }, [
- createEventState.isProcessing,
- createEventState.isSuccess,
- createEventState.error,
- ]);
-
const convertTaskToEventOnAgenda = useCallback(
async (
task: Task,
@@ -90,28 +56,27 @@ export function useEventDNDActions() {
const userId = await getUserId();
if (!userId) return;
- let startTime: dayjs.Dayjs;
-
- if (isAllDay) {
- // For all-day events, use the start of the day
- startTime = dateInView.startOf("day");
- } else {
- // For timed events, snap to grid
- const snappedMinutes = getSnappedMinutes(active, over);
- if (snappedMinutes === null) return;
- startTime = dateInView.startOf("day").add(snappedMinutes, "minute");
- }
+ const event = handleTaskToEventConversion(
+ task,
+ active,
+ over,
+ dateInView,
+ userId,
+ isAllDay,
+ );
- // Convert task to event (default duration is now 30 minutes)
- const event = convertTaskToEvent(task, startTime, 30, userId, isAllDay);
+ if (!event) return;
- // Store the task deletion callback to be executed on successful event creation
- pendingTaskDeletions.current.set(event._id!, deleteTask);
- processingEventId.current = event._id!;
+ // Add to pending events slice for tracking
+ dispatch(pendingEventsSlice.actions.add(event._id!));
// Create the event optimistically
dispatch(createEventSlice.actions.request(event));
+ // TODO: Listen to createEvent saga success/error and delete task on success
+ // For now, we delete immediately for the MVP
+ deleteTask();
+
reorderGrid();
setReference(event._id!);
},
diff --git a/packages/web/src/views/Day/components/Task/DraggableTask.tsx b/packages/web/src/views/Day/components/Task/DraggableTask.tsx
index 8c9739609..9960e421c 100644
--- a/packages/web/src/views/Day/components/Task/DraggableTask.tsx
+++ b/packages/web/src/views/Day/components/Task/DraggableTask.tsx
@@ -5,6 +5,7 @@ import { autoUpdate, inline, offset, useFloating } from "@floating-ui/react";
import { DotsSixVerticalIcon } from "@phosphor-icons/react";
import { Task } from "@web/common/types/task.types";
import { DNDChildProps, Draggable } from "@web/components/DND/Draggable";
+import { DraggableTaskHandle } from "@web/views/Day/components/Task/DraggableTaskHandle";
import { Task as TaskComponent } from "@web/views/Day/components/Task/Task";
import { useTasks } from "@web/views/Day/hooks/tasks/useTasks";
@@ -127,31 +128,16 @@ function DraggableTaskInner({
return (
- {tasks.length > 1 ? (
-
- ) : null}
+
void;
+}
+
+export function DraggableTaskHandle({
+ task,
+ index,
+ tasksLength,
+ isDragging,
+ listeners,
+ refs,
+ floatingStyles,
+ onFocus,
+}: DraggableTaskHandleProps) {
+ if (tasksLength <= 1) return null;
+
+ return (
+
+ );
+}
diff --git a/packages/web/src/views/Day/util/task/convertTaskToEvent.ts b/packages/web/src/views/Day/util/task/convertTaskToEvent.ts
index 32675c3ab..bc6f588a5 100644
--- a/packages/web/src/views/Day/util/task/convertTaskToEvent.ts
+++ b/packages/web/src/views/Day/util/task/convertTaskToEvent.ts
@@ -1,6 +1,6 @@
import { ObjectId } from "bson";
import { Origin, Priorities } from "@core/constants/core.constants";
-import { Schema_Event } from "@core/types/event.types";
+import { Schema_Event_Core } from "@core/types/event.types";
import dayjs, { Dayjs } from "@core/util/date/dayjs";
import { Task } from "@web/common/types/task.types";
@@ -19,7 +19,7 @@ export function convertTaskToEvent(
durationMinutes: number = 30,
userId: string,
isAllDay: boolean = false,
-): Schema_Event {
+): Schema_Event_Core {
const endTime = startTime.add(durationMinutes, "minute");
return {
diff --git a/packages/web/src/views/Day/util/task/handleTaskToEventConversion.test.ts b/packages/web/src/views/Day/util/task/handleTaskToEventConversion.test.ts
new file mode 100644
index 000000000..69cb526a6
--- /dev/null
+++ b/packages/web/src/views/Day/util/task/handleTaskToEventConversion.test.ts
@@ -0,0 +1,127 @@
+import { Active, Over } from "@dnd-kit/core";
+import { createMockTask } from "@core/__tests__/helpers/task.factory";
+import dayjs from "@core/util/date/dayjs";
+import * as agendaUtil from "@web/views/Day/util/agenda/agenda.util";
+import { handleTaskToEventConversion } from "./handleTaskToEventConversion";
+
+jest.mock("@web/views/Day/util/agenda/agenda.util");
+
+describe("handleTaskToEventConversion", () => {
+ const userId = "user123";
+ const dateInView = dayjs("2024-01-15");
+ const mockTask = createMockTask({
+ title: "Test Task",
+ description: "Test Description",
+ });
+
+ const mockActive: Active = {
+ id: "task-1",
+ data: {
+ current: {},
+ },
+ rect: {
+ current: {
+ initial: null,
+ translated: null,
+ },
+ },
+ };
+
+ const mockOver: Over = {
+ id: "grid-main",
+ data: {
+ current: {},
+ },
+ rect: {
+ width: 0,
+ height: 0,
+ top: 0,
+ bottom: 0,
+ left: 0,
+ right: 0,
+ },
+ disabled: false,
+ };
+
+ beforeEach(() => {
+ jest.clearAllMocks();
+ });
+
+ it("should create a timed event when isAllDay is false", () => {
+ const snappedMinutes = 600; // 10:00 AM
+ (agendaUtil.getSnappedMinutes as jest.Mock).mockReturnValue(snappedMinutes);
+
+ const result = handleTaskToEventConversion(
+ mockTask,
+ mockActive,
+ mockOver,
+ dateInView,
+ userId,
+ false,
+ );
+
+ expect(result).not.toBeNull();
+ expect(result?.title).toBe("Test Task");
+ expect(result?.description).toBe("Test Description");
+ expect(result?.isAllDay).toBe(false);
+ expect(result?.user).toBe(userId);
+
+ // Check that startDate is set to 10:00 AM on the dateInView
+ const startDate = dayjs(result?.startDate);
+ expect(startDate.format("YYYY-MM-DD HH:mm")).toBe("2024-01-15 10:00");
+
+ // Check that endDate is 30 minutes after startDate
+ const endDate = dayjs(result?.endDate);
+ expect(endDate.diff(startDate, "minute")).toBe(30);
+ });
+
+ it("should create an all-day event when isAllDay is true", () => {
+ const result = handleTaskToEventConversion(
+ mockTask,
+ mockActive,
+ mockOver,
+ dateInView,
+ userId,
+ true,
+ );
+
+ expect(result).not.toBeNull();
+ expect(result?.title).toBe("Test Task");
+ expect(result?.isAllDay).toBe(true);
+ expect(result?.user).toBe(userId);
+
+ // Check that startDate is at the start of the day
+ const startDate = dayjs(result?.startDate);
+ expect(startDate.format("YYYY-MM-DD HH:mm")).toBe("2024-01-15 00:00");
+ });
+
+ it("should return null when getSnappedMinutes returns null for timed events", () => {
+ (agendaUtil.getSnappedMinutes as jest.Mock).mockReturnValue(null);
+
+ const result = handleTaskToEventConversion(
+ mockTask,
+ mockActive,
+ mockOver,
+ dateInView,
+ userId,
+ false,
+ );
+
+ expect(result).toBeNull();
+ });
+
+ it("should not call getSnappedMinutes for all-day events", () => {
+ const getSnappedMinutesSpy = jest.spyOn(agendaUtil, "getSnappedMinutes");
+
+ handleTaskToEventConversion(
+ mockTask,
+ mockActive,
+ mockOver,
+ dateInView,
+ userId,
+ true,
+ );
+
+ expect(getSnappedMinutesSpy).not.toHaveBeenCalled();
+ });
+});
diff --git a/packages/web/src/views/Day/util/task/handleTaskToEventConversion.ts b/packages/web/src/views/Day/util/task/handleTaskToEventConversion.ts
new file mode 100644
index 000000000..d34c5ab30
--- /dev/null
+++ b/packages/web/src/views/Day/util/task/handleTaskToEventConversion.ts
@@ -0,0 +1,42 @@
+import { Active, Over } from "@dnd-kit/core";
+import { Schema_Event_Core } from "@core/types/event.types";
+import dayjs from "@core/util/date/dayjs";
+import { Task } from "@web/common/types/task.types";
+import { getSnappedMinutes } from "@web/views/Day/util/agenda/agenda.util";
+import { convertTaskToEvent } from "@web/views/Day/util/task/convertTaskToEvent";
+
+/**
+ * Handles the conversion of a task to an event when dropped on the agenda
+ * @param task - The task to convert
+ * @param active - The active drag item from dnd-kit
+ * @param over - The drop target from dnd-kit
+ * @param dateInView - The current date being viewed
+ * @param userId - The user ID
+ * @param isAllDay - Whether the event should be all-day
+ * @returns The created event or null if conversion failed
+ */
+export function handleTaskToEventConversion(
+ task: Task,
+ active: Active,
+ over: Over,
+ dateInView: dayjs.Dayjs,
+ userId: string,
+ isAllDay: boolean,
+): Schema_Event_Core | null {
+ let startTime: dayjs.Dayjs;
+
+ if (isAllDay) {
+ // For all-day events, use the start of the day
+ startTime = dateInView.startOf("day");
+ } else {
+ // For timed events, snap to grid
+ const snappedMinutes = getSnappedMinutes(active, over);
+ if (snappedMinutes === null) return null;
+ startTime = dateInView.startOf("day").add(snappedMinutes, "minute");
+ }
+
+ // Convert task to event (default duration is 30 minutes)
+ const event = convertTaskToEvent(task, startTime, 30, userId, isAllDay);
+
+ return event;
+}
From 5af5d6e6e32761ff66f0efcb968f5e63f4433f2f Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 2 Jan 2026 00:48:17 +0000
Subject: [PATCH 13/16] Remove doc comment and replace TODO with explanation of
current approach
Co-authored-by: tyler-dane <30163055+tyler-dane@users.noreply.github.com>
---
packages/web/src/common/hooks/useEventDNDActions.ts | 11 ++++++-----
.../Day/util/task/handleTaskToEventConversion.ts | 10 ----------
2 files changed, 6 insertions(+), 15 deletions(-)
diff --git a/packages/web/src/common/hooks/useEventDNDActions.ts b/packages/web/src/common/hooks/useEventDNDActions.ts
index 8d5e10ec9..a7c57ce8b 100644
--- a/packages/web/src/common/hooks/useEventDNDActions.ts
+++ b/packages/web/src/common/hooks/useEventDNDActions.ts
@@ -67,14 +67,15 @@ export function useEventDNDActions() {
if (!event) return;
- // Add to pending events slice for tracking
+ // Add event to pending events and create optimistically
dispatch(pendingEventsSlice.actions.add(event._id!));
-
- // Create the event optimistically
dispatch(createEventSlice.actions.request(event));
- // TODO: Listen to createEvent saga success/error and delete task on success
- // For now, we delete immediately for the MVP
+ // Note: Task deletion happens immediately for simplicity. The event saga
+ // will remove the optimistic event if creation fails, but the task cannot
+ // be restored because tasks are not in Redux (only local state + localStorage).
+ // Proper error handling would require: (1) moving tasks to Redux, (2) storing
+ // task-to-event mappings, and (3) dispatching deleteTask actions from the saga.
deleteTask();
reorderGrid();
diff --git a/packages/web/src/views/Day/util/task/handleTaskToEventConversion.ts b/packages/web/src/views/Day/util/task/handleTaskToEventConversion.ts
index d34c5ab30..8da92ee1b 100644
--- a/packages/web/src/views/Day/util/task/handleTaskToEventConversion.ts
+++ b/packages/web/src/views/Day/util/task/handleTaskToEventConversion.ts
@@ -5,16 +5,6 @@ import { Task } from "@web/common/types/task.types";
import { getSnappedMinutes } from "@web/views/Day/util/agenda/agenda.util";
import { convertTaskToEvent } from "@web/views/Day/util/task/convertTaskToEvent";
-/**
- * Handles the conversion of a task to an event when dropped on the agenda
- * @param task - The task to convert
- * @param active - The active drag item from dnd-kit
- * @param over - The drop target from dnd-kit
- * @param dateInView - The current date being viewed
- * @param userId - The user ID
- * @param isAllDay - Whether the event should be all-day
- * @returns The created event or null if conversion failed
- */
export function handleTaskToEventConversion(
task: Task,
active: Active,
From ee85d21d006bc6f681d9aaa938a3f1858f2c65bd Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 2 Jan 2026 01:25:15 +0000
Subject: [PATCH 14/16] Address code review: restore task.test.util.ts,
simplify conditionals, enforce required DND data fields, remove docstring
Co-authored-by: tyler-dane <30163055+tyler-dane@users.noreply.github.com>
---
.../__tests__/utils/tasks/task.test.util.ts | 48 +++++++++++++++++++
.../src/common/hooks/useEventDNDActions.ts | 25 ++++------
packages/web/src/components/DND/Draggable.tsx | 6 +--
.../DraggableAllDayAgendaEvent.tsx | 2 +
.../DraggableTimedAgendaEvent.tsx | 2 +
.../Day/components/Task/DraggableTask.tsx | 1 +
.../views/Day/util/task/convertTaskToEvent.ts | 9 ----
7 files changed, 66 insertions(+), 27 deletions(-)
create mode 100644 packages/web/src/__tests__/utils/tasks/task.test.util.ts
diff --git a/packages/web/src/__tests__/utils/tasks/task.test.util.ts b/packages/web/src/__tests__/utils/tasks/task.test.util.ts
new file mode 100644
index 000000000..3cdb08cef
--- /dev/null
+++ b/packages/web/src/__tests__/utils/tasks/task.test.util.ts
@@ -0,0 +1,48 @@
+import { act } from "react";
+import { screen, waitFor } from "@testing-library/react";
+import userEvent from "@testing-library/user-event";
+
+type User = ReturnType;
+
+export const addTasks = async (user: User, taskTitles: string[]) => {
+ for (const title of taskTitles) {
+ // Wait for the add button to be available
+ await clickCreateTaskButton(user);
+
+ // Wait for the input to appear
+ const input = await waitFor(() =>
+ screen.getByPlaceholderText("Enter task title..."),
+ );
+
+ await act(async () => {
+ await user.type(input, `${title}{Enter}`);
+ });
+
+ // Wait for the task to be created and appear in the DOM
+ await waitFor(
+ () => {
+ const elements = screen.getAllByDisplayValue(title);
+ expect(elements.length).toBeGreaterThan(0);
+ },
+ { timeout: 5000 },
+ );
+ }
+};
+
+export const clickCreateTaskButton = async (user: User) => {
+ const addButton = await waitFor(() =>
+ screen.getByRole("button", { name: "Create new task" }),
+ );
+ await act(async () => {
+ await user.click(addButton);
+ });
+};
+
+export const focusOnTaskCheckbox = async (user: User, title: string) => {
+ const checkbox = await waitFor(() =>
+ screen.getByRole("checkbox", { name: `Toggle ${title}` }),
+ );
+ await act(async () => {
+ checkbox.focus();
+ });
+};
diff --git a/packages/web/src/common/hooks/useEventDNDActions.ts b/packages/web/src/common/hooks/useEventDNDActions.ts
index a7c57ce8b..33c2618a6 100644
--- a/packages/web/src/common/hooks/useEventDNDActions.ts
+++ b/packages/web/src/common/hooks/useEventDNDActions.ts
@@ -181,29 +181,24 @@ export function useEventDNDActions() {
switch (switchCase) {
case `day-task-to-${ID_GRID_MAIN}`:
- if (task && deleteTask) {
- convertTaskToEventOnAgenda(task, active, over, deleteTask, false);
- }
+ if (!task || !deleteTask) break;
+ convertTaskToEventOnAgenda(task, active, over, deleteTask, false);
break;
case `day-task-to-${ID_GRID_ALLDAY_ROW}`:
- if (task && deleteTask) {
- convertTaskToEventOnAgenda(task, active, over, deleteTask, true);
- }
+ if (!task || !deleteTask) break;
+ convertTaskToEventOnAgenda(task, active, over, deleteTask, true);
break;
case `day-${Categories_Event.ALLDAY}-to-${ID_GRID_MAIN}`:
- if (event) {
- moveAllDayToMainGridDayView(event, active, over);
- }
+ if (!event) break;
+ moveAllDayToMainGridDayView(event, active, over);
break;
case `day-${Categories_Event.TIMED}-to-${ID_GRID_MAIN}`:
- if (event) {
- moveTimedAroundMainGridDayView(event, active, over);
- }
+ if (!event) break;
+ moveTimedAroundMainGridDayView(event, active, over);
break;
case `day-${Categories_Event.TIMED}-to-${ID_GRID_ALLDAY_ROW}`:
- if (event) {
- moveTimedToAllDayGridDayView(event);
- }
+ if (!event) break;
+ moveTimedToAllDayGridDayView(event);
break;
}
},
diff --git a/packages/web/src/components/DND/Draggable.tsx b/packages/web/src/components/DND/Draggable.tsx
index d899a5f09..3675d9e96 100644
--- a/packages/web/src/components/DND/Draggable.tsx
+++ b/packages/web/src/components/DND/Draggable.tsx
@@ -24,10 +24,10 @@ export type DraggableDataType = Categories_Event | "task";
export interface DraggableDNDData {
type: DraggableDataType;
- event?: Schema_GridEvent | null;
- task?: Task | null;
+ event: Schema_GridEvent | null;
+ task: Task | null;
view: "day" | "week" | "now";
- deleteTask?: () => void;
+ deleteTask: (() => void) | null;
}
export interface DNDChildProps
diff --git a/packages/web/src/views/Day/components/Agenda/Events/AllDayAgendaEvent/DraggableAllDayAgendaEvent.tsx b/packages/web/src/views/Day/components/Agenda/Events/AllDayAgendaEvent/DraggableAllDayAgendaEvent.tsx
index 865253681..1a38391d4 100644
--- a/packages/web/src/views/Day/components/Agenda/Events/AllDayAgendaEvent/DraggableAllDayAgendaEvent.tsx
+++ b/packages/web/src/views/Day/components/Agenda/Events/AllDayAgendaEvent/DraggableAllDayAgendaEvent.tsx
@@ -53,7 +53,9 @@ export const DraggableAllDayAgendaEvent = memo(
data: {
event,
type: Categories_Event.ALLDAY,
+ task: null,
view: "day",
+ deleteTask: null,
},
disabled: isDisabled,
}}
diff --git a/packages/web/src/views/Day/components/Agenda/Events/TimedAgendaEvent/DraggableTimedAgendaEvent.tsx b/packages/web/src/views/Day/components/Agenda/Events/TimedAgendaEvent/DraggableTimedAgendaEvent.tsx
index d6c2b81ec..589c0449f 100644
--- a/packages/web/src/views/Day/components/Agenda/Events/TimedAgendaEvent/DraggableTimedAgendaEvent.tsx
+++ b/packages/web/src/views/Day/components/Agenda/Events/TimedAgendaEvent/DraggableTimedAgendaEvent.tsx
@@ -92,7 +92,9 @@ export const DraggableTimedAgendaEvent = memo(
data: {
event: event,
type: Categories_Event.TIMED,
+ task: null,
view: "day",
+ deleteTask: null,
},
disabled: isDisabled,
}}
diff --git a/packages/web/src/views/Day/components/Task/DraggableTask.tsx b/packages/web/src/views/Day/components/Task/DraggableTask.tsx
index 9960e421c..e5bc0b84d 100644
--- a/packages/web/src/views/Day/components/Task/DraggableTask.tsx
+++ b/packages/web/src/views/Day/components/Task/DraggableTask.tsx
@@ -49,6 +49,7 @@ export function DraggableTask({
id: task.id,
data: {
type: "task",
+ event: null,
task,
view: "day",
deleteTask: () => deleteTask(task.id),
diff --git a/packages/web/src/views/Day/util/task/convertTaskToEvent.ts b/packages/web/src/views/Day/util/task/convertTaskToEvent.ts
index bc6f588a5..94586753c 100644
--- a/packages/web/src/views/Day/util/task/convertTaskToEvent.ts
+++ b/packages/web/src/views/Day/util/task/convertTaskToEvent.ts
@@ -4,15 +4,6 @@ import { Schema_Event_Core } from "@core/types/event.types";
import dayjs, { Dayjs } from "@core/util/date/dayjs";
import { Task } from "@web/common/types/task.types";
-/**
- * Converts a task to an event
- * @param task - The task to convert
- * @param startTime - The start time for the event (should be snapped to the grid)
- * @param durationMinutes - The duration of the event in minutes (default: 30)
- * @param userId - The user ID
- * @param isAllDay - Whether the event is an all-day event (default: false)
- * @returns A new event schema
- */
export function convertTaskToEvent(
task: Task,
startTime: Dayjs,
From 35691f3ed4db15dea2a9b6ed80f8c913183473b6 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 2 Jan 2026 01:36:23 +0000
Subject: [PATCH 15/16] Fix missing getSnappedMinutes import in
useEventDNDActions
Co-authored-by: tyler-dane <30163055+tyler-dane@users.noreply.github.com>
---
packages/web/src/common/hooks/useEventDNDActions.ts | 1 +
1 file changed, 1 insertion(+)
diff --git a/packages/web/src/common/hooks/useEventDNDActions.ts b/packages/web/src/common/hooks/useEventDNDActions.ts
index 33c2618a6..2006a114d 100644
--- a/packages/web/src/common/hooks/useEventDNDActions.ts
+++ b/packages/web/src/common/hooks/useEventDNDActions.ts
@@ -23,6 +23,7 @@ import { pendingEventsSlice } from "@web/ducks/events/slices/pending.slice";
import { store } from "@web/store";
import { useAppDispatch } from "@web/store/store.hooks";
import { useDateInView } from "@web/views/Day/hooks/navigation/useDateInView";
+import { getSnappedMinutes } from "@web/views/Day/util/agenda/agenda.util";
import { handleTaskToEventConversion } from "@web/views/Day/util/task/handleTaskToEventConversion";
const shouldSaveImmediately = (_id: string) => {
From dbec324ba80cf5b2a271ee31d133a8e71a618181 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 2 Jan 2026 02:20:52 +0000
Subject: [PATCH 16/16] Rename handleTaskToEventConversion to task.util and
merge latest from main
Co-authored-by: tyler-dane <30163055+tyler-dane@users.noreply.github.com>
---
packages/web/src/common/hooks/useEventDNDActions.ts | 2 +-
.../{handleTaskToEventConversion.test.ts => task.util.test.ts} | 2 +-
.../util/task/{handleTaskToEventConversion.ts => task.util.ts} | 0
3 files changed, 2 insertions(+), 2 deletions(-)
rename packages/web/src/views/Day/util/task/{handleTaskToEventConversion.test.ts => task.util.test.ts} (97%)
rename packages/web/src/views/Day/util/task/{handleTaskToEventConversion.ts => task.util.ts} (100%)
diff --git a/packages/web/src/common/hooks/useEventDNDActions.ts b/packages/web/src/common/hooks/useEventDNDActions.ts
index 2006a114d..8368e9e37 100644
--- a/packages/web/src/common/hooks/useEventDNDActions.ts
+++ b/packages/web/src/common/hooks/useEventDNDActions.ts
@@ -24,7 +24,7 @@ import { store } from "@web/store";
import { useAppDispatch } from "@web/store/store.hooks";
import { useDateInView } from "@web/views/Day/hooks/navigation/useDateInView";
import { getSnappedMinutes } from "@web/views/Day/util/agenda/agenda.util";
-import { handleTaskToEventConversion } from "@web/views/Day/util/task/handleTaskToEventConversion";
+import { handleTaskToEventConversion } from "@web/views/Day/util/task/task.util";
const shouldSaveImmediately = (_id: string) => {
const storeEvent = selectEventById(store.getState(), _id);
diff --git a/packages/web/src/views/Day/util/task/handleTaskToEventConversion.test.ts b/packages/web/src/views/Day/util/task/task.util.test.ts
similarity index 97%
rename from packages/web/src/views/Day/util/task/handleTaskToEventConversion.test.ts
rename to packages/web/src/views/Day/util/task/task.util.test.ts
index 69cb526a6..4a1415b19 100644
--- a/packages/web/src/views/Day/util/task/handleTaskToEventConversion.test.ts
+++ b/packages/web/src/views/Day/util/task/task.util.test.ts
@@ -2,7 +2,7 @@ import { Active, Over } from "@dnd-kit/core";
import { createMockTask } from "@core/__tests__/helpers/task.factory";
import dayjs from "@core/util/date/dayjs";
import * as agendaUtil from "@web/views/Day/util/agenda/agenda.util";
-import { handleTaskToEventConversion } from "./handleTaskToEventConversion";
+import { handleTaskToEventConversion } from "./task.util";
jest.mock("@web/views/Day/util/agenda/agenda.util");
diff --git a/packages/web/src/views/Day/util/task/handleTaskToEventConversion.ts b/packages/web/src/views/Day/util/task/task.util.ts
similarity index 100%
rename from packages/web/src/views/Day/util/task/handleTaskToEventConversion.ts
rename to packages/web/src/views/Day/util/task/task.util.ts