-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathevent.ts
141 lines (133 loc) · 5.36 KB
/
event.ts
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
import { cdnClient } from "@/sanity/lib/client"
import type { RootEvent } from "@/sanity/types"
/**
* Standard varighet for et event i antall timer.
* Brukes der det ikke er spesifisert en varighet.
*/
export const defaultEventDuration = 2
/**
* Henter ut en specifikk event fra sanity basert på slug
* @param slug Slug til eventen
* @returns RootEvent Eventet med den spesifikke slugen, eller null om den ikke finnes
*/
export async function getEventBySlug(slug: string): Promise<Readonly<RootEvent> | null> {
return cdnClient.fetch(
'*[_type == "event" && slug.current == $slug][0]{..., gallery->{slug}}',
{
slug,
},
)
}
interface PastAndFutureEvents {
past: ReadonlyArray<RootEvent>
future: ReadonlyArray<RootEvent>
}
/**
* Henter ut de neste og forrige eventene fra sanity.
* @param limit Maks antall events som skal hentes ut for framtidige og tidligere events
* @returns Et objekt som inneholder to lister, en med tidligere events og en med framtidige events
*/
export async function getPastAndFutureEvents(limit = 6): Promise<PastAndFutureEvents> {
return cdnClient.fetch(
`
{
"past": *[
_type == "event" && (defined(end_time) && end_time < now() || !defined(end_time) && start_time < $now)
] | order(start_time desc)[0...$limit]{..., gallery->{slug}},
"future": *[
_type == "event" && (defined(end_time) && end_time >= now() || !defined(end_time) && start_time >= $now)
] | order(start_time asc)[0...$limit]
}
`,
{ limit, now: getTimeWithOffset() },
)
}
/**
* Henter ut de neste eventene fra sanity, sortert etter starttidspunkt.
* Ved å spesifisere lastStartTime så vil tidligere eventer bli filtrert bort.
* @param limit Antall elementer som skal hentes ut
* @param lastStartTime Tidspunktet til det siste eventet som ble hentet ut. Ved å la denne være tom vil alle neste eventer bli hentet ut fram til limit.
* @returns En liste med de neste eventene. Hvis ingen ble funnet, returneres en tom liste.
* @example getFutureEvents(4, events[events.length - 1].start_time) // Henter de fire neste bedriftspresentasjonene
* @see https://www.sanity.io/docs/paginating-with-groq
*/
export async function getFutureEvents(
// TODO edge case: hvis det er flere events med samme starttidspunkt, vil ikke alle bli hentet ut
limit = 4,
lastStartTime = "",
): Promise<ReadonlyArray<RootEvent>> {
return cdnClient.fetch(
`
*[
_type == "event" && (defined(end_time) && end_time >= now() || !defined(end_time) && start_time >= $now) && start_time > $last_start_time
] | order(start_time asc)[0...$limit]
`,
{
limit,
last_start_time: lastStartTime,
now: getTimeWithOffset(),
},
)
}
/**
* Henter ut eventer fra sanity fra et gitt tidspunkt og framover. Sortert etter starttidspunkt.
* Kan filtreres etter type og spesifisere antall eventer som skal hentes ut.
* @example getEventsFrom("2022-01-01T00:00:00Z", {limit: 5, type: "bedpres"}) // Henter de fem neste bedriftspresentasjonene fra 2022
* @param from Tidspunktet som eventene skal hentes fra. Default er nå.
* @param limit Antall elementer som skal hentes ut. Default er 10.
* @param type Typen event som skal hentes ut. Default er alle typer.
* @returns En liste med eventene som ble hentet ut. Hvis ingen ble funnet, returneres en tom liste.
*/
export async function getEventsFrom(
from = "now()",
{ limit = 10, type = "*" } = {},
): Promise<ReadonlyArray<RootEvent>> {
return cdnClient.fetch(
`
*[
_type == "event" && type match $type && start_time >= $from
] | order(start_time asc)[0...$limit]
`,
{
limit,
from,
type,
},
)
}
/**
* Henter ut de forrige eventene fra sanity, sortert etter starttidspunkt.
* Ved å spesifisere lastStartTime så vil senere eventer bli filtrert bort.
* @param limit Antall elementer som skal hentes ut
* @param lastStartTime Tidspunktet til det siste eventet som ble hentet ut. Ved å la denne være tom vil alle tidligere eventer bli hentet ut fram til limit.
* @returns En liste med de forrige eventene. Hvis ingen ble funnet, returneres en tom liste.
* @example getPastEvents(4, events[events.length - 1].event_start_time) // Henter de fire neste
* @see https://www.sanity.io/docs/paginating-with-groq
*/
export async function getPastEvents(
limit = 4,
lastStartTime = "",
): Promise<ReadonlyArray<RootEvent>> {
return cdnClient.fetch(
`
*[
_type == "event" && (defined(end_time) && end_time < now() || !defined(end_time) && start_time < $now) && start_time < $last_start_time
] | order(start_time desc)[0...$limit]
`,
{
limit,
last_start_time: lastStartTime,
now: getTimeWithOffset(),
},
)
}
/**
* Setter en offset på tiden basert på defaultEventDuration.
* Det er for å kunne hente ut eventer som er i gang eller har nettopp startet.
* @returns En ISO 8601 formatert streng med tiden som er offset med defaultEventDuration timer.
*/
export function getTimeWithOffset(): string {
const date = new Date()
date.setHours(date.getHours() - defaultEventDuration)
return date.toISOString()
}