import ICAL from 'ical.js'; const calendars = { "5WrcagPPARQ3BD87": { name: "Club réseau", color: null }, "TFEAKjAgNFQZpNjo": { name: "hackENS", color: null } }; export const calendarTree = { "COF": [ "Club réseau", "hackENS" ] }; const calendarIds = Object.keys(calendars); function mkCalendarUrl(id) { return `/cal/${id}/?export&accept=jcal`; } function fetchCalendar(id) { return fetch(mkCalendarUrl(id), { credentials: 'omit' }).then(resp => resp.json()).catch(err => console.error(err)); } class Calendar { constructor (id, calendar) { const metadata = calendars[id]; this.name = metadata.name; this.color = metadata.color || calendar[1][4][3]; this.events = calendar[2].filter(item => item[0] === 'vevent').map(item => this._parse_vevent(item[1])); } _parse_vevent(vevent) { const event = {}; vevent.forEach(elt => { event[elt[0]] = elt[3]; }); return event; } } function fcEventFromjCalEvent(cal) { return function (evt) { const start = new Date(evt.dtstart); const end = new Date(evt.dtend); const fcEvent = { title: `${cal.name}: ${evt.summary}`, start, end, color: cal.color, duration: end - start // in ms }; if (evt.description) { fcEvent.description = evt.description; } if (evt.rrule) { const { freq, byday, interval } = evt.rrule; fcEvent.rrule = { freq, byweekday: byday, dtstart: evt.dtstart, }; if (interval) { fcEvent.rrule.interval = interval; } } return fcEvent; } } function mkEventsFromCalendar(id) { return fetchCalendar(id).then(calendar => { if (calendar[0] !== 'vcalendar') return; const cal = new Calendar(id, calendar) return cal.events.map(fcEventFromjCalEvent(cal)) }); } export function mkEvent(title, start, duration, ...rest) { start = new Date(start) const end = new Date(start) end.setMinutes(start.getMinutes() + duration) return { title, start, end, ...rest } } // TODO: move to FullCalendar custom fetcher to control start&end. export function refreshEvents(selectedCalendars) { return Promise.all(calendarIds.filter(id => selectedCalendars ? selectedCalendars.includes(id) : true).map(mkEventsFromCalendar)) }