@sunsama/event-calendar 0.2.6 → 0.2.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/lib/commonjs/components/all-day-events.js +3 -13
  2. package/lib/commonjs/components/all-day-events.js.map +1 -1
  3. package/lib/commonjs/components/event-container.js.map +1 -1
  4. package/lib/commonjs/components/timed-event-container.js.map +1 -1
  5. package/lib/commonjs/hooks/use-events.js +4 -4
  6. package/lib/commonjs/hooks/use-events.js.map +1 -1
  7. package/lib/commonjs/hooks/use-is-editing.js.map +1 -1
  8. package/lib/commonjs/index.js.map +1 -1
  9. package/lib/commonjs/utils/compute-positioning.js.map +1 -1
  10. package/lib/commonjs/utils/double-tap-reset-zoom-gesture.js.map +1 -1
  11. package/lib/commonjs/utils/generate-event-layouts.js.map +1 -1
  12. package/lib/commonjs/utils/globals.js.map +1 -1
  13. package/lib/commonjs/utils/pan-edit-event-gesture.js.map +1 -1
  14. package/lib/module/components/all-day-events.js +3 -13
  15. package/lib/module/components/all-day-events.js.map +1 -1
  16. package/lib/module/components/event-container.js.map +1 -1
  17. package/lib/module/components/timed-event-container.js.map +1 -1
  18. package/lib/module/hooks/use-events.js +4 -4
  19. package/lib/module/hooks/use-events.js.map +1 -1
  20. package/lib/module/hooks/use-is-editing.js.map +1 -1
  21. package/lib/module/index.js.map +1 -1
  22. package/lib/module/utils/compute-positioning.js.map +1 -1
  23. package/lib/module/utils/double-tap-reset-zoom-gesture.js.map +1 -1
  24. package/lib/module/utils/generate-event-layouts.js.map +1 -1
  25. package/lib/module/utils/globals.js.map +1 -1
  26. package/lib/module/utils/pan-edit-event-gesture.js.map +1 -1
  27. package/lib/typescript/commonjs/components/all-day-events.d.ts.map +1 -1
  28. package/lib/typescript/commonjs/components/event-container.d.ts +4 -4
  29. package/lib/typescript/commonjs/components/event-container.d.ts.map +1 -1
  30. package/lib/typescript/commonjs/components/timed-event-container.d.ts +4 -4
  31. package/lib/typescript/commonjs/components/timed-event-container.d.ts.map +1 -1
  32. package/lib/typescript/commonjs/hooks/use-events.d.ts +12 -12
  33. package/lib/typescript/commonjs/hooks/use-events.d.ts.map +1 -1
  34. package/lib/typescript/commonjs/hooks/use-is-editing.d.ts +6 -6
  35. package/lib/typescript/commonjs/hooks/use-is-editing.d.ts.map +1 -1
  36. package/lib/typescript/commonjs/index.d.ts +11 -11
  37. package/lib/typescript/commonjs/index.d.ts.map +1 -1
  38. package/lib/typescript/commonjs/types.d.ts +15 -15
  39. package/lib/typescript/commonjs/types.d.ts.map +1 -1
  40. package/lib/typescript/commonjs/utils/compute-positioning.d.ts +4 -4
  41. package/lib/typescript/commonjs/utils/compute-positioning.d.ts.map +1 -1
  42. package/lib/typescript/commonjs/utils/double-tap-reset-zoom-gesture.d.ts +2 -2
  43. package/lib/typescript/commonjs/utils/double-tap-reset-zoom-gesture.d.ts.map +1 -1
  44. package/lib/typescript/commonjs/utils/generate-event-layouts.d.ts +4 -4
  45. package/lib/typescript/commonjs/utils/generate-event-layouts.d.ts.map +1 -1
  46. package/lib/typescript/commonjs/utils/globals.d.ts +1 -1
  47. package/lib/typescript/commonjs/utils/globals.d.ts.map +1 -1
  48. package/lib/typescript/commonjs/utils/pan-edit-event-gesture.d.ts +2 -2
  49. package/lib/typescript/commonjs/utils/pan-edit-event-gesture.d.ts.map +1 -1
  50. package/lib/typescript/module/components/all-day-events.d.ts.map +1 -1
  51. package/lib/typescript/module/components/event-container.d.ts +4 -4
  52. package/lib/typescript/module/components/event-container.d.ts.map +1 -1
  53. package/lib/typescript/module/components/timed-event-container.d.ts +4 -4
  54. package/lib/typescript/module/components/timed-event-container.d.ts.map +1 -1
  55. package/lib/typescript/module/hooks/use-events.d.ts +12 -12
  56. package/lib/typescript/module/hooks/use-events.d.ts.map +1 -1
  57. package/lib/typescript/module/hooks/use-is-editing.d.ts +6 -6
  58. package/lib/typescript/module/hooks/use-is-editing.d.ts.map +1 -1
  59. package/lib/typescript/module/index.d.ts +11 -11
  60. package/lib/typescript/module/index.d.ts.map +1 -1
  61. package/lib/typescript/module/types.d.ts +15 -15
  62. package/lib/typescript/module/types.d.ts.map +1 -1
  63. package/lib/typescript/module/utils/compute-positioning.d.ts +4 -4
  64. package/lib/typescript/module/utils/compute-positioning.d.ts.map +1 -1
  65. package/lib/typescript/module/utils/double-tap-reset-zoom-gesture.d.ts +2 -2
  66. package/lib/typescript/module/utils/double-tap-reset-zoom-gesture.d.ts.map +1 -1
  67. package/lib/typescript/module/utils/generate-event-layouts.d.ts +4 -4
  68. package/lib/typescript/module/utils/generate-event-layouts.d.ts.map +1 -1
  69. package/lib/typescript/module/utils/globals.d.ts +1 -1
  70. package/lib/typescript/module/utils/globals.d.ts.map +1 -1
  71. package/lib/typescript/module/utils/pan-edit-event-gesture.d.ts +2 -2
  72. package/lib/typescript/module/utils/pan-edit-event-gesture.d.ts.map +1 -1
  73. package/package.json +2 -3
  74. package/src/components/all-day-events.tsx +5 -15
  75. package/src/components/event-container.tsx +12 -6
  76. package/src/components/timed-event-container.tsx +10 -6
  77. package/src/hooks/use-events.tsx +20 -21
  78. package/src/hooks/use-is-editing.tsx +17 -10
  79. package/src/index.tsx +23 -23
  80. package/src/types.ts +15 -15
  81. package/src/utils/__tests___/compute-positioning.test.ts +1 -1
  82. package/src/utils/compute-positioning.ts +5 -5
  83. package/src/utils/double-tap-reset-zoom-gesture.ts +3 -3
  84. package/src/utils/generate-event-layouts.ts +17 -17
  85. package/src/utils/globals.ts +1 -1
  86. package/src/utils/pan-edit-event-gesture.ts +3 -3
