[#137] added duration management when no end + added moment library to manage duration
This commit is contained in:
committed by
Benoit TELLIER
parent
a00f179dbd
commit
26e69091d9
@@ -189,6 +189,39 @@ describe("parseCalendarEvent", () => {
|
|||||||
expect(result2.error).toMatch(/missing crucial event param/);
|
expect(result2.error).toMatch(/missing crucial event param/);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("returns computed end when there is no end but a duration", () => {
|
||||||
|
jest.useFakeTimers().setSystemTime(new Date("2025-07-18T00:00:00Z"));
|
||||||
|
|
||||||
|
const rawDataMissing: any = [
|
||||||
|
["UID", {}, "text", "event-1"],
|
||||||
|
["DTSTART", {}, "date-time", "2025-07-18T09:00:00"],
|
||||||
|
["duration", {}, "duration", "PT60M"],
|
||||||
|
];
|
||||||
|
|
||||||
|
const result = parseCalendarEvent(
|
||||||
|
rawDataMissing,
|
||||||
|
baseColor,
|
||||||
|
calendarId,
|
||||||
|
"/calendars/test.ics"
|
||||||
|
);
|
||||||
|
expect(result.end).toBe("2025-07-18T10:00:00");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("returns error if end and duration is missing", () => {
|
||||||
|
const rawDataMissing: any = [
|
||||||
|
["UID", {}, "text", "event-1"],
|
||||||
|
["DTSTART", {}, "date-time", "2025-07-18T09:00:00Z"],
|
||||||
|
];
|
||||||
|
|
||||||
|
const result = parseCalendarEvent(
|
||||||
|
rawDataMissing,
|
||||||
|
baseColor,
|
||||||
|
calendarId,
|
||||||
|
"/calendars/test.ics"
|
||||||
|
);
|
||||||
|
expect(result.error).toMatch(/missing crucial event param/);
|
||||||
|
});
|
||||||
|
|
||||||
it("parses alarm block correctly", () => {
|
it("parses alarm block correctly", () => {
|
||||||
const rawData = [
|
const rawData = [
|
||||||
["UID", {}, "text", "event-5"],
|
["UID", {}, "text", "event-5"],
|
||||||
@@ -289,7 +322,7 @@ describe("calendarEventToJCal", () => {
|
|||||||
],
|
],
|
||||||
};
|
};
|
||||||
|
|
||||||
const result = calendarEventToJCal(mockEvent as CalendarEvent);
|
const result = calendarEventToJCal(mockEvent as unknown as CalendarEvent);
|
||||||
|
|
||||||
expect(result[0]).toBe("vcalendar");
|
expect(result[0]).toBe("vcalendar");
|
||||||
const [vevent, vtimezone] = result[2];
|
const [vevent, vtimezone] = result[2];
|
||||||
@@ -449,7 +482,7 @@ describe("calendarEventToJCal", () => {
|
|||||||
],
|
],
|
||||||
};
|
};
|
||||||
|
|
||||||
const result = calendarEventToJCal(mockEvent as CalendarEvent);
|
const result = calendarEventToJCal(mockEvent as unknown as CalendarEvent);
|
||||||
|
|
||||||
expect(result[0]).toBe("vcalendar");
|
expect(result[0]).toBe("vcalendar");
|
||||||
const [vevent, vtimezone] = result[2];
|
const [vevent, vtimezone] = result[2];
|
||||||
@@ -539,7 +572,7 @@ describe("calendarEventToJCal", () => {
|
|||||||
attendee: [],
|
attendee: [],
|
||||||
};
|
};
|
||||||
|
|
||||||
const result = calendarEventToJCal(mockEvent as CalendarEvent);
|
const result = calendarEventToJCal(mockEvent as unknown as CalendarEvent);
|
||||||
|
|
||||||
expect(result[0]).toBe("vcalendar");
|
expect(result[0]).toBe("vcalendar");
|
||||||
const [vevent, vtimezone] = result[2];
|
const [vevent, vtimezone] = result[2];
|
||||||
@@ -574,7 +607,7 @@ describe("calendarEventToJCal", () => {
|
|||||||
attendee: [],
|
attendee: [],
|
||||||
};
|
};
|
||||||
|
|
||||||
const result = calendarEventToJCal(mockEvent as CalendarEvent);
|
const result = calendarEventToJCal(mockEvent as unknown as CalendarEvent);
|
||||||
|
|
||||||
expect(result[0]).toBe("vcalendar");
|
expect(result[0]).toBe("vcalendar");
|
||||||
const [vevent, vtimezone] = result[2];
|
const [vevent, vtimezone] = result[2];
|
||||||
@@ -609,7 +642,7 @@ describe("calendarEventToJCal", () => {
|
|||||||
attendee: [],
|
attendee: [],
|
||||||
};
|
};
|
||||||
|
|
||||||
const result = calendarEventToJCal(mockEvent as CalendarEvent);
|
const result = calendarEventToJCal(mockEvent as unknown as CalendarEvent);
|
||||||
|
|
||||||
expect(result[0]).toBe("vcalendar");
|
expect(result[0]).toBe("vcalendar");
|
||||||
const [vevent, vtimezone] = result[2];
|
const [vevent, vtimezone] = result[2];
|
||||||
@@ -644,7 +677,7 @@ describe("calendarEventToJCal", () => {
|
|||||||
attendee: [],
|
attendee: [],
|
||||||
};
|
};
|
||||||
|
|
||||||
const result = calendarEventToJCal(mockEvent as CalendarEvent);
|
const result = calendarEventToJCal(mockEvent as unknown as CalendarEvent);
|
||||||
|
|
||||||
expect(result[0]).toBe("vcalendar");
|
expect(result[0]).toBe("vcalendar");
|
||||||
const [vevent, vtimezone] = result[2];
|
const [vevent, vtimezone] = result[2];
|
||||||
@@ -679,7 +712,7 @@ describe("calendarEventToJCal", () => {
|
|||||||
attendee: [],
|
attendee: [],
|
||||||
};
|
};
|
||||||
|
|
||||||
const result = calendarEventToJCal(mockEvent as CalendarEvent);
|
const result = calendarEventToJCal(mockEvent as unknown as CalendarEvent);
|
||||||
|
|
||||||
expect(result[0]).toBe("vcalendar");
|
expect(result[0]).toBe("vcalendar");
|
||||||
const [vevent, vtimezone] = result[2];
|
const [vevent, vtimezone] = result[2];
|
||||||
|
|||||||
Generated
+505
-420
File diff suppressed because it is too large
Load Diff
@@ -20,6 +20,7 @@
|
|||||||
"i18next": "^23.7.9",
|
"i18next": "^23.7.9",
|
||||||
"ical.js": "^2.2.0",
|
"ical.js": "^2.2.0",
|
||||||
"ky": "^1.8.1",
|
"ky": "^1.8.1",
|
||||||
|
"moment": "^2.30.1",
|
||||||
"openid-client": "^6.5.3",
|
"openid-client": "^6.5.3",
|
||||||
"react": "^19.1.0",
|
"react": "^19.1.0",
|
||||||
"react-calendar": "^6.0.0",
|
"react-calendar": "^6.0.0",
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import { userAttendee } from "../User/userDataTypes";
|
|||||||
import { AlarmObject, CalendarEvent } from "./EventsTypes";
|
import { AlarmObject, CalendarEvent } from "./EventsTypes";
|
||||||
import ICAL from "ical.js";
|
import ICAL from "ical.js";
|
||||||
import { TIMEZONES } from "../../utils/timezone-data";
|
import { TIMEZONES } from "../../utils/timezone-data";
|
||||||
|
import moment from "moment";
|
||||||
type RawEntry = [string, Record<string, string>, string, any];
|
type RawEntry = [string, Record<string, string>, string, any];
|
||||||
|
|
||||||
export function parseCalendarEvent(
|
export function parseCalendarEvent(
|
||||||
@@ -13,6 +14,7 @@ export function parseCalendarEvent(
|
|||||||
): CalendarEvent {
|
): CalendarEvent {
|
||||||
const event: Partial<CalendarEvent> = { color, attendee: [] };
|
const event: Partial<CalendarEvent> = { color, attendee: [] };
|
||||||
let recurrenceId;
|
let recurrenceId;
|
||||||
|
let duration;
|
||||||
const dateRegex = /^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$/;
|
const dateRegex = /^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$/;
|
||||||
|
|
||||||
for (const [key, params, , value] of data) {
|
for (const [key, params, , value] of data) {
|
||||||
@@ -86,6 +88,9 @@ export function parseCalendarEvent(
|
|||||||
case "status":
|
case "status":
|
||||||
event.status = String(value);
|
event.status = String(value);
|
||||||
break;
|
break;
|
||||||
|
case "duration":
|
||||||
|
duration = String(value);
|
||||||
|
break;
|
||||||
case "rrule":
|
case "rrule":
|
||||||
event.repetition = { freq: value.freq.toLowerCase() };
|
event.repetition = { freq: value.freq.toLowerCase() };
|
||||||
if (value.byday) {
|
if (value.byday) {
|
||||||
@@ -123,17 +128,18 @@ export function parseCalendarEvent(
|
|||||||
}
|
}
|
||||||
|
|
||||||
event.URL = eventURL;
|
event.URL = eventURL;
|
||||||
if (!event.uid || !event.start || !event.end) {
|
if (!event.uid || !event.start || (!event.end && !duration)) {
|
||||||
console.error(
|
console.error(
|
||||||
`missing crucial event param in calendar ${calendarid} `,
|
`missing crucial event param in calendar ${calendarid} `,
|
||||||
data
|
data
|
||||||
);
|
);
|
||||||
event.error = `missing crucial event param in calendar ${calendarid} `;
|
event.error = `missing crucial event param in calendar ${calendarid} `;
|
||||||
if (!event.end) {
|
}
|
||||||
const start = event.start ? new Date(event.start) : new Date();
|
if (!event.end) {
|
||||||
const artificialEnd = new Date(start.getTime() + 3600000);
|
const start = event.start ? new Date(event.start) : new Date();
|
||||||
event.end = formatDateToICal(artificialEnd, false);
|
const timeToAdd = moment.duration(duration).asMilliseconds();
|
||||||
}
|
const artificialEnd = new Date(start.getTime() + timeToAdd);
|
||||||
|
event.end = formatDateToICal(artificialEnd, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
return event as CalendarEvent;
|
return event as CalendarEvent;
|
||||||
|
|||||||
Reference in New Issue
Block a user