-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathtaggedLiteral.js
58 lines (48 loc) · 1.2 KB
/
taggedLiteral.js
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
import { AsyncDirective, directive } from 'lit/async-directive.js'
import { dispatcher } from './lib/dispatcher.js'
import { getLocalizedLabel } from './index.js'
/**
* @typedef {import('clownface').AnyPointer | undefined} Pointer
*/
class TaggedLiteralDirective extends AsyncDirective {
/**
*
* @param {import('lit/directive').PartInfo} part
*/
constructor(part) {
super(part)
/**
* @private
* @readonly
*/
this.languageUpdated = () => {
this.setValue(this.getTranslation())
}
dispatcher.addEventListener('language-set', this.languageUpdated)
}
/**
*
* @param {Pointer} pointer
* @param {object} [options]
* @param {string} [options.fallback]
* @returns {string|*}
*/
render(pointer, { fallback = '' } = {}) {
this.pointer = pointer
this.fallback = fallback
return this.getTranslation()
}
disconnected() {
dispatcher.removeEventListener('language-set', this.languageUpdated)
}
/**
* @private
*/
getTranslation() {
if (!this.pointer) {
return this.fallback
}
return getLocalizedLabel(this.pointer) || this.fallback
}
}
export const taggedLiteral = directive(TaggedLiteralDirective)