import {fetchPost} from "../../util/fetch"; import {getEventName, openByMobile, writeText} from "../../protyle/util/compatibility"; import {popSearch} from "./search"; import {initAppearance} from "../settings/appearance"; import {closePanel} from "./closePanel"; import {Constants} from "../../constants"; import {setAccessAuthCode} from "../../config/util/setAccessAuthCode"; import {mountHelp, newDailyNote, newNotebook} from "../../util/mount"; import {needSubscribe} from "../../util/needSubscribe"; import {repos} from "../../config/repos"; import * as md5 from "blueimp-md5"; import {showMessage} from "../../dialog/message"; import {exitSiYuan} from "../../dialog/processSystem"; import {confirmDialog} from "../../dialog/confirmDialog"; import {openHistory} from "../../util/history"; import {Dialog} from "../../dialog"; import {syncGuide} from "../../sync/syncGuide"; const showAccountInfo = (modelElement: HTMLElement, modelMainElement: Element) => { closePanel(); let userTitlesHTML = ""; if (window.siyuan.user.userTitles.length > 0) { userTitlesHTML = '
'; window.siyuan.user.userTitles.forEach((item) => { userTitlesHTML += `
${item.icon} ${item.name}
`; }); userTitlesHTML += "
"; } modelElement.style.top = "0"; modelElement.querySelector(".toolbar__icon").innerHTML = ''; modelElement.querySelector(".toolbar__text").textContent = window.siyuan.languages.accountManage; modelMainElement.innerHTML = `

${window.siyuan.user.userName}

${userTitlesHTML}
${window.siyuan.languages.accountManage}
`; modelMainElement.querySelector("#logout").addEventListener(getEventName(), () => { fetchPost("/api/setting/logoutCloudUser", {}, () => { window.siyuan.user = null; closePanel(); document.getElementById("menuAccount").innerHTML = `${window.siyuan.languages.login}`; }); }); modelMainElement.querySelector("#deactivateUser").addEventListener(getEventName(), () => { confirmDialog("⚠️ " + window.siyuan.languages.deactivateUser, window.siyuan.languages.deactivateUserTip, () => { fetchPost("/api/account/deactivate", {}, () => { window.siyuan.user = null; closePanel(); document.getElementById("menuAccount").innerHTML = `${window.siyuan.languages.login}`; }); }); }); const refreshElement = modelMainElement.querySelector("#refresh"); refreshElement.addEventListener("click", () => { const svgElement = refreshElement.firstElementChild; if (svgElement.classList.contains("fn__rotate")) { return; } svgElement.classList.add("fn__rotate"); fetchPost("/api/setting/getCloudUser", { token: window.siyuan.user.userToken, }, response => { window.siyuan.user = response.data; showMessage(window.siyuan.languages.refreshUser, 3000); showAccountInfo(modelElement, modelMainElement); const menuAccountElement = document.getElementById("menuAccount"); if (window.siyuan.user) { menuAccountElement.innerHTML = `${window.siyuan.user.userName}`; } else { menuAccountElement.innerHTML = `${window.siyuan.languages.login}`; } }); }); }; export const popMenu = () => { const modelElement = document.getElementById("model"); const modelMainElement = document.getElementById("modelMain"); const scrimElement = document.querySelector(".scrim"); const menuElement = document.getElementById("menu"); if (menuElement.innerHTML !== "") { menuElement.style.right = "0"; scrimElement.classList.remove("fn__none"); return; } fetchPost("/api/setting/getCloudUser", {}, userResponse => { window.siyuan.user = userResponse.data; let accountHTML = ""; if (window.siyuan.user) { accountHTML = ``; } else { accountHTML = ``; } menuElement.innerHTML = `
${accountHTML} `; menuElement.addEventListener(getEventName(), (event) => { let target = event.target as HTMLElement; while (target && !target.isEqualNode(menuElement)) { if (target.id === "menuSearch") { popSearch(modelElement, modelMainElement); event.preventDefault(); event.stopPropagation(); break; } else if (target.id === "menuAppearance") { initAppearance(modelElement, modelMainElement); event.preventDefault(); event.stopPropagation(); break; } else if (target.id === "menuSafeQuit") { exitSiYuan(); event.preventDefault(); event.stopPropagation(); break; } else if (target.id === "menuAbout") { closePanel(); if (!window.siyuan.config.localIPs || window.siyuan.config.localIPs.length === 0 || (window.siyuan.config.localIPs.length === 1 && window.siyuan.config.localIPs[0] === "")) { window.siyuan.config.localIPs = ["localhost"]; } modelElement.style.top = "0"; modelElement.querySelector(".toolbar__icon").innerHTML = ''; modelElement.querySelector(".toolbar__text").textContent = window.siyuan.languages.about; modelMainElement.innerHTML = `
${window.siyuan.languages.about11}
${window.siyuan.languages.about12}
${window.siyuan.languages.about2}
${window.siyuan.languages.about3.replace("${port}", location.port)}
${window.siyuan.config.localIPs.join(" ")}
${window.siyuan.languages.about5}
${window.siyuan.languages.about6}
${window.siyuan.languages.dataRepoKey}
${window.siyuan.languages.dataRepoKeyTip1}
${window.siyuan.languages.dataRepoKeyTip2}
${window.siyuan.languages.about13} ${window.siyuan.config.api.token}
${window.siyuan.languages.about14}
${window.siyuan.languages.export}
${window.siyuan.languages.exportDataTip}
${window.siyuan.languages.systemLogTip}
${window.siyuan.languages.import}
${window.siyuan.languages.importDataTip}
会泽百家 至公天下
${window.siyuan.languages.about1}
`; const authCodeElement = modelMainElement.querySelector("#authCode") as HTMLInputElement; authCodeElement.addEventListener("click", () => { setAccessAuthCode(); }); const importKeyElement = modelMainElement.querySelector("#importKey"); importKeyElement.addEventListener("click", () => { const passwordDialog = new Dialog({ title: "🔑 " + window.siyuan.languages.key, content: `
`, width: "80vw", }); const textAreaElement = passwordDialog.element.querySelector("textarea"); textAreaElement.focus(); const btnsElement = passwordDialog.element.querySelectorAll(".b3-button"); btnsElement[0].addEventListener("click", () => { passwordDialog.destroy(); }); btnsElement[1].addEventListener("click", () => { fetchPost("/api/repo/importRepoKey", {key: textAreaElement.value}, () => { window.siyuan.config.repo.key = textAreaElement.value; importKeyElement.parentElement.classList.add("fn__none"); importKeyElement.parentElement.nextElementSibling.classList.remove("fn__none"); passwordDialog.destroy(); }); }); }); modelMainElement.querySelector("#initKey").addEventListener("click", () => { confirmDialog("🔑 " + window.siyuan.languages.genKey, window.siyuan.languages.initRepoKeyTip, () => { fetchPost("/api/repo/initRepoKey", {}, (response) => { window.siyuan.config.repo.key = response.data.key; importKeyElement.parentElement.classList.add("fn__none"); importKeyElement.parentElement.nextElementSibling.classList.remove("fn__none"); }); }); }); modelMainElement.querySelector("#initKeyByPW").addEventListener("click", () => { const initDialog = new Dialog({ title: "🔑 " + window.siyuan.languages.genKeyByPW, content: `
`, width: "520px", }); const inputElement = initDialog.element.querySelector(".b3-text-field") as HTMLInputElement; inputElement.focus(); const btnsElement = initDialog.element.querySelectorAll(".b3-button"); initDialog.bindInput(inputElement, () => { (btnsElement[1] as HTMLButtonElement).click(); }); btnsElement[0].addEventListener("click", () => { initDialog.destroy(); }); btnsElement[1].addEventListener("click", () => { if (!inputElement.value) { showMessage(window.siyuan.languages._kernel[142]); return; } confirmDialog("🔑 " + window.siyuan.languages.genKeyByPW, window.siyuan.languages.initRepoKeyTip, () => { initDialog.destroy(); fetchPost("/api/repo/InitRepoKeyFromPassphrase", {pass: inputElement.value}, (response) => { window.siyuan.config.repo.key = response.data.key; importKeyElement.parentElement.classList.add("fn__none"); importKeyElement.parentElement.nextElementSibling.classList.remove("fn__none"); }); }); }); }); modelMainElement.querySelector("#copyKey").addEventListener("click", () => { showMessage(window.siyuan.languages.copied); writeText(window.siyuan.config.repo.key); }); modelMainElement.querySelector("#removeKey").addEventListener("click", () => { confirmDialog("⚠️ " + window.siyuan.languages.resetRepo, window.siyuan.languages.resetRepoTip, () => { fetchPost("/api/repo/resetRepo", {}, () => { window.siyuan.config.repo.key = ""; window.siyuan.config.sync.enabled = false; importKeyElement.parentElement.classList.remove("fn__none"); importKeyElement.parentElement.nextElementSibling.classList.add("fn__none"); }); }); }); modelMainElement.querySelector("#token").addEventListener("click", () => { showMessage(window.siyuan.languages.copied); writeText(window.siyuan.config.api.token); }); modelMainElement.querySelector("#exportData").addEventListener("click", () => { fetchPost("/api/export/exportData", {}, response => { openByMobile(response.data.zip); }); }); modelMainElement.querySelector("#exportLog").addEventListener("click", () => { fetchPost("/api/system/exportLog", {}, (response) => { openByMobile(response.data.zip); }); }); modelMainElement.querySelector("#importData").addEventListener("change", (event: InputEvent & { target: HTMLInputElement }) => { const formData = new FormData(); formData.append("file", event.target.files[0]); fetchPost("/api/import/importData", formData); }); const networkServeElement = modelMainElement.querySelector("#networkServe") as HTMLInputElement; networkServeElement.addEventListener("change", () => { fetchPost("/api/system/setNetworkServe", {networkServe: networkServeElement.checked}, () => { exitSiYuan(); }); }); event.preventDefault(); event.stopPropagation(); break; } else if (target.id === "menuNewDaily") { newDailyNote(); event.preventDefault(); event.stopPropagation(); break; } else if (target.id === "menuNewNotebook") { newNotebook(); event.preventDefault(); event.stopPropagation(); break; } else if (target.id === "menuHelp") { mountHelp(); event.preventDefault(); event.stopPropagation(); break; } else if (target.id === "menuLock") { fetchPost("/api/system/logoutAuth", {}, () => { window.location.href = "/"; }); event.preventDefault(); event.stopPropagation(); break; } else if (target.id === "menuSync") { if (!needSubscribe()) { closePanel(); modelElement.style.top = "0"; modelElement.querySelector(".toolbar__icon").innerHTML = ''; modelElement.querySelector(".toolbar__text").textContent = window.siyuan.languages.cloud; modelMainElement.innerHTML = repos.genHTML(); repos.element = modelMainElement; repos.bindEvent(); } event.preventDefault(); event.stopPropagation(); break; } else if (target.id === "menuSyncNow") { syncGuide(); event.preventDefault(); event.stopPropagation(); break; } else if (target.id === "menuHistory" && !window.siyuan.config.readonly) { openHistory(); event.preventDefault(); event.stopPropagation(); break; } else if (target.id === "menuAccount") { event.preventDefault(); event.stopPropagation(); closePanel(); if (document.querySelector("#menuAccount img")) { showAccountInfo(modelElement, modelMainElement); return; } modelElement.style.top = "0"; modelElement.querySelector(".toolbar__icon").innerHTML = ''; modelElement.querySelector(".toolbar__text").textContent = window.siyuan.languages.login; modelMainElement.innerHTML = `
${window.siyuan.languages.forgetPassword} ${window.siyuan.languages.register}
`; const agreeLoginElement = modelMainElement.querySelector("#agreeLogin") as HTMLInputElement; const userNameElement = modelMainElement.querySelector("#userName") as HTMLInputElement; const userPasswordElement = modelMainElement.querySelector("#userPassword") as HTMLInputElement; const captchaImgElement = modelMainElement.querySelector("#captchaImg") as HTMLInputElement; const captchaElement = modelMainElement.querySelector("#captcha") as HTMLInputElement; const twofactorAuthCodeElement = modelMainElement.querySelector("#twofactorAuthCode") as HTMLInputElement; const loginBtnElement = modelMainElement.querySelector("#login") as HTMLButtonElement; const login2BtnElement = modelMainElement.querySelector("#login2") as HTMLButtonElement; userNameElement.focus(); let token: string; let needCaptcha: string; agreeLoginElement.addEventListener("click", () => { if (agreeLoginElement.checked) { loginBtnElement.removeAttribute("disabled"); } else { loginBtnElement.setAttribute("disabled", "disabled"); } }); captchaImgElement.addEventListener("click", () => { captchaImgElement.setAttribute("src", `https://ld246.com/captcha/login?needCaptcha=${needCaptcha}&t=${new Date().getTime()}`); }); loginBtnElement.addEventListener("click", () => { fetchPost("/api/account/login", { userName: userNameElement.value.replace(/(^\s*)|(\s*$)/g, ""), userPassword: md5(userPasswordElement.value), captcha: captchaElement.value.replace(/(^\s*)|(\s*$)/g, ""), }, (data) => { if (data.code === 1) { showMessage(data.msg); if (data.data.needCaptcha) { // 验证码 needCaptcha = data.data.needCaptcha; captchaElement.parentElement.classList.remove("fn__none"); captchaElement.previousElementSibling.setAttribute("src", `https://ld246.com/captcha/login?needCaptcha=${data.data.needCaptcha}`); captchaElement.value = ""; return; } return; } if (data.code === 10) { // 两步验证 modelMainElement.querySelector("#form1").classList.add("fn__none"); modelMainElement.querySelector("#form2").classList.remove("fn__none"); twofactorAuthCodeElement.focus(); token = data.data.token; return; } fetchPost("/api/setting/getCloudUser", { token: data.data.token, }, response => { window.siyuan.user = response.data; closePanel(); document.getElementById("menuAccount").innerHTML = ` ${window.siyuan.user.userName}`; }); }); }); login2BtnElement.addEventListener("click", () => { fetchPost("/api/setting/login2faCloudUser", { code: twofactorAuthCodeElement.value, token, }, faResponse => { fetchPost("/api/setting/getCloudUser", { token: faResponse.data.token, }, response => { window.siyuan.user = response.data; closePanel(); document.getElementById("menuAccount").innerHTML = ` ${window.siyuan.user.userName}`; }); }); }); break; } target = target.parentElement; } }); menuElement.style.right = "0"; scrimElement.classList.remove("fn__none"); }); };