@sunsama/event-calendar 0.13.2 → 0.13.4

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 (82) hide show
  1. package/lib/commonjs/components/all-day-events.js +1 -1
  2. package/lib/commonjs/components/all-day-events.js.map +1 -1
  3. package/lib/commonjs/components/edit-event-container.js +9 -1
  4. package/lib/commonjs/components/edit-event-container.js.map +1 -1
  5. package/lib/commonjs/components/event-container.js +2 -1
  6. package/lib/commonjs/components/event-container.js.map +1 -1
  7. package/lib/commonjs/components/timed-event-container.js +1 -1
  8. package/lib/commonjs/components/timed-event-container.js.map +1 -1
  9. package/lib/commonjs/hooks/use-auto-scroll.js +11 -1
  10. package/lib/commonjs/hooks/use-auto-scroll.js.map +1 -1
  11. package/lib/commonjs/hooks/use-events.js +7 -6
  12. package/lib/commonjs/hooks/use-events.js.map +1 -1
  13. package/lib/commonjs/index.js +33 -32
  14. package/lib/commonjs/index.js.map +1 -1
  15. package/lib/commonjs/utils/calendar-layout.js +15 -2
  16. package/lib/commonjs/utils/calendar-layout.js.map +1 -1
  17. package/lib/commonjs/utils/compute-positioning.js +1 -1
  18. package/lib/commonjs/utils/compute-positioning.js.map +1 -1
  19. package/lib/commonjs/utils/date-utils.js +40 -11
  20. package/lib/commonjs/utils/date-utils.js.map +1 -1
  21. package/lib/commonjs/utils/generate-event-layouts.js +9 -6
  22. package/lib/commonjs/utils/generate-event-layouts.js.map +1 -1
  23. package/lib/module/components/all-day-events.js +2 -2
  24. package/lib/module/components/all-day-events.js.map +1 -1
  25. package/lib/module/components/edit-event-container.js +9 -1
  26. package/lib/module/components/edit-event-container.js.map +1 -1
  27. package/lib/module/components/event-container.js +3 -2
  28. package/lib/module/components/event-container.js.map +1 -1
  29. package/lib/module/components/timed-event-container.js +1 -1
  30. package/lib/module/components/timed-event-container.js.map +1 -1
  31. package/lib/module/hooks/use-auto-scroll.js +11 -1
  32. package/lib/module/hooks/use-auto-scroll.js.map +1 -1
  33. package/lib/module/hooks/use-events.js +8 -7
  34. package/lib/module/hooks/use-events.js.map +1 -1
  35. package/lib/module/index.js +33 -32
  36. package/lib/module/index.js.map +1 -1
  37. package/lib/module/utils/calendar-layout.js +15 -2
  38. package/lib/module/utils/calendar-layout.js.map +1 -1
  39. package/lib/module/utils/compute-positioning.js +1 -1
  40. package/lib/module/utils/compute-positioning.js.map +1 -1
  41. package/lib/module/utils/date-utils.js +40 -11
  42. package/lib/module/utils/date-utils.js.map +1 -1
  43. package/lib/module/utils/generate-event-layouts.js +9 -6
  44. package/lib/module/utils/generate-event-layouts.js.map +1 -1
  45. package/lib/typescript/commonjs/components/all-day-events.d.ts.map +1 -1
  46. package/lib/typescript/commonjs/components/edit-event-container.d.ts.map +1 -1
  47. package/lib/typescript/commonjs/components/event-container.d.ts +2 -1
  48. package/lib/typescript/commonjs/components/event-container.d.ts.map +1 -1
  49. package/lib/typescript/commonjs/components/timed-event-container.d.ts.map +1 -1
  50. package/lib/typescript/commonjs/hooks/use-auto-scroll.d.ts.map +1 -1
  51. package/lib/typescript/commonjs/hooks/use-events.d.ts.map +1 -1
  52. package/lib/typescript/commonjs/index.d.ts.map +1 -1
  53. package/lib/typescript/commonjs/utils/calendar-layout.d.ts +3 -1
  54. package/lib/typescript/commonjs/utils/calendar-layout.d.ts.map +1 -1
  55. package/lib/typescript/commonjs/utils/compute-positioning.d.ts.map +1 -1
  56. package/lib/typescript/commonjs/utils/date-utils.d.ts.map +1 -1
  57. package/lib/typescript/commonjs/utils/generate-event-layouts.d.ts.map +1 -1
  58. package/lib/typescript/module/components/all-day-events.d.ts.map +1 -1
  59. package/lib/typescript/module/components/edit-event-container.d.ts.map +1 -1
  60. package/lib/typescript/module/components/event-container.d.ts +2 -1
  61. package/lib/typescript/module/components/event-container.d.ts.map +1 -1
  62. package/lib/typescript/module/components/timed-event-container.d.ts.map +1 -1
  63. package/lib/typescript/module/hooks/use-auto-scroll.d.ts.map +1 -1
  64. package/lib/typescript/module/hooks/use-events.d.ts.map +1 -1
  65. package/lib/typescript/module/index.d.ts.map +1 -1
  66. package/lib/typescript/module/utils/calendar-layout.d.ts +3 -1
  67. package/lib/typescript/module/utils/calendar-layout.d.ts.map +1 -1
  68. package/lib/typescript/module/utils/compute-positioning.d.ts.map +1 -1
  69. package/lib/typescript/module/utils/date-utils.d.ts.map +1 -1
  70. package/lib/typescript/module/utils/generate-event-layouts.d.ts.map +1 -1
  71. package/package.json +1 -1
  72. package/src/components/all-day-events.tsx +8 -4
  73. package/src/components/edit-event-container.tsx +11 -1
  74. package/src/components/event-container.tsx +14 -5
  75. package/src/components/timed-event-container.tsx +3 -0
  76. package/src/hooks/use-auto-scroll.ts +11 -1
  77. package/src/hooks/use-events.tsx +12 -8
  78. package/src/index.tsx +68 -34
  79. package/src/utils/calendar-layout.ts +15 -4
  80. package/src/utils/compute-positioning.ts +4 -3
  81. package/src/utils/date-utils.ts +52 -26
  82. package/src/utils/generate-event-layouts.ts +12 -19
