@sunsama/event-calendar 0.13.2 → 0.13.5
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.
- package/lib/commonjs/components/all-day-events.js +1 -1
- package/lib/commonjs/components/all-day-events.js.map +1 -1
- package/lib/commonjs/components/edit-event-container.js +9 -1
- package/lib/commonjs/components/edit-event-container.js.map +1 -1
- package/lib/commonjs/components/event-container.js +2 -1
- package/lib/commonjs/components/event-container.js.map +1 -1
- package/lib/commonjs/components/timed-event-container.js +1 -1
- package/lib/commonjs/components/timed-event-container.js.map +1 -1
- package/lib/commonjs/hooks/use-auto-scroll.js +11 -1
- package/lib/commonjs/hooks/use-auto-scroll.js.map +1 -1
- package/lib/commonjs/hooks/use-events.js +7 -6
- package/lib/commonjs/hooks/use-events.js.map +1 -1
- package/lib/commonjs/index.js +33 -32
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/utils/calendar-layout.js +15 -2
- package/lib/commonjs/utils/calendar-layout.js.map +1 -1
- package/lib/commonjs/utils/compute-positioning.js +1 -1
- package/lib/commonjs/utils/compute-positioning.js.map +1 -1
- package/lib/commonjs/utils/date-utils.js +59 -12
- package/lib/commonjs/utils/date-utils.js.map +1 -1
- package/lib/commonjs/utils/generate-event-layouts.js +13 -6
- package/lib/commonjs/utils/generate-event-layouts.js.map +1 -1
- package/lib/module/components/all-day-events.js +2 -2
- package/lib/module/components/all-day-events.js.map +1 -1
- package/lib/module/components/edit-event-container.js +9 -1
- package/lib/module/components/edit-event-container.js.map +1 -1
- package/lib/module/components/event-container.js +3 -2
- package/lib/module/components/event-container.js.map +1 -1
- package/lib/module/components/timed-event-container.js +1 -1
- package/lib/module/components/timed-event-container.js.map +1 -1
- package/lib/module/hooks/use-auto-scroll.js +11 -1
- package/lib/module/hooks/use-auto-scroll.js.map +1 -1
- package/lib/module/hooks/use-events.js +8 -7
- package/lib/module/hooks/use-events.js.map +1 -1
- package/lib/module/index.js +33 -32
- package/lib/module/index.js.map +1 -1
- package/lib/module/utils/calendar-layout.js +15 -2
- package/lib/module/utils/calendar-layout.js.map +1 -1
- package/lib/module/utils/compute-positioning.js +1 -1
- package/lib/module/utils/compute-positioning.js.map +1 -1
- package/lib/module/utils/date-utils.js +57 -11
- package/lib/module/utils/date-utils.js.map +1 -1
- package/lib/module/utils/generate-event-layouts.js +14 -7
- package/lib/module/utils/generate-event-layouts.js.map +1 -1
- package/lib/typescript/commonjs/components/all-day-events.d.ts.map +1 -1
- package/lib/typescript/commonjs/components/edit-event-container.d.ts.map +1 -1
- package/lib/typescript/commonjs/components/event-container.d.ts +2 -1
- package/lib/typescript/commonjs/components/event-container.d.ts.map +1 -1
- package/lib/typescript/commonjs/components/timed-event-container.d.ts.map +1 -1
- package/lib/typescript/commonjs/hooks/use-auto-scroll.d.ts.map +1 -1
- package/lib/typescript/commonjs/hooks/use-events.d.ts.map +1 -1
- package/lib/typescript/commonjs/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/utils/calendar-layout.d.ts +3 -1
- package/lib/typescript/commonjs/utils/calendar-layout.d.ts.map +1 -1
- package/lib/typescript/commonjs/utils/compute-positioning.d.ts.map +1 -1
- package/lib/typescript/commonjs/utils/date-utils.d.ts +1 -0
- package/lib/typescript/commonjs/utils/date-utils.d.ts.map +1 -1
- package/lib/typescript/commonjs/utils/generate-event-layouts.d.ts.map +1 -1
- package/lib/typescript/module/components/all-day-events.d.ts.map +1 -1
- package/lib/typescript/module/components/edit-event-container.d.ts.map +1 -1
- package/lib/typescript/module/components/event-container.d.ts +2 -1
- package/lib/typescript/module/components/event-container.d.ts.map +1 -1
- package/lib/typescript/module/components/timed-event-container.d.ts.map +1 -1
- package/lib/typescript/module/hooks/use-auto-scroll.d.ts.map +1 -1
- package/lib/typescript/module/hooks/use-events.d.ts.map +1 -1
- package/lib/typescript/module/index.d.ts.map +1 -1
- package/lib/typescript/module/utils/calendar-layout.d.ts +3 -1
- package/lib/typescript/module/utils/calendar-layout.d.ts.map +1 -1
- package/lib/typescript/module/utils/compute-positioning.d.ts.map +1 -1
- package/lib/typescript/module/utils/date-utils.d.ts +1 -0
- package/lib/typescript/module/utils/date-utils.d.ts.map +1 -1
- package/lib/typescript/module/utils/generate-event-layouts.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/components/all-day-events.tsx +8 -4
- package/src/components/edit-event-container.tsx +11 -1
- package/src/components/event-container.tsx +14 -5
- package/src/components/timed-event-container.tsx +3 -0
- package/src/hooks/use-auto-scroll.ts +11 -1
- package/src/hooks/use-events.tsx +12 -8
- package/src/index.tsx +68 -34
- package/src/utils/__tests___/date-utils-extended.test.ts +34 -0
- package/src/utils/__tests___/generate-event-layout.test.ts +29 -0
- package/src/utils/calendar-layout.ts +15 -4
- package/src/utils/compute-positioning.ts +4 -3
- package/src/utils/date-utils.ts +70 -26
- package/src/utils/generate-event-layouts.ts +17 -19
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import moment, { type Moment } from "moment-timezone";
|
|
2
2
|
import { CalendarEvent, PrefabHour } from "../types";
|
|
3
|
+
export declare const normalizeEventDates: <T extends CalendarEvent>(event: T) => T;
|
|
3
4
|
export declare const generatePrefabHours: (timeFormat?: string) => PrefabHour[];
|
|
4
5
|
export declare const startOfUserWeek: (startDayOfWeekOffset: number, dateOrMoment: Date | Moment | string, timezone: string) => moment.Moment;
|
|
5
6
|
export declare const isAllDayOrSpansMidnight: <T extends CalendarEvent>(calendarEvent: T, timezone: string) => boolean;
|
|
@@ -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;
|
|
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;AA8BrD,eAAO,MAAM,mBAAmB,GAAI,CAAC,SAAS,aAAa,SAAS,CAAC,KAAG,CAUvE,CAAC;AAEF,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":"
|
|
1
|
+
{"version":3,"file":"generate-event-layouts.d.ts","sourceRoot":"","sources":["../../../../src/utils/generate-event-layouts.ts"],"names":[],"mappings":"AAgBA,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;;CA2JzB,CAAC;AAyIF,eAAe,oBAAoB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"all-day-events.d.ts","sourceRoot":"","sources":["../../../../src/components/all-day-events.tsx"],"names":[],"mappings":"AAeA,QAAA,MAAM,YAAY,
|
|
1
|
+
{"version":3,"file":"all-day-events.d.ts","sourceRoot":"","sources":["../../../../src/components/all-day-events.tsx"],"names":[],"mappings":"AAeA,QAAA,MAAM,YAAY,wEA+HjB,CAAC;AAEF,eAAe,YAAY,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edit-event-container.d.ts","sourceRoot":"","sources":["../../../../src/components/edit-event-container.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,SAAS,EAMV,MAAM,OAAO,CAAC;AAkBf,KAAK,uBAAuB,GAAG;IAC7B,WAAW,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC;CAC7B,CAAC;AAEF,QAAA,MAAM,kBAAkB,wDACJ,uBAAuB,
|
|
1
|
+
{"version":3,"file":"edit-event-container.d.ts","sourceRoot":"","sources":["../../../../src/components/edit-event-container.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,SAAS,EAMV,MAAM,OAAO,CAAC;AAkBf,KAAK,uBAAuB,GAAG;IAC7B,WAAW,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC;CAC7B,CAAC;AAEF,QAAA,MAAM,kBAAkB,wDACJ,uBAAuB,wCAmP1C,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
|
|
@@ -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
|
|
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,
|
|
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;
|
|
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,
|
|
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,
|
|
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":"AAsBA,OAAO,KAAK,EAAE,EAEZ,KAAK,GAAG,EAKT,MAAM,OAAO,CAAC;AAIf,OAAO,KAAK,EACV,aAAa,EACb,MAAM,EAEN,aAAa,EACb,UAAU,EACX,MAAM,SAAS,CAAC;AAKjB,cAAc,SAAS,CAAC;AAExB,UAAU,SAAS,CAAC,CAAC,SAAS,aAAa,GAAG,aAAa;IACzD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;IACvC,YAAY,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;IACzC,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;IAC7C,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;IACtC,uBAAuB,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC;IAC/D,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,oBAAoB,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC;IACzD,YAAY,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;IACzC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;IACzC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yBAAyB,CAAC,EAAE,OAAO,CAAC;CACrC;AAED,MAAM,WAAW,kBAAkB,CAAC,CAAC,SAAS,aAAa,GAAG,aAAa,CACzE,SAAQ,SAAS,CAAC,CAAC,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,CAAC,EAAE,CAAC;IACZ,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAgBD,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7E,cAAc,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IACxD,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,YAAY,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9C;
|
|
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():
|
|
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":"
|
|
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,
|
|
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,5 +1,6 @@
|
|
|
1
1
|
import moment, { type Moment } from "moment-timezone";
|
|
2
2
|
import { CalendarEvent, PrefabHour } from "../types";
|
|
3
|
+
export declare const normalizeEventDates: <T extends CalendarEvent>(event: T) => T;
|
|
3
4
|
export declare const generatePrefabHours: (timeFormat?: string) => PrefabHour[];
|
|
4
5
|
export declare const startOfUserWeek: (startDayOfWeekOffset: number, dateOrMoment: Date | Moment | string, timezone: string) => moment.Moment;
|
|
5
6
|
export declare const isAllDayOrSpansMidnight: <T extends CalendarEvent>(calendarEvent: T, timezone: string) => boolean;
|
|
@@ -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;
|
|
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;AA8BrD,eAAO,MAAM,mBAAmB,GAAI,CAAC,SAAS,aAAa,SAAS,CAAC,KAAG,CAUvE,CAAC;AAEF,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":"
|
|
1
|
+
{"version":3,"file":"generate-event-layouts.d.ts","sourceRoot":"","sources":["../../../../src/utils/generate-event-layouts.ts"],"names":[],"mappings":"AAgBA,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;;CA2JzB,CAAC;AAyIF,eAAe,oBAAoB,CAAC"}
|
package/package.json
CHANGED
|
@@ -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 =
|
|
52
|
-
|
|
53
|
-
|
|
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:
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
package/src/hooks/use-events.tsx
CHANGED
|
@@ -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}
|
|
@@ -7,6 +7,7 @@ import {
|
|
|
7
7
|
daysInRange,
|
|
8
8
|
startOfUserWeek,
|
|
9
9
|
computeCalendarDateRange,
|
|
10
|
+
normalizeEventDates,
|
|
10
11
|
} from "../date-utils";
|
|
11
12
|
import { CalendarEvent } from "../../types";
|
|
12
13
|
|
|
@@ -301,6 +302,39 @@ describe("startOfUserWeek", () => {
|
|
|
301
302
|
});
|
|
302
303
|
});
|
|
303
304
|
|
|
305
|
+
describe("normalizeEventDates", () => {
|
|
306
|
+
it("should convert Date start/end to ISO strings", () => {
|
|
307
|
+
const evt = {
|
|
308
|
+
...event("", ""),
|
|
309
|
+
start: new Date("2023-01-01T08:00:00.000Z"),
|
|
310
|
+
end: new Date("2023-01-01T09:00:00.000Z"),
|
|
311
|
+
} as unknown as CalendarEvent;
|
|
312
|
+
|
|
313
|
+
const normalized = normalizeEventDates(evt);
|
|
314
|
+
|
|
315
|
+
expect(normalized.start).toBe("2023-01-01T08:00:00.000Z");
|
|
316
|
+
expect(normalized.end).toBe("2023-01-01T09:00:00.000Z");
|
|
317
|
+
});
|
|
318
|
+
|
|
319
|
+
it("should leave string start/end untouched and return the same reference", () => {
|
|
320
|
+
const evt = event("2023-01-01T08:00:00Z", "2023-01-01T09:00:00Z");
|
|
321
|
+
|
|
322
|
+
expect(normalizeEventDates(evt)).toBe(evt);
|
|
323
|
+
});
|
|
324
|
+
|
|
325
|
+
it("should normalize only the fields that are Date instances", () => {
|
|
326
|
+
const evt = {
|
|
327
|
+
...event("2023-01-01T08:00:00.000Z", ""),
|
|
328
|
+
end: new Date("2023-01-01T09:00:00.000Z"),
|
|
329
|
+
} as unknown as CalendarEvent;
|
|
330
|
+
|
|
331
|
+
const normalized = normalizeEventDates(evt);
|
|
332
|
+
|
|
333
|
+
expect(normalized.start).toBe("2023-01-01T08:00:00.000Z");
|
|
334
|
+
expect(normalized.end).toBe("2023-01-01T09:00:00.000Z");
|
|
335
|
+
});
|
|
336
|
+
});
|
|
337
|
+
|
|
304
338
|
describe("computeCalendarDateRange", () => {
|
|
305
339
|
it("should return single day for 1day view", () => {
|
|
306
340
|
const result = computeCalendarDateRange("2023-10-10", "UTC", "1day", 0);
|
|
@@ -38,6 +38,35 @@ describe("generateEventLayouts", () => {
|
|
|
38
38
|
expect(dayLayout.partDayEventsLayout[0].event.id).toBe("2");
|
|
39
39
|
});
|
|
40
40
|
|
|
41
|
+
it("should normalize Date start/end to strings in the resulting layout", () => {
|
|
42
|
+
// Consumers may pass native Date objects even though CalendarEvent types
|
|
43
|
+
// start/end as string; layouts flow into Reanimated worklet closures that
|
|
44
|
+
// can't clone a Date, so generateEventLayouts must normalize them first.
|
|
45
|
+
const events = [
|
|
46
|
+
{
|
|
47
|
+
id: "1",
|
|
48
|
+
calendarId: "primary-calendar",
|
|
49
|
+
title: "Timed Event",
|
|
50
|
+
start: new Date("2023-10-10T08:30:00Z"),
|
|
51
|
+
end: new Date("2023-10-10T09:30:00Z"),
|
|
52
|
+
},
|
|
53
|
+
] as unknown as CalendarEvent[];
|
|
54
|
+
|
|
55
|
+
const layouts = generateEventLayouts({
|
|
56
|
+
startCalendarDate: "2023-10-10",
|
|
57
|
+
endCalendarDate: "2023-10-10",
|
|
58
|
+
events,
|
|
59
|
+
timezone: "UTC",
|
|
60
|
+
userCalendarId: "primary-calendar",
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
const { event } = layouts["2023-10-10"]!.partDayEventsLayout[0]!;
|
|
64
|
+
expect(typeof event.start).toBe("string");
|
|
65
|
+
expect(typeof event.end).toBe("string");
|
|
66
|
+
expect(event.start).toBe("2023-10-10T08:30:00.000Z");
|
|
67
|
+
expect(event.end).toBe("2023-10-10T09:30:00.000Z");
|
|
68
|
+
});
|
|
69
|
+
|
|
41
70
|
it("should handle events with overlapping times", () => {
|
|
42
71
|
const events: CalendarEvent[] = [
|
|
43
72
|
{
|
|
@@ -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
|
-
|
|
75
|
-
|
|
76
|
-
|
|
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 =
|
|
18
|
-
|
|
19
|
-
|
|
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;
|