mirror of
https://github.com/the-djmaze/snappymail.git
synced 2024-12-28 18:41:34 +08:00
Added: simple parse iCal attachment to store in Nextcloud calendar
This commit is contained in:
parent
00001c758d
commit
23b5de06b1
2 changed files with 72 additions and 13 deletions
|
@ -60,22 +60,80 @@
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
view.nextcloudICS = ko.computed(() => {
|
view.nextcloudICS = ko.observable(null);
|
||||||
let msg = view.message();
|
|
||||||
return msg
|
|
||||||
? msg.attachments.find(attachment => 'text/calendar' == attachment.mimeType)
|
|
||||||
: null;
|
|
||||||
}, {'pure':true});
|
|
||||||
|
|
||||||
view.nextcloudSaveICS = () => {
|
view.nextcloudSaveICS = () => {
|
||||||
let attachment = view.nextcloudICS();
|
let VEVENT = view.nextcloudICS();
|
||||||
attachment && rl.nextcloud.selectCalendar()
|
VEVENT && rl.nextcloud.selectCalendar()
|
||||||
.then(href =>
|
.then(href => href && rl.nextcloud.calendarPut(href, VEVENT.rawText));
|
||||||
href && rl.fetch(attachment.linkDownload())
|
|
||||||
.then(response => (response.status < 400) ? response.text() : Promise.reject(new Error({ response })))
|
|
||||||
.then(text => rl.nextcloud.calendarPut(href, text))
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO
|
||||||
|
*/
|
||||||
|
view.message.subscribe(msg => {
|
||||||
|
view.nextcloudICS(null);
|
||||||
|
if (msg) {
|
||||||
|
let ics = msg.attachments.find(attachment => 'text/calendar' == attachment.mimeType);
|
||||||
|
if (ics && ics.download) {
|
||||||
|
// fetch it and parse the VEVENT
|
||||||
|
rl.fetch(ics.linkDownload())
|
||||||
|
.then(response => (response.status < 400) ? response.text() : Promise.reject(new Error({ response })))
|
||||||
|
.then(text => {
|
||||||
|
let VEVENT,
|
||||||
|
VALARM,
|
||||||
|
multiple = ['ATTACH','ATTENDEE','CATEGORIES','COMMENT','CONTACT','EXDATE',
|
||||||
|
'EXRULE','RSTATUS','RELATED','RESOURCES','RDATE','RRULE'],
|
||||||
|
lines = text.split(/\r?\n/),
|
||||||
|
i = lines.length;
|
||||||
|
while (i--) {
|
||||||
|
let line = lines[i];
|
||||||
|
if (VEVENT) {
|
||||||
|
while (line.startsWith(' ') && i--) {
|
||||||
|
line = lines[i] + line.slice(1);
|
||||||
|
}
|
||||||
|
if (line.startsWith('END:VALARM')) {
|
||||||
|
VALARM = {};
|
||||||
|
continue;
|
||||||
|
} else if (line.startsWith('BEGIN:VALARM')) {
|
||||||
|
VEVENT.VALARM || (VEVENT.VALARM = []);
|
||||||
|
VEVENT.VALARM.push(VALARM);
|
||||||
|
VALARM = null;
|
||||||
|
continue;
|
||||||
|
} else if (line.startsWith('BEGIN:VEVENT')) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
line = line.match(/^([^:;]+)[:;](.+)$/);
|
||||||
|
if (VALARM) {
|
||||||
|
VALARM[line[1]] = line[2];
|
||||||
|
} else {
|
||||||
|
if (multiple.includes(line[1]) || 'X-' == line[1].slice(0,2)) {
|
||||||
|
VEVENT[line[1]] || (VEVENT[line[1]] = []);
|
||||||
|
VEVENT[line[1]].push(line[2]);
|
||||||
|
} else {
|
||||||
|
VEVENT[line[1]] = line[2];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (line.startsWith('END:VEVENT')) {
|
||||||
|
VEVENT = {};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// METHOD:REPLY || METHOD:REQUEST
|
||||||
|
console.dir({VEVENT:VEVENT});
|
||||||
|
if (VEVENT) {
|
||||||
|
VEVENT.rawText = text;
|
||||||
|
VEVENT.isCancelled = () => VEVENT.STATUS?.includes('CANCELLED');
|
||||||
|
VEVENT.shouldReply = () => VEVENT.METHOD?.includes('REPLY');
|
||||||
|
console.dir({
|
||||||
|
isCancelled: VEVENT.isCancelled(),
|
||||||
|
shouldReply: VEVENT.shouldReply()
|
||||||
|
});
|
||||||
|
view.nextcloudICS(VEVENT);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -42,6 +42,7 @@ const
|
||||||
headers: {}
|
headers: {}
|
||||||
}, options);
|
}, options);
|
||||||
options.headers.requesttoken = parent.OC.requestToken;
|
options.headers.requesttoken = parent.OC.requestToken;
|
||||||
|
// cfg.UID = document.head.dataset.user
|
||||||
return fetch(cfg.WebDAV + '/' + mode + '/' + cfg.UID + path, options);
|
return fetch(cfg.WebDAV + '/' + mode + '/' + cfg.UID + path, options);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue