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
137 lines (135 loc) · 4.29 KB
/
Copy pathheaderFooterHelpers.ts
File metadata and controls
137 lines (135 loc) · 4.29 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
/*
Copied from mashlib/src/global/metadata.ts
*/
import { IndexedFormula, LiveStore, NamedNode, 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 {
// @ts-ignore LiveStore always has fetcher
store.fetcher.load(pod)
} 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 {
// @ts-ignore LiveStore always has fetcher
store.fetcher.load(podOwner.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
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
}
}