-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
87 lines (76 loc) · 2.42 KB
/
index.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
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
import "./components/notes-list/notes-list.js";
import "./components/notes-edit/notes-edit.js";
class ViewModel {
#notesMessageHandler = this.#notesMessage.bind(this);
#worker = new Worker("worker.js");
#methodEventMap = Object.freeze({
get: "note-edit",
getAll: "note-list"
});
constructor(instance) {
this.instance = instance;
instance.addEventListener("notes-message", this.#notesMessageHandler.bind(this));
this.#worker.onmessage = event => {
const eventName = this.#methodEventMap[event.data.method];
this.instance.dispatchEvent(new CustomEvent(eventName, {
detail: {
intent: event.data.method,
data: event.data.result
}
}));
}
}
dispose() {
this.instance.removeEventListener("new-note", this.#notesMessageHandler);
this.#notesMessageHandler = null;
}
async loadExisting() {
requestIdleCallback(async () => {
const result = await this.#worker.postMessage({
method: 'getAll',
params: ["notes", "notesStore", 1]
});
});
}
async #newNote(event) {
this.#worker.postMessage({
method: "put",
params: ["notes", "notesStore", 1, event.detail]
});
this.instance.dispatchEvent(new CustomEvent("note-list", {
detail: {
intent: "add",
data: event.detail
}
}));
}
async #edit(event) {
const result = await this.#worker.postMessage({
method: 'get',
params: ["notes", "notesStore", 1, event.detail.key]
});
}
async #delete(event) {
this.#worker.postMessage({
method: "delete",
params: ["notes", "notesStore", 1, event.detail.key]
});
}
async #notesMessage(event) {
switch (event.detail.intent) {
case "add":
await this.#newNote(event);
break;
case "edit":
await this.#edit(event);
break;
case "delete":
await this.#delete(event);
break;
default:
throw new Error(`Unsupported intent: ${event.detail.intent}`);
}
}
}
window.viewModel = new ViewModel(window);
window.viewModel.loadExisting();