@@ -2,6 +2,7 @@ import { AllDayEventLayoutType, type CalendarEvent } from "../types";
2
2
  type EventContainerProps<T extends CalendarEvent> = {
3
3
  layout: AllDayEventLayoutType<T>;
4
4
  };
5
- declare const EventContainer: <T extends CalendarEvent>({ layout, }: EventContainerProps<T>) => import("react").JSX.Element;
5
+ declare const EventContainerInner: <T extends CalendarEvent>({ layout, }: EventContainerProps<T>) => import("react").JSX.Element;
6
+ declare const EventContainer: typeof EventContainerInner;
6
7
  export default EventContainer;
7
8
  //# sourceMappingURL=event-container.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"event-container.d.ts","sourceRoot":"","sources":["../../../../src/components/event-container.tsx"],"names":[],"mappings":"AAIA,OAAO,EACL,qBAAqB,EACrB,KAAK,aAAa,EAEnB,MAAM,UAAU,CAAC;AAElB,KAAK,mBAAmB,CAAC,CAAC,SAAS,aAAa,IAAI;IAClD,MAAM,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAC;CAClC,CAAC;AAEF,QAAA,MAAM,cAAc,GAAI,CAAC,SAAS,aAAa,eAE5C,mBAAmB,CAAC,CAAC,CAAC,gCAuBxB,CAAC;AAEF,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"event-container.d.ts","sourceRoot":"","sources":["../../../../src/components/event-container.tsx"],"names":[],"mappings":"AAIA,OAAO,EACL,qBAAqB,EACrB,KAAK,aAAa,EAEnB,MAAM,UAAU,CAAC;AAElB,KAAK,mBAAmB,CAAC,CAAC,SAAS,aAAa,IAAI;IAClD,MAAM,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAC;CAClC,CAAC;AAEF,QAAA,MAAM,mBAAmB,GAAI,CAAC,SAAS,aAAa,eAEjD,mBAAmB,CAAC,CAAC,CAAC,gCAqBxB,CAAC;AAEF,QAAA,MAAM,cAAc,EASf,OAAO,mBAAmB,CAAC;AAEhC,eAAe,cAAc,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"timed-event-container.d.ts","sourceRoot":"","sources":["../../../../src/components/timed-event-container.tsx"],"names":[],"mappings":"AAOA,OAAO,EAEL,SAAS,EAMV,MAAM,OAAO,CAAC;AAMf,OAAO,EACL,KAAK,aAAa,EAElB,sBAAsB,EACvB,MAAM,UAAU,CAAC;AAElB,KAAK,wBAAwB,CAAC,CAAC,SAAS,aAAa,IAAI;IACvD,MAAM,EAAE,sBAAsB,CAAC,CAAC,CAAC,CAAC;IAClC,WAAW,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC;CAC7B,CAAC;AA2JF,QAAA,MAAM,mBAAmB,EAAoD,CAC3E,CAAC,SAAS,aAAa,EAEvB,KAAK,EAAE,wBAAwB,CAAC,CAAC,CAAC,KAC/B,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC;AAEvB,eAAe,mBAAmB,CAAC"}
