1
1
import dayjs from "dayjs" ;
2
+ import utc from "dayjs/plugin/utc" ;
2
3
import { stringify } from "querystring" ;
3
4
import { CalendarEvent , Google , Outlook , Yahoo } from "./interfaces" ;
4
5
6
+ dayjs . extend ( utc ) ;
7
+
5
8
export const eventify = ( event : CalendarEvent ) => {
6
9
event . start = dayjs ( event . start ) . toDate ( ) ;
7
10
if ( event . duration && event . duration . length && ! event . end ) {
@@ -11,32 +14,36 @@ export const eventify = (event: CalendarEvent) => {
11
14
. add ( duration , unit )
12
15
. toDate ( ) ;
13
16
}
17
+ if ( event . allDay ) {
18
+ event . end = dayjs ( event . start )
19
+ . add ( 1 , "day" )
20
+ . toDate ( ) ;
21
+ }
14
22
return event ;
15
23
} ;
16
24
25
+ const formats = {
26
+ dateTime : "YYYYMMDD[T]HHmmss" ,
27
+ dateTimeUTC : "YYYYMMDD[T]HHmmss[Z]" ,
28
+ allDay : "YYYYMMDD"
29
+ } ;
30
+
17
31
export const google = ( event : CalendarEvent ) => {
18
32
event = eventify ( event ) ;
19
- const startDate : string = dayjs ( event . start )
20
- . toISOString ( )
21
- . replace ( / - / g, "" )
22
- . replace ( / : / g, "" )
23
- . replace ( / \. / g, "" ) ;
24
- const endDate : string = dayjs ( event . end )
25
- . toISOString ( )
26
- . replace ( / - / g, "" )
27
- . replace ( / : / g, "" )
28
- . replace ( / \. / g, "" ) ;
33
+ const format = event . allDay ? formats . allDay : formats . dateTimeUTC ;
34
+ const start : string = dayjs ( event . start )
35
+ . utc ( )
36
+ . format ( format ) ;
37
+ const end : string = dayjs ( event . end )
38
+ . utc ( )
39
+ . format ( format ) ;
29
40
const details : Google = {
30
41
action : "TEMPLATE" ,
31
42
text : event . title ,
32
43
details : event . description ,
33
44
location : event . location ,
34
45
trp : event . busy ,
35
- dates :
36
- startDate . substring ( 0 , startDate . length - 4 ) +
37
- "Z/" +
38
- endDate . substring ( 0 , endDate . length - 4 ) +
39
- "Z"
46
+ dates : start + "/" + end
40
47
} ;
41
48
if ( event . guests && event . guests . length ) {
42
49
details . add = event . guests . join ( ) ;
@@ -46,11 +53,18 @@ export const google = (event: CalendarEvent) => {
46
53
47
54
export const outlook = ( event : CalendarEvent ) => {
48
55
event = eventify ( event ) ;
56
+ const format = event . allDay ? formats . allDay : formats . dateTime ;
57
+ const start : string = dayjs ( event . start )
58
+ . utc ( )
59
+ . format ( format ) ;
60
+ const end : string = dayjs ( event . end )
61
+ . utc ( )
62
+ . format ( format ) ;
49
63
const details : Outlook = {
50
64
path : "/calendar/action/compose" ,
51
65
rru : "addevent" ,
52
- startdt : dayjs ( event . start ) . format ( "YYYYMMDD[T]HHmmss" ) ,
53
- enddt : dayjs ( event . end ) . format ( "YYYYMMDD[T]HHmmss" ) ,
66
+ startdt : start ,
67
+ enddt : end ,
54
68
subject : event . title ,
55
69
body : event . description ,
56
70
location : event . location
@@ -60,11 +74,18 @@ export const outlook = (event: CalendarEvent) => {
60
74
61
75
export const yahoo = ( event : CalendarEvent ) => {
62
76
event = eventify ( event ) ;
77
+ const format = event . allDay ? formats . allDay : formats . dateTimeUTC ;
78
+ const start : string = dayjs ( event . start )
79
+ . utc ( )
80
+ . format ( format ) ;
81
+ const end : string = dayjs ( event . end )
82
+ . utc ( )
83
+ . format ( format ) ;
63
84
const details : Yahoo = {
64
85
v : 60 ,
65
86
title : event . title ,
66
- st : dayjs ( event . start ) . format ( "YYYYMMDD[T]HHmmss" ) ,
67
- et : dayjs ( event . end ) . format ( "YYYYMMDD[T]HHmmss" ) ,
87
+ st : start ,
88
+ et : end ,
68
89
desc : event . description ,
69
90
in_loc : event . location
70
91
} ;
0 commit comments