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 {repos} from "../../config/repos"; import * as md5 from "blueimp-md5"; import {showMessage} from "../../dialog/message"; import {exitSiYuan, lockScreen, processSync} from "../../dialog/processSystem"; import {confirmDialog} from "../../dialog/confirmDialog"; import {openHistory} from "../../history/history"; import {Dialog} from "../../dialog"; import {syncGuide} from "../../sync/syncGuide"; import {openCard} from "../../card/openCard"; import {pathPosix} from "../../util/pathName"; 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}`; processSync(); }); }); 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}`; processSync(); }); }); }); 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}`; } processSync(); }); }); }; const genWorkspace = (workspaceDirElement: Element) => { fetchPost("/api/system/getWorkspaces", {}, (response) => { let html = ""; response.data.forEach((item: IWorkspace) => { html += `
  • ${pathPosix().basename(item.path)}
  • `; }); workspaceDirElement.innerHTML = html; }); }; 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; } let accountHTML = ""; if (window.siyuan.user) { accountHTML = ``; } else { accountHTML = ``; } menuElement.innerHTML = `
    ${accountHTML} `; // 只能用 click,否则无法上下滚动 https://github.com/siyuan-note/siyuan/issues/6628 processSync(); menuElement.addEventListener("click", (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") { initAbout(); event.preventDefault(); event.stopPropagation(); break; } else if (target.id === "menuNewDaily") { newDailyNote(); closePanel(); event.preventDefault(); event.stopPropagation(); break; } else if (target.id === "menuCard") { openCard(); closePanel(); event.preventDefault(); event.stopPropagation(); break; } else if (target.id === "menuNewNotebook") { newNotebook(); closePanel(); event.preventDefault(); event.stopPropagation(); break; } else if (target.id === "menuHelp") { mountHelp(); event.preventDefault(); event.stopPropagation(); break; } else if (target.id === "menuLock") { lockScreen(); event.preventDefault(); event.stopPropagation(); break; } else if (target.id === "menuSync") { 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(); closePanel(); 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}`; processSync(); }); }); }); 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}`; processSync(); }); }); }); break; } target = target.parentElement; } }); menuElement.style.right = "0"; scrimElement.classList.remove("fn__none"); }; const initAbout = () => { 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 = ["127.0.0.1"]; } const modelElement = document.getElementById("model"); const modelMainElement = document.getElementById("modelMain"); 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.workspaceList}
    会泽百家 至公天下
    ${window.siyuan.languages.about1}
    `; const workspaceDirElement = modelMainElement.querySelector("#workspaceDir"); genWorkspace(workspaceDirElement); const importKeyElement = modelMainElement.querySelector("#importKey"); modelMainElement.addEventListener("click", (event) => { let target = event.target as HTMLElement; while (target && !target.isSameNode(modelMainElement)) { if (target.id === "authCode") { setAccessAuthCode(); event.preventDefault(); event.stopPropagation(); break; } else if (target.id === "importKey") { 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(); }); }); event.preventDefault(); event.stopPropagation(); break; } else if (target.id === "initKey") { 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"); }); }); event.preventDefault(); event.stopPropagation(); break; } else if (target.id === "initKeyByPW") { const initDialog = new Dialog({ title: "🔑 " + window.siyuan.languages.genKeyByPW, content: `
    `, width: "80vw", }); 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"); }); }); }); event.preventDefault(); event.stopPropagation(); break; } else if (target.id === "copyKey") { showMessage(window.siyuan.languages.copied); writeText(window.siyuan.config.repo.key); event.preventDefault(); event.stopPropagation(); break; } else if (target.id === "removeKey") { confirmDialog("⚠️ " + window.siyuan.languages.resetRepo, window.siyuan.languages.resetRepoTip, () => { fetchPost("/api/repo/resetRepo", {}, () => { window.siyuan.config.repo.key = ""; window.siyuan.config.sync.enabled = false; processSync(); importKeyElement.parentElement.classList.remove("fn__none"); importKeyElement.parentElement.nextElementSibling.classList.add("fn__none"); }); }); event.preventDefault(); event.stopPropagation(); break; } else if (target.id === "token") { showMessage(window.siyuan.languages.copied); writeText(window.siyuan.config.api.token); event.preventDefault(); event.stopPropagation(); break; } else if (target.id === "exportData") { fetchPost("/api/export/exportData", {}, response => { openByMobile(response.data.zip); }); event.preventDefault(); event.stopPropagation(); break; } else if (target.id === "exportLog") { fetchPost("/api/system/exportLog", {}, (response) => { openByMobile(response.data.zip); }); event.preventDefault(); event.stopPropagation(); break; } else if (target.id === "openWorkspace") { fetchPost("/api/system/getMobileWorkspaces", {}, (response) => { let selectHTML = "" response.data.forEach((item: string, index: number) => { selectHTML += `` }) const openWorkspaceDialog = new Dialog({ title: window.siyuan.languages.openBy, content: `
    `, width: "80vw", }); const btnsElement = openWorkspaceDialog.element.querySelectorAll(".b3-button"); btnsElement[0].addEventListener("click", () => { openWorkspaceDialog.destroy(); }); btnsElement[1].addEventListener("click", () => { const openPath = openWorkspaceDialog.element.querySelector("select").value; confirmDialog(window.siyuan.languages.confirm, `${pathPosix().basename(window.siyuan.config.system.workspaceDir)} -> ${pathPosix().basename(openPath)}?`, () => { fetchPost("/api/system/setWorkspaceDir", { path: openPath }, () => { exitSiYuan(); }); }); }); }) event.preventDefault(); event.stopPropagation(); break; } else if (target.id === "creatWorkspace") { const createWorkspaceDialog = new Dialog({ title: window.siyuan.languages.new, content: `
    `, width: "80vw", }); const inputElement = createWorkspaceDialog.element.querySelector("input"); inputElement.focus(); const btnsElement = createWorkspaceDialog.element.querySelectorAll(".b3-button"); btnsElement[0].addEventListener("click", () => { createWorkspaceDialog.destroy(); }); btnsElement[1].addEventListener("click", () => { fetchPost("/api/system/createWorkspaceDir", { path: pathPosix().join(pathPosix().dirname(window.siyuan.config.system.workspaceDir), inputElement.value) }, () => { genWorkspace(workspaceDirElement); createWorkspaceDialog.destroy(); }); }); event.preventDefault(); event.stopPropagation(); break; } else if (target.getAttribute("data-type") === "remove") { fetchPost("/api/system/removeWorkspaceDir", {path: target.parentElement.getAttribute("data-path")}, () => { genWorkspace(workspaceDirElement); }); event.preventDefault(); event.stopPropagation(); break; } else if (target.classList.contains("b3-list-item") && !target.classList.contains("b3-list-item--focus")) { confirmDialog(window.siyuan.languages.confirm, `${pathPosix().basename(window.siyuan.config.system.workspaceDir)} -> ${pathPosix().basename(target.getAttribute("data-path"))}?`, () => { fetchPost("/api/system/setWorkspaceDir", { path: target.getAttribute("data-path") }, () => { exitSiYuan(); }); }); event.preventDefault(); event.stopPropagation(); break; } target = target.parentElement; } }); 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(); }); }); }