1
+ {"version":3,"file":"timed-event-container.d.ts","sourceRoot":"","sources":["../../../../src/components/timed-event-container.tsx"],"names":[],"mappings":"AAOA,OAAO,EAEL,SAAS,EAMV,MAAM,OAAO,CAAC;AAMf,OAAO,EACL,KAAK,aAAa,EAElB,sBAAsB,EACvB,MAAM,UAAU,CAAC;AAElB,KAAK,wBAAwB,CAAC,CAAC,SAAS,aAAa,IAAI;IACvD,MAAM,EAAE,sBAAsB,CAAC,CAAC,CAAC,CAAC;IAClC,WAAW,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC;CAC7B,CAAC;AA8JF,QAAA,MAAM,mBAAmB,EAAoD,CAC3E,CAAC,SAAS,aAAa,EAEvB,KAAK,EAAE,wBAAwB,CAAC,CAAC,CAAC,KAC/B,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC;AAEvB,eAAe,mBAAmB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-auto-scroll.d.ts","sourceRoot":"","sources":["../../../../src/hooks/use-auto-scroll.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,EAAE,EACf,KAAK,WAAW,EAChB,KAAK,WAAW,EAGjB,MAAM,yBAAyB,CAAC;AAMjC,KAAK,gBAAgB,GAAG;IACtB,SAAS,EAAE,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC5C,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC7B,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACtC,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACjC,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC9B,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACjC,QAAQ,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IAC/B,gBAAgB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACvC,SAAS,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAChC,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAClC,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,EACpC,SAAS,EACT,OAAO,EACP,gBAAgB,EAChB,WAAW,EACX,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,gBAAgB,EAChB,SAAS,EACT,WAAW,EACX,YAAY,GACb,EAAE,gBAAgB,QAuDlB"}
1
+ {"version":3,"file":"use-auto-scroll.d.ts","sourceRoot":"","sources":["../../../../src/hooks/use-auto-scroll.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,EAAE,EACf,KAAK,WAAW,EAChB,KAAK,WAAW,EAGjB,MAAM,yBAAyB,CAAC;AAMjC,KAAK,gBAAgB,GAAG;IACtB,SAAS,EAAE,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC5C,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC7B,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACtC,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACjC,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC9B,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACjC,QAAQ,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IAC/B,gBAAgB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACvC,SAAS,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAChC,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAClC,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,EACpC,SAAS,EACT,OAAO,EACP,gBAAgB,EAChB,WAAW,EACX,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,gBAAgB,EAChB,SAAS,EACT,WAAW,EACX,YAAY,GACb,EAAE,gBAAgB,QAiElB"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-events.d.ts","sourceRoot":"","sources":["../../../../src/hooks/use-events.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,QAAQ,EACb,SAAS,EACT,KAAK,cAAc,EAKpB,MAAM,OAAO,CAAC;AAGf,OAAO,EACL,aAAa,EACb,wBAAwB,EACxB,uBAAuB,EACxB,MAAM,UAAU,CAAC;AAElB,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,aAAa,IAAI;IACjD,MAAM,EAAE,CAAC,EAAE,CAAC;IACZ,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,oBAAoB,CAAC,EAAE,wBAAwB,CAAC;CACjD,CAAC;AAEF,KAAK,iBAAiB,CAAC,CAAC,SAAS,aAAa,IAAI;IAChD,YAAY,EAAE,CAAC,EAAE,CAAC;IAClB,kBAAkB,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAClD,YAAY,EAAE,uBAAuB,CAAC,CAAC,CAAC,CAAC;IACzC,kBAAkB,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;CACrD,CAAC;AAKF;;GAEG;AACH,eAAO,MAAM,cAAc,GAAI,CAAC,SAAS,aAAa,0DAInD;IACD,QAAQ,EAAE,SAAS,CAAC;IACpB,YAAY,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IAC7B,yBAAyB,CAAC,EAAE,OAAO,CAAC;CACrC,gCA0DA,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,SAAS,8BAMrB,CAAC"}
1
+ {"version":3,"file":"use-events.d.ts","sourceRoot":"","sources":["../../../../src/hooks/use-events.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,QAAQ,EACb,SAAS,EACT,KAAK,cAAc,EAMpB,MAAM,OAAO,CAAC;AAGf,OAAO,EACL,aAAa,EACb,wBAAwB,EACxB,uBAAuB,EACxB,MAAM,UAAU,CAAC;AAElB,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,aAAa,IAAI;IACjD,MAAM,EAAE,CAAC,EAAE,CAAC;IACZ,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,oBAAoB,CAAC,EAAE,wBAAwB,CAAC;CACjD,CAAC;AAEF,KAAK,iBAAiB,CAAC,CAAC,SAAS,aAAa,IAAI;IAChD,YAAY,EAAE,CAAC,EAAE,CAAC;IAClB,kBAAkB,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAClD,YAAY,EAAE,uBAAuB,CAAC,CAAC,CAAC,CAAC;IACzC,kBAAkB,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;CACrD,CAAC;AAKF;;GAEG;AACH,eAAO,MAAM,cAAc,GAAI,CAAC,SAAS,aAAa,0DAInD;IACD,QAAQ,EAAE,SAAS,CAAC;IACpB,YAAY,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IAC7B,yBAAyB,CAAC,EAAE,OAAO,CAAC;CACrC,gCA6DA,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,SAAS,8BAMrB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"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"}
@@ -4,6 +4,8 @@ export declare class CalendarLayout {
4
4
  visibleX: Set<number>;
5
5
  enableWeekBreaks: boolean;
6
6
  startOfWeekXOffset: number;
7
+ private cachedHeight;
8
+ private cachedHeightDirty;
7
9
  constructor({ visibleX, enableWeekBreaks, startOfWeekXOffset, }: {
8
10
  visibleX: number[];
9
11
  enableWeekBreaks: boolean;
@@ -20,7 +22,7 @@ export declare class CalendarLayout {
20
22
  fit(x: number, y: number, duration: number): boolean;
21
23
  findFit(x: number, duration: number): number;
22
24
  findFitAndInsert(eventStartIndex: number, eventDurationDays: number, event: any): void;
23
- height(): any;
25
+ height(): number;
24
26
  getViewAt(x: number, y: number): {
25
27
  event?: undefined;
26
28
  visibleWidthDays?: undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"calendar-layout.d.ts","sourceRoot":"","sources":["../../../../src/utils/calendar-layout.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC,qBAAa,cAAc;IAIzB,OAAO,EAAE,GAAG,EAAE,CAAC;IACf,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACtB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,kBAAkB,EAAE,MAAM,CAAC;gBAEf,EACV,QAAQ,EACR,gBAAgB,EAChB,kBAAkB,GACnB,EAAE;QACD,QAAQ,EAAE,MAAM,EAAE,CAAC;QACnB,gBAAgB,EAAE,OAAO,CAAC;QAC1B,kBAAkB,EAAE,MAAM,CAAC;KAC5B;IAOD,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM;IAI1B,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE;QAAE,KAAK,EAAE,GAAG,CAAC;QAAC,IAAI,EAAE;YAAE,CAAC,EAAE,GAAG,CAAA;SAAE,CAAA;KAAE;IASnE,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG;IAM3D,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAS1C,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAQnC,gBAAgB,CACd,eAAe,EAAE,MAAM,EACvB,iBAAiB,EAAE,MAAM,EACzB,KAAK,EAAE,GAAG;IAMZ,MAAM;IAMN,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM;;;;;;;;;;;CA4D/B"}
1
+ {"version":3,"file":"calendar-layout.d.ts","sourceRoot":"","sources":["../../../../src/utils/calendar-layout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC,qBAAa,cAAc;IAIzB,OAAO,EAAE,GAAG,EAAE,CAAC;IACf,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACtB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,iBAAiB,CAAiB;gBAE9B,EACV,QAAQ,EACR,gBAAgB,EAChB,kBAAkB,GACnB,EAAE;QACD,QAAQ,EAAE,MAAM,EAAE,CAAC;QACnB,gBAAgB,EAAE,OAAO,CAAC;QAC1B,kBAAkB,EAAE,MAAM,CAAC;KAC5B;IAOD,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM;IAI1B,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE;QAAE,KAAK,EAAE,GAAG,CAAC;QAAC,IAAI,EAAE;YAAE,CAAC,EAAE,GAAG,CAAA;SAAE,CAAA;KAAE;IAUnE,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG;IAM3D,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAS1C,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAQnC,gBAAgB,CACd,eAAe,EAAE,MAAM,EACvB,iBAAiB,EAAE,MAAM,EACzB,KAAK,EAAE,GAAG;IAMZ,MAAM;IAeN,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM;;;;;;;;;;;CA4D/B"}
@@ -1 +1 @@
1
- {"version":3,"file":"compute-positioning.d.ts","sourceRoot":"","sources":["../../../../src/utils/compute-positioning.ts"],"names":[],"mappings":"AAAA,OAAe,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,KAAK,aAAa,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9E,KAAK,kBAAkB,CAAC,CAAC,SAAS,aAAa,IAAI;IAEjD,eAAe,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC;IACpC,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,QAAA,MAAM,kBAAkB,GAAI,CAAC,SAAS,aAAa,oDAIhD,kBAAkB,CAAC,CAAC,CAAC,KAAG,aA2B1B,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
1
+ {"version":3,"file":"compute-positioning.d.ts","sourceRoot":"","sources":["../../../../src/utils/compute-positioning.ts"],"names":[],"mappings":"AAAA,OAAe,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,KAAK,aAAa,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9E,KAAK,kBAAkB,CAAC,CAAC,SAAS,aAAa,IAAI;IAEjD,eAAe,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC;IACpC,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,QAAA,MAAM,kBAAkB,GAAI,CAAC,SAAS,aAAa,oDAIhD,kBAAkB,CAAC,CAAC,CAAC,KAAG,aA4B1B,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"date-utils.d.ts","sourceRoot":"","sources":["../../../../src/utils/date-utils.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,EAAE,EAAE,KAAK,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEtD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAErD,eAAO,MAAM,mBAAmB,gBAClB,MAAM,KACjB,UAAU,EAwBZ,CAAC;AAIF,eAAO,MAAM,eAAe,yBACJ,MAAM,gBACd,IAAI,GAAG,MAAM,GAAG,MAAM,YAC1B,MAAM,kBAejB,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAI,CAAC,SAAS,aAAa,iBAC9C,CAAC,YACN,MAAM,YAiBjB,CAAC;AAGF,eAAO,MAAM,iBAAiB,GAAI,CAAC,SAAS,aAAa,iBACxC,CAAC,YACN,MAAM,WAcjB,CAAC;AAGF,eAAO,MAAM,WAAW,sCAIrB;IACD,SAAS,EAAE,IAAI,GAAG,MAAM,CAAC;IACzB,OAAO,EAAE,IAAI,GAAG,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;CAClB,aAqBA,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,CAAC,SAAS,aAAa,iBAClC,CAAC,iBACD,OAAO,WAWvB,CAAC;AAEF,eAAO,MAAM,wBAAwB,SAC7B,MAAM,GAAG,IAAI,GAAG,MAAM,MACxB,MAAM,YACA,OAAO,GAAG,UAAU,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,wBACnC,MAAM;;;;;;;;;CAiE7B,CAAC;AAGF,eAAO,MAAM,kBAAkB,yCACS;IAAE,SAAS,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,IAAI,CAAA;CAAE,wCAClC;IAAE,SAAS,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,IAAI,CAAA;CAAE,YAgBzE,CAAC"}
1
+ {"version":3,"file":"date-utils.d.ts","sourceRoot":"","sources":["../../../../src/utils/date-utils.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,EAAE,EAAE,KAAK,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEtD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAwBrD,eAAO,MAAM,mBAAmB,gBAClB,MAAM,KACjB,UAAU,EAwBZ,CAAC;AAIF,eAAO,MAAM,eAAe,yBACJ,MAAM,gBACd,IAAI,GAAG,MAAM,GAAG,MAAM,YAC1B,MAAM,kBAejB,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAI,CAAC,SAAS,aAAa,iBAC9C,CAAC,YACN,MAAM,YAqBjB,CAAC;AAGF,eAAO,MAAM,iBAAiB,GAAI,CAAC,SAAS,aAAa,iBACxC,CAAC,YACN,MAAM,WAiBjB,CAAC;AAGF,eAAO,MAAM,WAAW,sCAIrB;IACD,SAAS,EAAE,IAAI,GAAG,MAAM,CAAC;IACzB,OAAO,EAAE,IAAI,GAAG,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;CAClB,aAkBA,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,CAAC,SAAS,aAAa,iBAClC,CAAC,iBACD,OAAO,WAWvB,CAAC;AAEF,eAAO,MAAM,wBAAwB,SAC7B,MAAM,GAAG,IAAI,GAAG,MAAM,MACxB,MAAM,YACA,OAAO,GAAG,UAAU,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,wBACnC,MAAM;;;;;;;;;CAiE7B,CAAC;AAGF,eAAO,MAAM,kBAAkB,yCACS;IAAE,SAAS,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,IAAI,CAAA;CAAE,wCAClC;IAAE,SAAS,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,IAAI,CAAA;CAAE,YAgBzE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"generate-event-layouts.d.ts","sourceRoot":"","sources":["../../../../src/utils/generate-event-layouts.ts"],"names":[],"mappings":"AAeA,OAAO,EAEL,aAAa,EACb,wBAAwB,EAGxB,uBAAuB,EAExB,MAAM,UAAU,CAAC;AAElB,UAAU,oBAAoB,CAAC,CAAC,SAAS,aAAa;IACpD,MAAM,EAAE,CAAC,EAAE,CAAC;IACZ,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,oBAAoB,CAAC,EAAE,wBAAwB,CAAC;CACjD;AAED,eAAO,MAAM,oBAAoB,GAAI,CAAC,SAAS,aAAa,yHAQzD,oBAAoB,CAAC,CAAC,CAAC;;CA8JzB,CAAC;AAyIF,eAAe,oBAAoB,CAAC"}
1
+ {"version":3,"file":"generate-event-layouts.d.ts","sourceRoot":"","sources":["../../../../src/utils/generate-event-layouts.ts"],"names":[],"mappings":"AAeA,OAAO,EAEL,aAAa,EACb,wBAAwB,EAGxB,uBAAuB,EAExB,MAAM,UAAU,CAAC;AAElB,UAAU,oBAAoB,CAAC,CAAC,SAAS,aAAa;IACpD,MAAM,EAAE,CAAC,EAAE,CAAC;IACZ,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,oBAAoB,CAAC,EAAE,wBAAwB,CAAC;CACjD;AAED,eAAO,MAAM,oBAAoB,GAAI,CAAC,SAAS,aAAa,yHAQzD,oBAAoB,CAAC,CAAC,CAAC;;CAuJzB,CAAC;AAyIF,eAAe,oBAAoB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sunsama/event-calendar",
3
- "version": "0.13.2",
3
+ "version": "0.13.4",
4
4
  "description": "Event calendar.",
5
5
  "source": "./src/index.tsx",
6
6
  "main": "./lib/commonjs/index.js",
@@ -1,4 +1,4 @@
1
- import { memo, useCallback, useContext, useState } from "react";
1
+ import { memo, useCallback, useContext, useMemo, useState } from "react";
2
2
  import { ConfigProvider, DEFAULT_MINUTE_HEIGHT } from "../utils/globals";
3
3
  import { LayoutChangeEvent, StyleSheet, Text, View } from "react-native";
4
4
  import EventContainer from "../components/event-container";
@@ -48,9 +48,13 @@ const AllDayEvents = memo(
48
48
  }
49
49
  }, [canCreateEvents, onCreateEvent]);
50
50
 
51
- const allDayEvents = showAllDayEvents
52
- ? layout.allDayEventsLayout
53
- : layout.allDayEventsLayout.slice(0, maxAllDayEvents);
51
+ const allDayEvents = useMemo(
52
+ () =>
53
+ showAllDayEvents
54
+ ? layout.allDayEventsLayout
55
+ : layout.allDayEventsLayout.slice(0, maxAllDayEvents),
56
+ [showAllDayEvents, layout.allDayEventsLayout, maxAllDayEvents]
57
+ );
54
58
  const restEventAmount =
55
59
  layout.allDayEventsLayout.length - allDayEvents.length;
56
60
 
@@ -53,6 +53,16 @@ const EditEventContainer = memo(
53
53
  } = useContext(ConfigProvider);
54
54
  const height = useSharedValue(0);
55
55
  const bottomEdgeY = useDerivedValue(() => currentY.value + height.value);
56
+ // isDragging flips true the instant the long-press starts, but currentY and
57
+ // height are only initialized from editingEvent.position by a JS-thread
58
+ // effect a few frames later. During that window topEdge/bottomEdge are 0, so
59
+ // the auto-scroll sees the event at the very top of the day and force-scrolls
60
+ // the viewport upward (jumping by the bottom-inset amount when the user is
61
+ // scrolled into the floating-tab-bar padding). Gate auto-scroll on the
62
+ // geometry being initialized (height > 0). (#11368)
63
+ const autoScrollActive = useDerivedValue(
64
+ () => isDragging.value && height.value > 0
65
+ );
56
66
 
57
67
  useAutoScroll({
58
68
  scrollRef,
@@ -61,7 +71,7 @@ const EditEventContainer = memo(
61
71
  maximumHour,
62
72
  topEdgeY: currentY,
63
73
  bottomEdgeY,
64
- isActive: isDragging,
74
+ isActive: autoScrollActive,
65
75
  autoScrollOffset,
66
76
  positionY: currentY,
67
77
  });
@@ -1,5 +1,5 @@
1
1
  import { ConfigProvider } from "../utils/globals";
2
- import { useCallback, useContext, useMemo } from "react";
2
+ import { memo, useCallback, useContext, useMemo } from "react";
3
3
  import { Pressable } from "react-native-gesture-handler";
4
4
  import { StyleSheet, View } from "react-native";
5
5
  import {
@@ -12,7 +12,7 @@ type EventContainerProps<T extends CalendarEvent> = {
12
12
  layout: AllDayEventLayoutType<T>;
13
13
  };
14
14
 
15
- const EventContainer = <T extends CalendarEvent>({
15
+ const EventContainerInner = <T extends CalendarEvent>({
16
16
  layout,
17
17
  }: EventContainerProps<T>) => {
18
18
  const { onPressEvent, renderEvent } = useContext(ConfigProvider);
@@ -21,9 +21,7 @@ const EventContainer = <T extends CalendarEvent>({
21
21
  () =>
22
22
  renderEvent(
23
23
  layout.event,
24
- (layout as AllDayEventLayoutType<T>).extend
25
- ? (layout as AllDayEventLayoutType<T>).extend
26
- : EventExtend.None
24
+ layout.extend ? layout.extend : EventExtend.None
27
25
  ),
28
26
  [layout, renderEvent]
29
27
  );
@@ -39,6 +37,17 @@ const EventContainer = <T extends CalendarEvent>({
39
37
  );
40
38
  };
41
39
 
40
+ const EventContainer = memo(
41
+ EventContainerInner,
42
+ (prev, next) =>
43
+ prev.layout.event.id === next.layout.event.id &&
44
+ prev.layout.event.start === next.layout.event.start &&
45
+ prev.layout.event.end === next.layout.event.end &&
46
+ prev.layout.event.title === next.layout.event.title &&
47
+ prev.layout.event.isAllDay === next.layout.event.isAllDay &&
48
+ prev.layout.extend === next.layout.extend
49
+ ) as typeof EventContainerInner;
50
+
42
51
  export default EventContainer;
43
52
 
44
53
  const styles = StyleSheet.create({
@@ -174,6 +174,9 @@ const arePropsEqual = <T extends CalendarEvent>(
174
174
  pl.event.id === nl.event.id &&
175
175
  pl.event.start === nl.event.start &&
176
176
  pl.event.end === nl.event.end &&
177
+ pl.event.title === nl.event.title &&
178
+ pl.event.calendarId === nl.event.calendarId &&
179
+ pl.event.isAllDay === nl.event.isAllDay &&
177
180
  pl.position.top === nl.position.top &&
178
181
  pl.position.height === nl.position.height &&
179
182
  pl.position.width === nl.position.width &&
@@ -69,14 +69,24 @@ export default function useAutoScroll({
69
69
  if (scrollDelta === 0) return;
70
70
 
71
71
  const maxScrollY = Math.max(0, maximumHour.value - scrollViewHeight.value);
72
+ // maxScrollY ignores the calendar's bottom content inset (padding for the
73
+ // floating tab bar), so when the user has scrolled into that inset scrollY
74
+ // can exceed it. Never clamp BELOW the current offset, otherwise the first
75
+ // qualifying frame yanks the viewport up to maxScrollY. (#11368)
76
+ const effectiveMaxScrollY = Math.max(maxScrollY, scrollY.value);
72
77
  const newScrollY = Math.min(
73
- maxScrollY,
78
+ effectiveMaxScrollY,
74
79
  Math.max(0, scrollY.value + scrollDelta)
75
80
  );
76
81
  const actualDelta = newScrollY - scrollY.value;
77
82
 
78
83
  if (Math.abs(actualDelta) < 0.5) return;
79
84
 
85
+ // Belt-and-suspenders: never move opposite to the chosen direction.
86
+ // (#11368 -- the bottom-inset yank is already prevented by
87
+ // effectiveMaxScrollY above; this guards any future clamp changes.)
88
+ if (actualDelta * scrollDelta < 0) return;
89
+
80
90
  scrollTo(scrollRef, 0, newScrollY, false);
81
91
  scrollY.value = newScrollY;
82
92
 
@@ -6,6 +6,7 @@ import {
6
6
  useCallback,
7
7
  useContext,
8
8
  useEffect,
9
+ useMemo,
9
10
  useState,
10
11
  } from "react";
11
12
  import { cloneDeep, isEqual } from "lodash";
@@ -93,15 +94,18 @@ export const EventsProvider = <T extends CalendarEvent>({
93
94
  updateEventsLayout({ ...initialProps, events: clonedEvents });
94
95
  }, [initialProps, clonedEvents, updateEventsLayout]);
95
96
 
97
+ const contextValue = useMemo(
98
+ () => ({
99
+ clonedEvents,
100
+ updateClonedEvents: setClonedEvents,
101
+ eventsLayout,
102
+ updateEventsLayout,
103
+ }),
104
+ [clonedEvents, eventsLayout, updateEventsLayout]
105
+ );
106
+
96
107
  return (
97
- <EventsContext.Provider
98
- value={{
99
- clonedEvents,
100
- updateClonedEvents: setClonedEvents,
101
- eventsLayout,
102
- updateEventsLayout,
103
- }}
104
- >
108
+ <EventsContext.Provider value={contextValue}>
105
109
  {children}
106
110
  </EventsContext.Provider>
107
111
  );
package/src/index.tsx CHANGED
@@ -210,42 +210,76 @@ function EventCalendarContentInner<T extends CalendarEvent>(
210
210
  }
211
211
  );
212
212
 
213
+ const configValue = useMemo(
214
+ () => ({
215
+ dayDate: startCalendarDate,
216
+ timeFormat,
217
+ layout: eventsLayout,
218
+ zoomLevel,
219
+ initialZoomLevel: initialZoomLevel || defaultZoomLevel,
220
+ defaultZoomLevel,
221
+ maxZoomLevel,
222
+ minZoomLevel,
223
+ createY,
224
+ onCreateEvent,
225
+ timezone,
226
+ renderEvent,
227
+ onPressEvent,
228
+ showTimeIndicator,
229
+ maxAllDayEvents,
230
+ canCreateEvents,
231
+ renderNewEventContainer,
232
+ fiveMinuteInterval,
233
+ canEditEvent,
234
+ onEventEdit,
235
+ renderDragBars,
236
+ maximumHour,
237
+ extraTimedComponents,
238
+ onZoomChange,
239
+ updateLocalStateAfterEdit,
240
+ theme,
241
+ initialEventEdit,
242
+ scrollY,
243
+ scrollRef: refScrollView,
244
+ scrollViewHeight,
245
+ }),
246
+ [
247
+ startCalendarDate,
248
+ timeFormat,
249
+ eventsLayout,
250
+ zoomLevel,
251
+ initialZoomLevel,
252
+ defaultZoomLevel,
253
+ maxZoomLevel,
254
+ minZoomLevel,
255
+ createY,
256
+ onCreateEvent,
257
+ timezone,
258
+ renderEvent,
259
+ onPressEvent,
260
+ showTimeIndicator,
261
+ maxAllDayEvents,
262
+ canCreateEvents,
263
+ renderNewEventContainer,
264
+ fiveMinuteInterval,
265
+ canEditEvent,
266
+ onEventEdit,
267
+ renderDragBars,
268
+ maximumHour,
269
+ extraTimedComponents,
270
+ onZoomChange,
271
+ updateLocalStateAfterEdit,
272
+ theme,
273
+ initialEventEdit,
274
+ scrollY,
275
+ refScrollView,
276
+ scrollViewHeight,
277
+ ]
278
+ );
279
+
213
280
  return (
214
281
  <View style={[styles.container, theme?.container]}>
215
- <ConfigProvider.Provider
216
- value={{
217
- dayDate: startCalendarDate,
218
- timeFormat,
219
- layout: eventsLayout,
220
- zoomLevel,
221
- initialZoomLevel: initialZoomLevel || defaultZoomLevel,
222
- defaultZoomLevel,
223
- maxZoomLevel,
224
- minZoomLevel,
225
- createY,
226
- onCreateEvent,
227
- timezone,
228
- renderEvent,
229
- onPressEvent,
230
- showTimeIndicator,
231
- maxAllDayEvents,
232
- canCreateEvents,
233
- renderNewEventContainer,
234
- fiveMinuteInterval,
235
- canEditEvent,
236
- onEventEdit,
237
- renderDragBars,
238
- maximumHour,
239
- extraTimedComponents,
240
- onZoomChange,
241
- updateLocalStateAfterEdit,
242
- theme,
243
- initialEventEdit,
244
- scrollY,
245
- scrollRef: refScrollView,
246
- scrollViewHeight,
247
- }}
248
- >
282
+ <ConfigProvider.Provider value={configValue}>
249
283
  <AllDayEvents />
250
284
  <AnimatedScrollView
251
285
  onLayout={onLayoutScrollView}
@@ -1,4 +1,3 @@
1
- import { max } from "lodash";
2
1
  import { EventExtend } from "../types";
3
2
 
4
3
  export class CalendarLayout {
@@ -9,6 +8,8 @@ export class CalendarLayout {
9
8
  visibleX: Set<number>;
10
9
  enableWeekBreaks: boolean;
11
10
  startOfWeekXOffset: number;
11
+ private cachedHeight: number = 0;
12
+ private cachedHeightDirty: boolean = true;
12
13
 
13
14
  constructor({
14
15
  visibleX,
@@ -36,6 +37,7 @@ export class CalendarLayout {
36
37
  this.array2d[x] = column;
37
38
  }
38
39
  column[y] = value;
40
+ this.cachedHeightDirty = true;
39
41
  }
40
42
  // assign value to the line of cells from (x, y) to (x + w, y)
41
43
  setRange(x: number, y: number, duration: number, value: any) {
@@ -71,9 +73,18 @@ export class CalendarLayout {
71
73
  }
72
74
  // find the height of the 2d array
73
75
  height() {
74
- return this.array2d.length > 0
75
- ? max(this.array2d.map((col) => (col && col.length) || 0))
76
- : 0;
76
+ if (!this.cachedHeightDirty) {
77
+ return this.cachedHeight;
78
+ }
79
+ let maxHeight = 0;
80
+ for (const col of this.array2d) {
81
+ if (col && col.length > maxHeight) {
82
+ maxHeight = col.length;
83
+ }
84
+ }
85
+ this.cachedHeight = maxHeight;
86
+ this.cachedHeightDirty = false;
87
+ return this.cachedHeight;
77
88
  }
78
89
  // get the event and associated view data for the given cell
79
90
  getViewAt(x: number, y: number) {
@@ -14,9 +14,10 @@ const computePositioning = <T extends CalendarEvent>({
14
14
  timezone,
15
15
  }: ComputePositioning<T>): EventPosition => {
16
16
  const startDateMoment = moment.tz(collisionObject.event.start, timezone);
17
- const durationMinutes = moment
18
- .tz(collisionObject.event.end, timezone)
19
- .diff(startDateMoment, "minutes");
17
+ const durationMinutes =
18
+ (new Date(collisionObject.event.end).getTime() -
19
+ new Date(collisionObject.event.start).getTime()) /
20
+ 60000;
20
21
 
21
22
  let width = 100;
22
23
  let margin = 0;
@@ -2,6 +2,28 @@ import moment, { type Moment } from "moment-timezone";
2
2
  import { isDate, range, size } from "lodash";
3
3
  import { CalendarEvent, PrefabHour } from "../types";
4
4
 
5
+ // Cached Intl.DateTimeFormat instances for fast timezone-aware day/hour extraction.
6
+ // Avoids creating Moment instances in hot paths like isAllDayOrSpansMidnight.
7
+ let _cachedTz = "";
8
+ let _dayFormatter: Intl.DateTimeFormat;
9
+ let _hourFormatter: Intl.DateTimeFormat;
10
+
11
+ function ensureFormatters(timezone: string) {
12
+ if (timezone !== _cachedTz) {
13
+ _cachedTz = timezone;
14
+ _dayFormatter = new Intl.DateTimeFormat("en-CA", { timeZone: timezone });
15
+ _hourFormatter = new Intl.DateTimeFormat("en-GB", {
16
+ hour: "2-digit",
17
+ hour12: false,
18
+ timeZone: timezone,
19
+ });
20
+ }
21
+ }
22
+
23
+ function toDate(date: Date | string): Date {
24
+ return typeof date === "string" ? new Date(date) : date;
25
+ }
26
+
5
27
  export const generatePrefabHours = (
6
28
  timeFormat: string = "HH:mm"
7
29
  ): PrefabHour[] => {
@@ -62,15 +84,19 @@ export const isAllDayOrSpansMidnight = <T extends CalendarEvent>(
62
84
  return true;
63
85
  }
64
86
 
65
- // Does the range start/end span midnight in the given timezone?
66
- const startMoment = moment.tz(start, timezone);
67
- const endMoment = moment.tz(end, timezone);
87
+ ensureFormatters(timezone);
68
88
 
69
- // Handle special case where range ends at midnight exactly, in which case spansMidnight should return false
70
- return !startMoment.isSame(
71
- endMoment.hour() === 0 ? endMoment.subtract(1, "minute") : endMoment,
72
- "day"
73
- );
89
+ const endDateObj = toDate(end);
90
+
91
+ // If end hour is 0 in user's timezone, subtract 1 minute so events
92
+ // ending exactly at midnight aren't considered as spanning midnight
93
+ const endHour = parseInt(_hourFormatter.format(endDateObj), 10);
94
+ const effectiveEnd =
95
+ endHour === 0 ? new Date(endDateObj.getTime() - 60_000) : endDateObj;
96
+
97
+ const startDay = _dayFormatter.format(toDate(start));
98
+ const endDay = _dayFormatter.format(effectiveEnd);
99
+ return startDay !== endDay;
74
100
  };
75
101
 
76
102
  // Returns the count of unique dates in the provided timezone
@@ -79,17 +105,20 @@ export const getDurationInDays = <T extends CalendarEvent>(
79
105
  timezone: string
80
106
  ) => {
81
107
  // the event duration in days calculation depends on if the event is all day
82
- return calendarEvent.isAllDay
83
- ? moment
108
+ if (calendarEvent.isAllDay) {
109
+ return (
110
+ moment
84
111
  .tz(calendarEvent.end, timezone)
85
112
  .diff(moment.tz(calendarEvent.start, timezone), "days") + 1
86
- : size(
87
- daysInRange({
88
- startDate: calendarEvent.start,
89
- endDate: calendarEvent.end,
90
- timezone,
91
- })
92
- );
113
+ );
114
+ }
115
+ return size(
116
+ daysInRange({
117
+ startDate: calendarEvent.start,
118
+ endDate: calendarEvent.end,
119
+ timezone,
120
+ })
121
+ );
93
122
  };
94
123
 
95
124
  // Returns an array of days (e.g. ['2022-01-02']) in a given date range.
@@ -102,23 +131,20 @@ export const daysInRange = ({
102
131
  endDate: Date | string;
103
132
  timezone: string;
104
133
  }) => {
105
- const countOfDaysInRange = moment
106
- .tz(endDate, timezone)
107
- .diff(moment.tz(startDate, timezone), "days");
108
- const startDay = moment.tz(startDate, timezone).format("YYYY-MM-DD");
134
+ const startMoment = moment.tz(startDate, timezone);
135
+ const endMoment = moment.tz(endDate, timezone);
136
+ const countOfDaysInRange = endMoment.diff(startMoment, "days");
109
137
  const days = [];
138
+ const maxIterations = Math.min(30, Math.abs(countOfDaysInRange));
110
139
  // Make sure we loop at a max of 30 times here as we had events that were scheduled for all day long for
111
140
  // 1000 years in the future and this was causing the app to crash
112
141
  for (
113
142
  let countOfDaysAfterStart = 0;
114
- countOfDaysAfterStart <= Math.min(30, Math.abs(countOfDaysInRange));
143
+ countOfDaysAfterStart <= maxIterations;
115
144
  countOfDaysAfterStart++
116
145
  ) {
117
146
  days.push(
118
- moment
119
- .tz(startDay, timezone)
120
- .add(countOfDaysAfterStart, "day")
121
- .format("YYYY-MM-DD")
147
+ startMoment.clone().add(countOfDaysAfterStart, "day").format("YYYY-MM-DD")
122
148
  );
123
149
  }
124
150
  return days;
@@ -76,16 +76,13 @@ export const generateEventLayouts = <T extends CalendarEvent>({
76
76
  ...(calendarViewInterval === "month" ? partDayEventsSorted : []),
77
77
  ];
78
78
 
79
- const visibleDayCount = moment
80
- .tz(endCalendarDate, timezone)
81
- .diff(moment.tz(startCalendarDate, timezone), "days");
79
+ const startCalendarMoment = moment.tz(startCalendarDate, timezone);
80
+ const endCalendarMoment = moment.tz(endCalendarDate, timezone);
81
+ const visibleDayCount = endCalendarMoment.diff(startCalendarMoment, "days");
82
82
  const visibleDays: string[] = [];
83
83
  for (let dayCount = 0; dayCount <= visibleDayCount; dayCount++) {
84
84
  visibleDays.push(
85
- moment
86
- .tz(startCalendarDate, timezone)
87
- .add(dayCount, "day")
88
- .format("YYYY-MM-DD")
85
+ startCalendarMoment.clone().add(dayCount, "day").format("YYYY-MM-DD")
89
86
  );
90
87
  }
91
88
 
@@ -103,15 +100,14 @@ export const generateEventLayouts = <T extends CalendarEvent>({
103
100
  } = {};
104
101
 
105
102
  calendarViewDateRanges.forEach((date) => {
103
+ const basisMoment = moment.tz(date.basisDate, timezone);
106
104
  const calendarLayoutOptions = {
107
105
  visibleX: date.dayIndexes,
108
106
  enableWeekBreaks: calendarViewInterval === "month",
109
- startOfWeekXOffset: moment
110
- .tz(date.basisDate, timezone)
111
- .diff(
112
- startOfUserWeek(startDayOfWeekOffset, date.basisDate!, timezone),
113
- "days"
114
- ),
107
+ startOfWeekXOffset: basisMoment.diff(
108
+ startOfUserWeek(startDayOfWeekOffset, date.basisDate!, timezone),
109
+ "days"
110
+ ),
115
111
  };
116
112
  const calendarViewDayLayout = _reduce(
117
113
  calendarViewDayEvents,
@@ -119,7 +115,7 @@ export const generateEventLayouts = <T extends CalendarEvent>({
119
115
  const eventStartIndex = moment
120
116
  .tz(event.start, timezone)
121
117
  .startOf("day")
122
- .diff(moment.tz(date.basisDate, timezone), "days");
118
+ .diff(basisMoment, "days");
123
119
  const eventDurationDays = getDurationInDays(event, timezone);
124
120
 
125
121
  calendarLayout.findFitAndInsert(
@@ -139,16 +135,13 @@ export const generateEventLayouts = <T extends CalendarEvent>({
139
135
  calendarDates.forEach((calendarDate) => {
140
136
  const currentDayDate = moment.tz(calendarDate, timezone).startOf("day");
141
137
  const startDate = currentDayDate.toDate();
142
- const endDate = moment.tz(startDate, timezone).endOf("day").toDate();
138
+ const endDate = currentDayDate.clone().endOf("day").toDate();
143
139
  const showHours = !["month"].includes(calendarViewInterval);
144
140
  const dayId = calendarDate;
145
141
  const allDayEventsLayout: AllDayEventLayoutType<T>[] = [];
146
142
  let partDayEventsLayout: PartDayEventLayoutType<T>[] = [];
147
143
 
148
- const x = moment(startDate).diff(
149
- moment.tz(date.basisDate, timezone),
150
- "days"
151
- );
144
+ const x = currentDayDate.diff(basisMoment, "days");
152
145
  for (let y = 0; y < calendarViewDayRowHeight; ++y) {
153
146
  const {
154
147
  event,