-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathics.ts
More file actions
64 lines (60 loc) · 2.31 KB
/
Copy pathics.ts
File metadata and controls
64 lines (60 loc) · 2.31 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import type { RootEvent } from "@/sanity/types"
import { toDateTuple } from "@/utils/dateUtils"
import { defaultEventDuration } from "@/sanity/queries/event"
import { createEvent, createEvents, type EventAttributes } from "ics"
import { getEventTypeLabel } from "@/sanity/lib/utils"
import { toPlainText } from "@portabletext/react"
/**
* Lager en string på ics format basert på et arrangement.
* Dersom sluttidspunkt ikke er definert, settes varigheten til 2 timer.
* Dersom den feiler, logges feilen og en tom string returneres.
* @param event Arrangementet som skal konverteres til ics format
* @returns En string på ics format
* @see https://www.npmjs.com/package/ics
*/
export async function createIcsEvent(event: RootEvent): Promise<string | undefined> {
let icsEvent: string | undefined = undefined
createEvent(getEventAttributes(event), (error, value) => {
if (error) {
console.error(error)
} else {
icsEvent = value
}
})
return icsEvent
}
/**
* Lager en string på ics format basert på en liste med arrangementer.
* Dersom den feiler, logges feilen og en tom string returneres.
* @param events Arrangementene som skal konverteres til ics format
* @returns En string på ics format
*/
export function createIcsEvents(events: ReadonlyArray<RootEvent>): string {
let icsEvents = ""
createEvents(events.map(getEventAttributes), (error, value) => {
if (error) {
console.error(error)
return ""
} else {
icsEvents += value
}
})
return icsEvents
}
function getEventAttributes(event: RootEvent): EventAttributes {
return {
title: event.title,
description: event.description_block ? toPlainText(event.description_block) : "",
location: event.address_text,
start: toDateTuple(event.start_time),
...getEndTime(event),
url: `${process.env.NEXT_PUBLIC_BASE_URL}/arrangement/${event.slug.current}`,
organizer: { name: "Root Linjeforening", email: process.env.NEXT_PUBLIC_EMAIL },
categories: ["Root Linjeforening", "Arrangement", getEventTypeLabel(event.type)],
}
}
function getEndTime(event: RootEvent) {
return event.end_time
? { end: toDateTuple(event.end_time) }
: { duration: { hours: defaultEventDuration } }
}