package/src/index.tsx CHANGED
@@ -14,52 +14,52 @@ import type { CalendarEvent, Config, onCreateEvent, ThemeStyle } from "./types";
14
14
 
15
15
  export * from "./types";
16
16
 
17
- type EventCalenderProps = {
17
+ type EventCalenderProps<T extends CalendarEvent> = {
18
18
  canCreateEvents?: boolean;
19
- canEditEvent?: Config["canEditEvent"];
19
+ canEditEvent?: Config<T>["canEditEvent"];
20
20
  dayDate: string;
21
- events: CalendarEvent[];
21
+ events: T[];
22
22
  fiveMinuteInterval?: boolean;
23
23
  initialZoomLevel?: number;
24
24
  maxAllDayEvents?: number;
25
25
  onCreateEvent?: onCreateEvent;
26
- onEventEdit?: Config["onEventEdit"];
27
- onPressEvent?: Config["onPressEvent"];
28
- renderDragBars?: Config["renderDragBars"];
29
- renderEvent: Config["renderEvent"];
30
- renderNewEventContainer?: Config["renderNewEventContainer"];
26
+ onEventEdit?: Config<T>["onEventEdit"];
27
+ onPressEvent?: Config<T>["onPressEvent"];
28
+ renderDragBars?: Config<T>["renderDragBars"];
29
+ renderEvent: Config<T>["renderEvent"];
30
+ renderNewEventContainer?: Config<T>["renderNewEventContainer"];
31
31
  showTimeIndicator?: boolean;
32
32
  theme?: ThemeStyle;
33
33
  timeFormat?: string;
34
34
  timezone?: string;
35
35
  updateLocalStateAfterEdit?: boolean;
36
36
  userCalendarId?: string;
37
- extraTimedComponents?: Config["extraTimedComponents"];
38
- onZoomChange?: Config["onZoomChange"];
37
+ extraTimedComponents?: Config<T>["extraTimedComponents"];
38
+ onZoomChange?: Config<T>["onZoomChange"];
39
39
  };
40
40
 
41
- type EventCalenderContentProps = {
41
+ type EventCalenderContentProps<T extends CalendarEvent> = {
42
42
  canCreateEvents: boolean;
43
- canEditEvent: Config["canEditEvent"];
43
+ canEditEvent: Config<T>["canEditEvent"];
44
44
  startCalendarDate: Moment;
45
45
  fiveMinuteInterval?: boolean;
46
46
  initialZoomLevel: number;
47
47
  maxAllDayEvents: number;
48
48
  onCreateEvent?: onCreateEvent;
49
- onEventEdit?: Config["onEventEdit"];
50
- onPressEvent?: Config["onPressEvent"];
51
- renderDragBars?: Config["renderDragBars"];
52
- renderEvent: Config["renderEvent"];
53
- renderNewEventContainer?: Config["renderNewEventContainer"];
49
+ onEventEdit?: Config<T>["onEventEdit"];
50
+ onPressEvent?: Config<T>["onPressEvent"];
51
+ renderDragBars?: Config<T>["renderDragBars"];
52
+ renderEvent: Config<T>["renderEvent"];
53
+ renderNewEventContainer?: Config<T>["renderNewEventContainer"];
54
54
  showTimeIndicator?: boolean;
55
55
  theme?: ThemeStyle;
56
56
  timeFormat: string;
57
57
  timezone: string;
58
58
  updateLocalStateAfterEdit: boolean;
59
- extraTimedComponents?: Config["extraTimedComponents"];
60
- onZoomChange?: Config["onZoomChange"];
59
+ extraTimedComponents?: Config<T>["extraTimedComponents"];
60
+ onZoomChange?: Config<T>["onZoomChange"];
61
61
  };
62
- const EventCalendarContent = ({
62
+ const EventCalendarContent = <T extends CalendarEvent>({
63
63
  canCreateEvents,
64
64
  canEditEvent,
65
65
  fiveMinuteInterval,
@@ -79,7 +79,7 @@ const EventCalendarContent = ({
79
79
  extraTimedComponents,
80
80
  onZoomChange,
81
81
  startCalendarDate,
82
- }: EventCalenderContentProps) => {
82
+ }: EventCalenderContentProps<T>) => {
83
83
  const zoomLevel = useSharedValue(initialZoomLevel);
84
84
  const createY = useSharedValue(-1);
85
85
  const maximumHour = useSharedValue(0);
@@ -138,7 +138,7 @@ const EventCalendarContent = ({
138
138
  /**
139
139
  * Wraps `EventCalendarContent` inside `ClonedEventsProvider` to manage cloned events independently.
140
140
  */
141
- const EventCalendar = ({
141
+ const EventCalendar = <T extends CalendarEvent>({
142
142
  timeFormat = "HH:mm",
143
143
  dayDate,
144
144
  events,
@@ -150,7 +150,7 @@ const EventCalendar = ({
150
150
  canCreateEvents = true,
151
151
  canEditEvent = true,
152
152
  ...props
153
- }: EventCalenderProps) => {
153
+ }: EventCalenderProps<T>) => {
154
154
  const startCalendarDate = useMemo(
155
155
  () => moment.tz(dayDate, timezone).startOf("day"),
156
156
  [dayDate, timezone]
package/src/types.ts CHANGED
@@ -12,16 +12,16 @@ export type CalendarEvent = {
12
12
  isAllDay?: boolean;
13
13
  };
14
14
 
15
- export type AllDayEventLayoutType = {
16
- event: CalendarEvent;
15
+ export type AllDayEventLayoutType<T extends CalendarEvent> = {
16
+ event: T;
17
17
  rowIndex?: number;
18
18
  visibleWidthDays?: number;
19
19
  extend: EventExtend;
20
20
  isPrimaryRendered?: boolean;
21
21
  };
22
22
 
23
- export type PartDayEventLayoutType = {
24
- event: CalendarEvent;
23
+ export type PartDayEventLayoutType<T extends CalendarEvent> = {
24
+ event: T;
25
25
  collisions?: {
26
26
  total: number;
27
27
  order: number;
@@ -29,8 +29,8 @@ export type PartDayEventLayoutType = {
29
29
  position: EventPosition;
30
30
  };
31
31
 
32
- export interface CollisionObject {
33
- event: CalendarEvent;
32
+ export interface CollisionObject<T extends CalendarEvent> {
33
+ event: T;
34
34
  collisions?: { total: number; order: number };
35
35
  }
36
36
 
@@ -41,9 +41,9 @@ export type EventPosition = {
41
41
  marginLeft: string;
42
42
  };
43
43
 
44
- export type FullCalendarEventLayout = {
45
- allDayEventsLayout: AllDayEventLayoutType[];
46
- partDayEventsLayout: PartDayEventLayoutType[];
44
+ export type FullCalendarEventLayout<T extends CalendarEvent> = {
45
+ allDayEventsLayout: AllDayEventLayoutType<T>[];
46
+ partDayEventsLayout: PartDayEventLayoutType<T>[];
47
47
  };
48
48
 
49
49
  export type ThemeStyle = {
@@ -85,19 +85,19 @@ export type OnCreateEventProps = {
85
85
 
86
86
  export type onCreateEvent = (arg: OnCreateEventProps) => void;
87
87
 
88
- export type Config = {
88
+ export type Config<T extends CalendarEvent> = {
89
89
  timezone: string;
90
90
  timeFormat: string;
91
91
  dayDate: Moment;
92
92
  theme?: ThemeStyle;
93
93
  zoomLevel: SharedValue<number>;
94
- layout: FullCalendarEventLayout;
94
+ layout: FullCalendarEventLayout<T>;
95
95
  createY: SharedValue<number>;
96
96
  maximumHour: SharedValue<number>;
97
97
  onCreateEvent?: onCreateEvent;
98
98
  initialZoomLevel: number;
99
99
  renderEvent: (
100
- event: CalendarEvent,
100
+ event: T,
101
101
  extended: EventExtend,
102
102
  eventHeight?: SharedValue<number>,
103
103
  updatedTimes?: {
@@ -106,18 +106,18 @@ export type Config = {
106
106
  }
107
107
  ) => ReactNode;
108
108
  onEventEdit?: (params: {
109
- event: CalendarEvent;
109
+ event: T;
110
110
  status: EditStatus;
111
111
  updatedTimes?: {
112
112
  updatedStart: string;
113
113
  updatedEnd: string;
114
114
  };
115
115
  }) => void;
116
- onPressEvent?: (event: CalendarEvent) => void;
116
+ onPressEvent?: (event: T) => void;
117
117
  showTimeIndicator?: boolean;
118
118
  maxAllDayEvents: number;
119
119
  canCreateEvents: boolean;
120
- canEditEvent: boolean | ((event: CalendarEvent) => boolean);
120
+ canEditEvent: boolean | ((event: T) => boolean);
121
121
  renderNewEventContainer?: (hour: number, minute: number) => ReactNode;
122
122
  fiveMinuteInterval?: boolean;
123
123
  renderDragBars?: { top?: () => ReactNode; bottom?: () => ReactNode };
@@ -4,7 +4,7 @@ import { PartDayEventLayoutType } from "../../types";
4
4
 
5
5
  describe("computePositioning", () => {
6
6
  it("should compute positioning correctly without collisions", () => {
7
- const layout: PartDayEventLayoutType = {
7
+ const layout: PartDayEventLayoutType<any> = {
8
8
  event: {
9
9
  start: "2023-10-01T09:00:00Z",
10
10
  end: "2023-10-01T10:00:00Z",
@@ -1,18 +1,18 @@
1
1
  import moment, { Moment } from "moment-timezone";
2
- import { CollisionObject, EventPosition } from "../types";
2
+ import { type CalendarEvent, CollisionObject, EventPosition } from "../types";
3
3
 
4
- type ComputePositioning = {
4
+ type ComputePositioning<T extends CalendarEvent> = {
5
5
  // We only need the collisions part of this type
6
- collisionObject: CollisionObject;
6
+ collisionObject: CollisionObject<T>;
7
7
  startOfDayMoment: Moment;
8
8
  timezone: string;
9
9
  };
10
10
 
11
- const computePositioning = ({
11
+ const computePositioning = <T extends CalendarEvent>({
12
12
  collisionObject,
13
13
  startOfDayMoment,
14
14
  timezone,
15
- }: ComputePositioning): EventPosition => {
15
+ }: ComputePositioning<T>): EventPosition => {
16
16
  const startDateMoment = moment.tz(collisionObject.event.start, timezone);
17
17
  const durationMinutes = moment
18
18
  .tz(collisionObject.event.end, timezone)
@@ -1,11 +1,11 @@
1
1
  import { Gesture } from "react-native-gesture-handler";
2
2
  import { runOnJS, SharedValue } from "react-native-reanimated";
3
- import { Config } from "../types";
3
+ import { type CalendarEvent, Config } from "../types";
4
4
 
5
- const doubleTapGesture = (
5
+ const doubleTapGesture = <T extends CalendarEvent>(
6
6
  zoomLevel: SharedValue<number>,
7
7
  initialZoomLevel: number,
8
- onZoomChange?: Config["onZoomChange"]
8
+ onZoomChange?: Config<T>["onZoomChange"]
9
9
  ) =>
10
10
  Gesture.Tap()
11
11
  .numberOfTaps(2)
@@ -23,8 +23,8 @@ import {
23
23
  PartDayEventLayoutType,
24
24
  } from "../types";
25
25
 
26
- interface GenerateEventLayouts {
27
- events: CalendarEvent[];
26
+ interface GenerateEventLayouts<T extends CalendarEvent> {
27
+ events: T[];
28
28
  userCalendarId: string;
29
29
  timezone: string;
30
30
  startCalendarDate: string;
@@ -33,7 +33,7 @@ interface GenerateEventLayouts {
33
33
  calendarViewInterval?: CalendarViewIntervalType;
34
34
  }
35
35
 
36
- export const generateEventLayouts = ({
36
+ export const generateEventLayouts = <T extends CalendarEvent>({
37
37
  events,
38
38
  startCalendarDate,
39
39
  endCalendarDate,
@@ -41,7 +41,7 @@ export const generateEventLayouts = ({
41
41
  calendarViewInterval = "1day",
42
42
  startDayOfWeekOffset = 0,
43
43
  timezone,
44
- }: GenerateEventLayouts) => {
44
+ }: GenerateEventLayouts<T>) => {
45
45
  // Calculate spacial layout for CalendarViewDay events
46
46
  // in month view, midnight-spanning part-day events are rendered as all-day multi-day
47
47
  const [allDayEvents, partDayEvents] = _partition([...events], (event) =>
@@ -99,7 +99,7 @@ export const generateEventLayouts = ({
99
99
  });
100
100
 
101
101
  const result: {
102
- [day: string]: FullCalendarEventLayout;
102
+ [day: string]: FullCalendarEventLayout<T>;
103
103
  } = {};
104
104
 
105
105
  calendarViewDateRanges.forEach((date) => {
@@ -142,8 +142,8 @@ export const generateEventLayouts = ({
142
142
  const endDate = moment.tz(startDate, timezone).endOf("day").toDate();
143
143
  const showHours = !["month"].includes(calendarViewInterval);
144
144
  const dayId = calendarDate;
145
- const allDayEventsLayout: AllDayEventLayoutType[] = [];
146
- let partDayEventsLayout: PartDayEventLayoutType[] = [];
145
+ const allDayEventsLayout: AllDayEventLayoutType<T>[] = [];
146
+ let partDayEventsLayout: PartDayEventLayoutType<T>[] = [];
147
147
 
148
148
  const x = moment(startDate).diff(
149
149
  moment.tz(date.basisDate, timezone),
@@ -174,7 +174,7 @@ export const generateEventLayouts = ({
174
174
  partDayEventsLayout = partDayEventsLayout.concat(
175
175
  handleCollisions(
176
176
  events.filter(
177
- (event) =>
177
+ (event: T) =>
178
178
  !isAllDayOrSpansMidnight(event, timezone) &&
179
179
  dateRangeIntersect(
180
180
  {
@@ -201,11 +201,11 @@ export const generateEventLayouts = ({
201
201
  return result;
202
202
  };
203
203
 
204
- const combineEventPosition = (
204
+ const combineEventPosition = <T extends CalendarEvent>(
205
205
  dayDate: Moment,
206
206
  timezone: string,
207
- collisionObject: CollisionObject
208
- ): PartDayEventLayoutType => {
207
+ collisionObject: CollisionObject<T>
208
+ ): PartDayEventLayoutType<T> => {
209
209
  const position = computePositioning({
210
210
  timezone,
211
211
  collisionObject: collisionObject,
@@ -218,12 +218,12 @@ const combineEventPosition = (
218
218
  };
219
219
  };
220
220
 
221
- const handleCollisions = (
222
- allEvents: CalendarEvent[],
221
+ const handleCollisions = <T extends CalendarEvent>(
222
+ allEvents: T[],
223
223
  userCalendarId: string,
224
224
  dayDate: Moment,
225
225
  timezone: string
226
- ): PartDayEventLayoutType[] => {
226
+ ): PartDayEventLayoutType<T>[] => {
227
227
  let stackableEvents = _sortBy(allEvents, (event) => event.id);
228
228
  stackableEvents = _sortBy(stackableEvents, (event) => {
229
229
  // current user's primary calendar should always be leftmost option
@@ -233,8 +233,8 @@ const handleCollisions = (
233
233
  new Date(event.start).valueOf()
234
234
  );
235
235
  // calculate overlap stack properties
236
- const stackedEvtsByPos: Record<string, PartDayEventLayoutType[]> = {};
237
- let curStack: (CollisionObject | null)[] = [];
236
+ const stackedEvtsByPos: Record<string, PartDayEventLayoutType<T>[]> = {};
237
+ let curStack: (CollisionObject<T> | null)[] = [];
238
238
 
239
239
  for (const evt of stackableEvents) {
240
240
  // already sorted by startDate
@@ -302,7 +302,7 @@ const handleCollisions = (
302
302
  }
303
303
 
304
304
  // always draw position 0 stack elements first.
305
- let stackedEvents: PartDayEventLayoutType[] = [];
305
+ let stackedEvents: PartDayEventLayoutType<T>[] = [];
306
306
 
307
307
  Object.keys(stackedEvtsByPos).forEach(
308
308
  (pos) => (stackedEvents = stackedEvents.concat(stackedEvtsByPos[pos]))
@@ -1,7 +1,7 @@
1
1
  import { createContext } from "react";
2
2
  import { Config } from "../types";
3
3
 
4
- export const ConfigProvider = createContext<Config>(undefined as never);
4
+ export const ConfigProvider = createContext<Config<any>>(undefined as never);
5
5
 
6
6
  export const DEFAULT_MINUTE_HEIGHT = 0.8;
7
7
 
@@ -1,9 +1,9 @@
1
1
  import { Gesture } from "react-native-gesture-handler";
2
2
  import { runOnJS, SharedValue } from "react-native-reanimated";
3
3
  import { RefObject } from "react";
4
- import { PartDayEventLayoutType } from "../types";
4
+ import { type CalendarEvent, PartDayEventLayoutType } from "../types";
5
5
 
6
- const gesturePan = (
6
+ const gesturePan = <T extends CalendarEvent>(
7
7
  startY: SharedValue<number>,
8
8
  top: SharedValue<number>,
9
9
  currentY: SharedValue<number>,
@@ -12,7 +12,7 @@ const gesturePan = (
12
12
  height: SharedValue<number>,
13
13
  refNewEvent: RefObject<any>,
14
14
  fiveMinuteInterval?: boolean,
15
- isEditing?: null | PartDayEventLayoutType,
15
+ isEditing?: null | PartDayEventLayoutType<T>,
16
16
  startEditing?: () => void
17
17
  ) =>
18
18
  Gesture.Pan()