aboutsummaryrefslogtreecommitdiffstats
path: root/apps/dav/src
diff options
context:
space:
mode:
Diffstat (limited to 'apps/dav/src')
-rw-r--r--apps/dav/src/service/CalendarService.js32
1 files changed, 27 insertions, 5 deletions
diff --git a/apps/dav/src/service/CalendarService.js b/apps/dav/src/service/CalendarService.js
index 3d3fbe34b07..c187d61b86e 100644
--- a/apps/dav/src/service/CalendarService.js
+++ b/apps/dav/src/service/CalendarService.js
@@ -100,15 +100,37 @@ export async function saveScheduleInboxAvailability(slots, timezoneId) {
})))]
const vavailabilityComp = new ICAL.Component('vavailability')
- // TODO: deduplicate slots that occur on more than one day
- all.map(slot => {
+
+ // Deduplicate by start and end time
+ const deduplicated = all.reduce((acc, slot) => {
+ const key = [
+ slot.start.getHours(),
+ slot.start.getMinutes(),
+ slot.end.getHours(),
+ slot.end.getMinutes(),
+ ].join('-')
+
+ return {
+ ...acc,
+ [key]: [...(acc[key] ?? []), slot],
+ }
+ }, {})
+
+ // Create an AVAILABILITY component for every recurring slot
+ Object.keys(deduplicated).map(key => {
+ const slots = deduplicated[key]
+ const start = slots[0].start
+ const end = slots[0].end
+ // Combine days but make them also unique
+ const days = slots.map(slot => slot.day).filter((day, index, self) => self.indexOf(day) === index)
+
const availableComp = new ICAL.Component('available')
// Define DTSTART and DTEND
// TODO: tz? moment.tz(dateTime, timezone).toDate()
- const startTimeProp = availableComp.addPropertyWithValue('dtstart', ICAL.Time.fromJSDate(slot.start, false))
+ const startTimeProp = availableComp.addPropertyWithValue('dtstart', ICAL.Time.fromJSDate(start, false))
startTimeProp.setParameter('tzid', timezoneId)
- const endTimeProp = availableComp.addPropertyWithValue('dtend', ICAL.Time.fromJSDate(slot.end, false))
+ const endTimeProp = availableComp.addPropertyWithValue('dtend', ICAL.Time.fromJSDate(end, false))
endTimeProp.setParameter('tzid', timezoneId)
// Add mandatory UID
@@ -119,7 +141,7 @@ export async function saveScheduleInboxAvailability(slots, timezoneId) {
// Define RRULE
availableComp.addPropertyWithValue('rrule', {
freq: 'WEEKLY',
- byday: slot.day,
+ byday: days,
})
return availableComp