import {fetchPost} from "../../util/fetch";
import {Dialog} from "../../dialog";
import {objEquals} from "../../util/functions";
import {confirmDialog} from "../../dialog/confirmDialog";
import {Constants} from "../../constants";
export const renderSnippet = () => {
fetchPost("/api/snippet/getSnippet", {type: "all", enabled: 2}, (response) => {
response.data.snippets.forEach((item: ISnippet) => {
const id = `snippet${item.type === "css" ? "CSS" : "JS"}${item.id}`;
let exitElement = document.getElementById(id) as HTMLScriptElement;
if ((!window.siyuan.config.snippet.enabledCSS && item.type === "css") ||
(!window.siyuan.config.snippet.enabledJS && item.type === "js")) {
if (exitElement) {
exitElement.remove();
}
return;
}
if (!item.enabled) {
if (exitElement) {
exitElement.remove();
}
return;
}
if (exitElement) {
if (exitElement.innerHTML === item.content) {
return;
}
exitElement.remove();
}
if (item.type === "css") {
document.head.insertAdjacentHTML("beforeend", ``);
} else if (item.type === "js") {
exitElement = document.createElement("script");
exitElement.type = "text/javascript";
exitElement.text = item.content;
exitElement.id = id;
document.head.appendChild(exitElement);
}
});
});
};
export const openSnippets = () => {
fetchPost("/api/snippet/getSnippet", {type: "all", enabled: 2}, (response) => {
let cssHTML = "";
let jsHTML = "";
response.data.snippets.forEach((item: ISnippet) => {
if (item.type === "css") {
cssHTML += genSnippet(item);
} else {
jsHTML += genSnippet(item);
}
});
const dialog = new Dialog({
width: "70vw",
height: "80vh",
content: `
`,
destroyCallback: (options) => {
if (options?.cancel === "true") {
return;
}
setSnippet(dialog, response.data.snippets, removeIds, true);
}
});
response.data.snippets.forEach((item: ISnippet) => {
const nameElement = (dialog.element.querySelector(`[data-id="${item.id}"] input`) as HTMLInputElement);
nameElement.value = item.name;
const contentElement = dialog.element.querySelector(`[data-id="${item.id}"] textarea`) as HTMLTextAreaElement;
contentElement.textContent = item.content;
});
const removeIds: string[] = [];
dialog.element.setAttribute("data-key", Constants.DIALOG_SNIPPETS);
dialog.element.addEventListener("click", (event) => {
let target = event.target as HTMLElement;
while (target && !target.isSameNode(dialog.element)) {
if (target.id === "addCodeSnippetCSS" || target.id === "addCodeSnippetJS") {
target.parentElement.insertAdjacentHTML("afterend", genSnippet({
type: target.id === "addCodeSnippetCSS" ? "css" : "js",
name: "",
content: "",
enabled: false
}));
event.stopPropagation();
event.preventDefault();
break;
} else if (target.classList.contains("b3-button--cancel")) {
dialog.destroy({cancel: "true"});
event.stopPropagation();
event.preventDefault();
break;
} else if (target.classList.contains("b3-button--text")) {
setSnippet(dialog, response.data.snippets, removeIds);
event.stopPropagation();
event.preventDefault();
break;
} else if (target.classList.contains("item")) {
if (target.getAttribute("data-type") === "css") {
target.classList.add("item--focus");
target.nextElementSibling.classList.remove("item--focus");
target.parentElement.nextElementSibling.firstElementChild.classList.remove("fn__none");
target.parentElement.nextElementSibling.lastElementChild.classList.add("fn__none");
} else {
target.classList.add("item--focus");
target.previousElementSibling.classList.remove("item--focus");
target.parentElement.nextElementSibling.firstElementChild.classList.add("fn__none");
target.parentElement.nextElementSibling.lastElementChild.classList.remove("fn__none");
}
event.stopPropagation();
event.preventDefault();
break;
} else if (target.dataset.action === "remove") {
const itemElement = target.parentElement.parentElement;
removeIds.push("#snippet" + (itemElement.getAttribute("data-type") === "css" ? "CSS" : "JS") + itemElement.getAttribute("data-id"));
itemElement.remove();
event.stopPropagation();
event.preventDefault();
break;
}
target = target.parentElement;
}
});
});
};
const genSnippet = (options: ISnippet) => {
return ``;
};
const setSnippetPost = (dialog: Dialog, snippets: ISnippet[], removeIds: string[]) => {
fetchPost("/api/snippet/setSnippet", {snippets}, () => {
removeIds.forEach(item => {
const rmElement = document.querySelector(item);
if (rmElement) {
rmElement.remove();
}
});
window.siyuan.config.snippet.enabledCSS = (dialog.element.querySelector('.b3-switch[data-action="toggleCSS"]') as HTMLInputElement).checked;
window.siyuan.config.snippet.enabledJS = (dialog.element.querySelector('.b3-switch[data-action="toggleJS"]') as HTMLInputElement).checked;
fetchPost("/api/setting/setSnippet", window.siyuan.config.snippet);
renderSnippet();
dialog.destroy({cancel: "true"});
});
};
const setSnippet = (dialog: Dialog, oldSnippets: ISnippet[], removeIds: string[], confirm = false) => {
const snippets: ISnippet[] = [];
dialog.element.querySelectorAll("[data-id]").forEach((item) => {
snippets.push({
id: item.getAttribute("data-id"),
name: item.querySelector("input").value,
type: item.getAttribute("data-type"),
content: item.querySelector("textarea").value,
enabled: (item.querySelector(".b3-switch") as HTMLInputElement).checked
});
});
if (objEquals(oldSnippets, snippets) &&
window.siyuan.config.snippet.enabledCSS === (dialog.element.querySelector('.b3-switch[data-action="toggleCSS"]') as HTMLInputElement).checked &&
window.siyuan.config.snippet.enabledJS === (dialog.element.querySelector('.b3-switch[data-action="toggleJS"]') as HTMLInputElement).checked) {
dialog.destroy({cancel: "true"});
} else {
if (confirm) {
confirmDialog(window.siyuan.languages.save, window.siyuan.languages.snippetsTip, () => {
setSnippetPost(dialog, snippets, removeIds);
});
} else {
setSnippetPost(dialog, snippets, removeIds);
}
}
};