Skip to content

Commit 2c25108

Browse files
committed
🐛 fix(event-conversion): someday to grid event fix
1 parent 602e958 commit 2c25108

File tree

3 files changed

+58
-18
lines changed

3 files changed

+58
-18
lines changed

packages/web/src/common/utils/event.util.test.ts

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,10 @@
1-
import { isEventInRange } from "./event.util";
1+
import { createMockStandaloneEvent } from "@core/util/test/ccal.event.factory";
2+
import {
3+
Schema_GridEvent,
4+
Schema_WebEvent,
5+
} from "@web/common/types/web.event.types";
6+
import { isEventInRange } from "@web/common/utils/event.util";
7+
import { _assembleGridEvent } from "@web/ducks/events/sagas/saga.util";
28

39
describe("isEventInRange", () => {
410
it("returns true if event is in range", () => {
@@ -9,6 +15,7 @@ describe("isEventInRange", () => {
915
};
1016
expect(isEventInRange(event, dates)).toBe(true);
1117
});
18+
1219
it("returns false if event is not in range", () => {
1320
const event = { start: "2022-03-15", end: "2022-03-15" };
1421
const dates = {
@@ -18,3 +25,31 @@ describe("isEventInRange", () => {
1825
expect(isEventInRange(event, dates)).toBe(false);
1926
});
2027
});
28+
29+
describe("_assembleGridEvent", () => {
30+
it("should successfully convert Someday event to Grid event by adding position field", () => {
31+
// Create a mock Someday event (without position field)
32+
const somedayEvent = createMockStandaloneEvent({
33+
isSomeday: true,
34+
}) as Schema_WebEvent;
35+
36+
const generator = _assembleGridEvent(somedayEvent);
37+
38+
// First, it calls getEventById
39+
const getEventStep = generator.next();
40+
expect(getEventStep.done).toBe(false);
41+
42+
// Mock returning the Someday event
43+
const validateStep = generator.next({ ...somedayEvent, isSomeday: false });
44+
45+
// This should now succeed because the fix adds the required position field
46+
expect(validateStep.done).toBe(true);
47+
const result = validateStep.value as Schema_GridEvent;
48+
49+
// Verify that position field is now present
50+
expect(result.position).toBeDefined();
51+
expect(result.position.isOverlapping).toBe(false);
52+
expect(result.position.widthMultiplier).toBe(1);
53+
expect(result.position.horizontalOrder).toBe(1);
54+
});
55+
});

packages/web/src/common/utils/event.util.ts

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@ import {
2121
Schema_OptimisticEvent,
2222
Schema_WebEvent,
2323
} from "@web/common/types/web.event.types";
24+
import { validateGridEvent } from "@web/common/validators/grid.event.validator";
2425
import { validateSomedayEvent } from "@web/common/validators/someday.event.validator";
25-
import { validateGridEvent } from "../validators/grid.event.validator";
2626

27-
const gridEventDefaultPosition = {
27+
export const gridEventDefaultPosition = {
2828
isOverlapping: false,
2929
widthMultiplier: 1,
3030
horizontalOrder: 1,
@@ -87,7 +87,7 @@ export const assembleDefaultEvent = async (
8787
}
8888
};
8989

90-
export const assembleGridEvent = (event: Schema_Event): Schema_GridEvent => {
90+
export const assembleGridEvent = (event: Schema_WebEvent): Schema_GridEvent => {
9191
const gridEvent: Schema_GridEvent = {
9292
...event,
9393
position: gridEventDefaultPosition,
@@ -97,7 +97,7 @@ export const assembleGridEvent = (event: Schema_Event): Schema_GridEvent => {
9797
origin: event.origin ?? Origin.COMPASS,
9898
priority: event.priority ?? Priorities.UNASSIGNED,
9999
user: event.user!,
100-
recurrence: event.recurrence as Schema_Event_Recur_Base["recurrence"],
100+
recurrence: event.recurrence,
101101
};
102102

103103
return gridEvent;
@@ -203,13 +203,10 @@ export const prepEvtAfterDraftDrop = (
203203
return event;
204204
};
205205

206-
export const prepEvtBeforeSubmit = (
207-
draft: Schema_Event | Schema_GridEvent,
208-
userId: string,
209-
) => {
210-
const _event: Omit<Schema_Event | Schema_GridEvent, "recurrence"> = {
206+
export const prepEvtBeforeSubmit = (draft: Schema_WebEvent, userId: string) => {
207+
const _event = {
211208
...draft,
212-
origin: Origin.COMPASS,
209+
origin: draft.origin ?? Origin.COMPASS,
213210
user: userId,
214211
};
215212

packages/web/src/ducks/events/sagas/saga.util.ts

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
import dayjs from "dayjs";
22
import { normalize, schema } from "normalizr";
3-
import { call, put, select } from "redux-saga/effects";
3+
import { SelectEffect, call, put, select } from "redux-saga/effects";
44
import { ID_OPTIMISTIC_PREFIX } from "@core/constants/core.constants";
55
import {
66
Params_Events,
77
RecurringEventUpdateScope,
88
Schema_Event,
99
} from "@core/types/event.types";
10-
import { Schema_GridEvent } from "@web/common/types/web.event.types";
10+
import {
11+
Schema_GridEvent,
12+
Schema_WebEvent,
13+
} from "@web/common/types/web.event.types";
1114
import {
1215
assembleGridEvent,
1316
replaceIdWithOptimisticId,
@@ -25,8 +28,8 @@ export function* getEventById(
2528
_id: string,
2629
): Generator<
2730
ReturnType<typeof select>,
28-
Schema_GridEvent | undefined,
29-
Schema_GridEvent | undefined
31+
Schema_GridEvent | Schema_WebEvent,
32+
Schema_GridEvent | Schema_WebEvent
3033
> {
3134
const currEvent = yield select((state: RootState) =>
3235
selectEventById(state, _id),
@@ -39,7 +42,7 @@ export function* _editEvent(
3942
gridEvent: Schema_GridEvent,
4043
params: { applyTo?: RecurringEventUpdateScope } = {},
4144
) {
42-
yield call(EventApi.edit, gridEvent._id as string, gridEvent, params);
45+
yield call(EventApi.edit, gridEvent._id, gridEvent, params);
4346
}
4447

4548
export function* insertOptimisticEvent(
@@ -61,17 +64,22 @@ export function* insertOptimisticEvent(
6164
export function* _assembleGridEvent({
6265
_id,
6366
...updatedFields
64-
}: Payload_ConvertEvent["event"]) {
67+
}: Payload_ConvertEvent["event"]): Generator<
68+
SelectEffect,
69+
Schema_GridEvent,
70+
Schema_WebEvent
71+
> {
6572
const currEvent = yield* getEventById(_id);
6673

6774
// First merge the current event with updated fields
68-
const eventWithUpdates = { ...currEvent, ...updatedFields };
75+
const eventWithUpdates = { ...currEvent, ...updatedFields, _id };
6976

7077
// Use assembleGridEvent to ensure position field is properly set
7178
const gridEventWithDefaults = assembleGridEvent(eventWithUpdates);
7279

7380
// Validate the result
7481
const gridEvent = validateGridEvent(gridEventWithDefaults);
82+
7583
return gridEvent;
7684
}
7785

0 commit comments

Comments
 (0)