-
-
Notifications
You must be signed in to change notification settings - Fork 22
/
Copy pathindex.gts
92 lines (71 loc) · 2.31 KB
/
index.gts
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
import { waitForPromise } from '@ember/test-waiters';
import { service } from 'ember-primitives/helpers/service';
import { resource, resourceFactory } from 'ember-resources';
import { TrackedObject } from 'tracked-built-ins';
import codemirror, { setupCodeMirror } from './-code-mirror';
import Loader from './loader';
import { LoadingError } from './loading-error';
import { Placeholder } from './placeholder';
import type { TOC } from '@ember/component/template-only';
function deferCodemirror() {
const state = new TrackedObject({ isLoading: false, isDone: false, error: null });
function getEditor() {
state.isLoading = true;
waitForPromise(setupCodeMirror())
.then(() => {
state.isDone = true;
})
.catch((error) => (state.error = error))
.finally(() => {
state.isLoading = false;
});
}
function cleanup() {
window.removeEventListener('mousemove', load);
window.removeEventListener('keydown', load);
window.removeEventListener('touchstart', load);
}
const load = () => {
getEditor();
cleanup();
};
return resource(({ on, owner }) => {
if (owner.lookup('service:router').currentRoute?.queryParams?.['forceEditor'] === 'true') {
load();
}
on.cleanup(() => cleanup());
window.addEventListener('mousemove', load, { passive: true });
window.addEventListener('keydown', load, { passive: true });
window.addEventListener('touchstart', load, { passive: true });
return state;
});
}
resourceFactory(deferCodemirror);
export const Editor: TOC<{
Element: HTMLDivElement;
}> = <template>
{{#let (deferCodemirror) as |state|}}
{{#if state.isDone}}
{{#let (service "editor") as |context|}}
<div class="overflow-hidden overflow-y-auto">
{{! template-lint-disable no-inline-styles }}
<div style="width: 100%; height: 100%;" {{codemirror}}>{{context.text}}</div>
</div>
{{/let}}
{{else}}
<div
class="syntax-dark bg-code-bg relative overflow-hidden border border-gray-900"
...attributes
>
{{#if state.isLoading}}
<Loader />
{{/if}}
{{#if state.error}}
<LoadingError @error={{state.error}} />
{{/if}}
<Placeholder />
</div>
{{/if}}
{{/let}}
</template>;
export default Editor;