forked from SolidOS/solid-ui
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathheaderFooterHelpers.ts
More file actions
140 lines (138 loc) · 4.58 KB
/
Copy pathheaderFooterHelpers.ts
File metadata and controls
140 lines (138 loc) · 4.58 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
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
/*
Copied from mashlib/src/global/metadata.ts
*/
import { IndexedFormula, LiveStore, NamedNode, parse, sym } from 'rdflib'
import { ns } from '..'
import { styleMap as headerStyleMap } from '../header/styleMap'
import { styleMap as footerStyleMap } from '../footer/styleMap'
import { getClasses } from '../jss'
/* @ts-ignore no-console */
type ThrottleOptions = {
leading?: boolean;
throttling?: boolean;
trailing?: boolean;
}
/**
* @internal
*/
function getStyle (styleClass, type?) {
if (type && type === 'footer') {
return footerStyleMap[styleClass]
} else {
return headerStyleMap[styleClass]
}
}
/**
* @ignore exporting this only for the unit test
*/
export function addStyleClassToElement (element: any, styleClasses: string[], type?: string) {
styleClasses.forEach((styleClass) => {
const style = getStyle(styleClass, type)
const { classes } = getClasses(document.head, { [styleClass]: style })
element.classList.add(classes[styleClass])
})
}
/**
* @ignore exporting this only for the unit test
*/
export function getPod (): NamedNode {
// @@ TODO: This is given that mashlib runs on NSS - might need to change when we want it to run on other Pod servers
return sym(document.location.origin).site()
}
/**
*/
export async function getPodOwner (pod: NamedNode, store: LiveStore): Promise<NamedNode | null> {
// This is a massive guess. In future
// const podOwner = sym(`${pod.uri}profile/card#me`)
/* eslint-disable no-console */
try {
// load turtle Container representation
if (!store.any(pod, null, ns.ldp('Container'), pod)) {
const response = await store.fetcher.webOperation('GET', pod.uri, store.fetcher.initFetchOptions(pod.uri, { headers: { accept: 'text/turtle' } }))
const containerTurtle = response.responseText
parse(containerTurtle as string, store, pod.uri, 'text/turtle')
}
} catch (err) {
console.error('Error loading pod ' + pod + ': ' + err)
return null
}
if (!store.holds(pod, ns.rdf('type'), ns.space('Storage'), pod)) {
console.warn('Pod ' + pod + ' does not declare itself as a space:Storage')
return null
}
const podOwner = store.any(pod, ns.solid('owner'), null, pod) ||
store.any(null, ns.space('storage'), pod, pod)
if (podOwner) {
try {
await store.fetcher.load((podOwner as NamedNode).doc())
} catch (err) {
console.warn('Unable to load profile of pod owner ' + podOwner)
return null
}
if (!store.holds(podOwner, ns.space('storage'), pod, (podOwner as NamedNode).doc())) {
console.warn(`Pod owner ${podOwner} does NOT list pod ${pod} as their storage`)
}
return podOwner as NamedNode// Success!
} else { // pod owner not declared in pod
// @@ TODO: This is given the structure that NSS provides
// This is a massive guess. For old pods which don't have owner link
const guess = sym(`${pod.uri}profile/card#me`)
try {
// @ts-ignore LiveStore always has fetcher
await store.fetcher.load(guess)
} catch (err) {
console.error('Ooops. Guessed wrong pod owner webid {$guess} : can\'t load it.')
return null
}
if (store.holds(guess, ns.space('storage'), pod, guess.doc())) {
console.warn('Using guessed pod owner webid but it links back.')
return guess
}
return null
}
/* eslint-enable no-console */
}
/**
* @ignore exporting this only for the unit test
*/
export function getName (store: IndexedFormula, user: NamedNode): string {
return store.anyValue(user, ns.vcard('fn'), null, user.doc()) ||
store.anyValue(user, ns.foaf('name'), null, user.doc()) ||
user.uri
}
/**
* @ignore exporting this only for the unit test
*/
export function throttle (func: Function, wait: number, options: ThrottleOptions = {}): (...args: any[]) => any {
let context: any,
args: any,
result: any
let timeout: any = null
let previous = 0
const later = function () {
previous = !options.leading ? 0 : Date.now()
timeout = null
result = func.apply(context, args)
if (!timeout) context = args = null
}
return function () {
const now = Date.now()
if (!previous && !options.leading) previous = now
const remaining = wait - (now - previous)
// @ts-ignore
context = this
args = arguments
if (remaining <= 0 || remaining > wait) {
if (timeout) {
clearTimeout(timeout)
timeout = null
}
previous = now
result = func.apply(context, args)
if (!timeout) context = args = null
} else if (!timeout && options.trailing !== false) {
timeout = setTimeout(later, remaining)
}
return result
}
}