Skip to content

Commit 32a93bc

Browse files
authored
fix(web): stabilize empty event selectors (#1832)
1 parent cdc427e commit 32a93bc

2 files changed

Lines changed: 46 additions & 13 deletions

File tree

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import { type RootState } from "@web/store";
2+
import {
3+
selectAllDayDayEvents,
4+
selectDayEvents,
5+
selectEventEntities,
6+
selectTimedDayEvents,
7+
} from "./event.selectors";
8+
9+
const createDayRefreshStateBeforeEventsLoad = (): RootState =>
10+
({
11+
events: {
12+
entities: {},
13+
getDayEvents: {
14+
value: null,
15+
},
16+
},
17+
}) as RootState;
18+
19+
const dayViewRefreshSelectors: Array<[string, (state: RootState) => unknown]> =
20+
[
21+
["event entities", selectEventEntities],
22+
["day events", selectDayEvents],
23+
["timed day events", selectTimedDayEvents],
24+
["all-day day events", selectAllDayDayEvents],
25+
];
26+
27+
describe("Day View event selector stability", () => {
28+
it.each(
29+
dayViewRefreshSelectors,
30+
)("keeps %s stable before the event request succeeds", (_label, selector) => {
31+
const state = createDayRefreshStateBeforeEventsLoad();
32+
const selected = selector(state);
33+
34+
expect(selector(state)).toBe(selected);
35+
});
36+
});

packages/web/src/ducks/events/selectors/event.selectors.ts

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,17 @@ import {
88
hasEventDates,
99
} from "@web/common/utils/event/event.util";
1010
import { assignEventsToRow } from "@web/common/utils/grid/assign.row";
11+
import { type Entities_Event } from "@web/ducks/events/event.types";
1112
import { type RootState } from "@web/store";
1213

1314
type Schema_GridEvent_NoPosition = Omit<Schema_GridEvent, "position">;
1415

16+
const EMPTY_EVENT_ENTITIES: Entities_Event = {};
17+
const EMPTY_EVENT_IDS: string[] = [];
18+
19+
export const selectEventEntities = (state: RootState) =>
20+
state.events.entities.value ?? EMPTY_EVENT_ENTITIES;
21+
1522
export const selectAllDayEvents = createSelector(
1623
(state: RootState) => state.events.entities.value || {},
1724
(state: RootState) => state.events.getWeekEvents.value || [],
@@ -35,9 +42,6 @@ export const selectEventById = (
3542
id: string,
3643
): Schema_Event | null => selectEventEntities(state)[id] ?? null;
3744

38-
export const selectEventEntities = (state: RootState) =>
39-
state.events.entities.value || {};
40-
4145
export const selectGridEvents = createSelector(
4246
(state: RootState) => state.events.entities.value || {},
4347
(state: RootState) => state.events.getWeekEvents.value || [],
@@ -67,18 +71,11 @@ export const selectRowCount = createSelector(
6771
},
6872
);
6973

70-
const selectDayEventIds = (state: RootState) => {
71-
const value = state.events.getDayEvents.value;
72-
73-
if (!value || !("data" in value)) {
74-
return [];
75-
}
76-
77-
return value.data ?? [];
78-
};
74+
const selectDayEventIds = (state: RootState) =>
75+
state.events.getDayEvents.value?.data ?? EMPTY_EVENT_IDS;
7976

8077
export const selectDayEvents = createSelector(
81-
(state: RootState) => state.events.entities.value || {},
78+
selectEventEntities,
8279
selectDayEventIds,
8380
(entities, ids) =>
8481
ids

0 commit comments

Comments
 (0)