-
Notifications
You must be signed in to change notification settings - Fork 28
Expand file tree
/
Copy pathContent.js
More file actions
99 lines (81 loc) · 2.09 KB
/
Content.js
File metadata and controls
99 lines (81 loc) · 2.09 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
import ContentEditor from "./ContentEditor.js";
import { request } from "../../api/api.js";
import { push } from "../../utils/router.js";
export default function Content({ $target, initialState }) {
const $content = document.createElement("div");
$content.classList.add("layout-content");
this.state = initialState;
const post = {
title: "",
content: "",
};
let timer = null;
const contentEditor = new ContentEditor({
$target: $content,
initialState: post,
onEditing: (post) => {
if (timer !== null) {
clearTimeout(timer);
}
timer = setTimeout(async () => {
const isNew = this.state.documentId === "new";
if (isNew) {
const createdPost = await request("/documents", {
method: "post",
body: JSON.stringify(post),
});
this.setState({
documentId: createdPost.id,
});
push(`/documents/${createdPost.id}`);
} else {
await request(`/documents/${post.id}`, {
method: "put",
body: JSON.stringify(post),
});
}
}, 500);
},
});
this.setState = async (nextState) => {
if (this.state.documentId !== nextState.documentId) {
this.state = nextState;
if (this.state.documentId === "new") {
const document = {
title: "",
content: "",
};
contentEditor.setState(document);
contentEditor.render();
this.render();
} else {
await fetchPost();
}
return;
}
this.state = nextState;
this.render();
contentEditor.setState(
this.state.document || {
title: "",
content: "",
}
);
contentEditor.render();
};
this.render = () => {
$target.appendChild($content);
};
const fetchPost = async () => {
const { documentId } = this.state;
if (documentId !== "new") {
const document = await request(`/documents/${documentId}`, {
method: "get",
});
this.setState({
...this.state,
document,
});
}
};
}