-
Notifications
You must be signed in to change notification settings - Fork 34
/
Copy pathdata-preload.ts
59 lines (46 loc) · 1.22 KB
/
data-preload.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
declare function getPage(path: string): Page | undefined
declare function preloadData(page: Page): void
export enum DataType {
Static = 'static',
Dynamic = 'dynamic'
}
type Page = {
pathname: string
title?: string
data?: Request[]
}
type Request = RequestInit & {
url: string
static?: boolean
preconnect?: string[]
}
type Events = {
[event: string]: DataType
}
type EventHandlers = {
[event: string]: () => void
}
const defaultEvents: Events = {
onMouseEnter: DataType.Static,
onTouchStart: DataType.Static,
onMouseDown: DataType.Dynamic,
onClick: DataType.Dynamic
}
export const getDataPreloadHandlers = (pathname: string, events: Events = defaultEvents) => {
const handlers: EventHandlers = {}
const page = getPage(pathname)
const { data } = page || {}
if (!data) return handlers
const staticData = data.filter(data => data.static)
const dynamicData = data.filter(data => !data.static)
for (const event in events) {
const relevantData = events[event] === DataType.Static ? staticData : dynamicData
if (relevantData.length) {
handlers[event] = () => {
preloadData({ ...page, pathname, data: relevantData })
delete handlers[event]
}
}
}
return handlers
}