import * as md5 from "blueimp-md5"; import {hideMessage, showMessage} from "../dialog/message"; import {Constants} from "../constants"; import {fetchPost} from "../util/fetch"; import {repos} from "./repos"; import {confirmDialog} from "../dialog/confirmDialog"; import {needSubscribe} from "../util/needSubscribe"; import {syncGuide} from "../sync/syncGuide"; import {hasClosestByClassName} from "../protyle/util/hasClosest"; import {getEventName} from "../protyle/util/compatibility"; import {processSync} from "../dialog/processSystem"; export const account = { element: undefined as Element, genHTML: () => { let sponsor = "https://ld246.com/sponsor"; if ("zh_CN" !== window.siyuan.config.lang) { sponsor = "https://opencollective.com/b3log"; } const payHTML = " ${window.siyuan.languages.sponsor}
${window.siyuan.languages.account4}
${window.siyuan.languages.account1}
${window.siyuan.languages.account8}
${window.siyuan.languages.account2}
${window.siyuan.languages.account7}
${window.siyuan.languages.freeSub}
`; if (window.siyuan.user) { let userTitlesHTML = ""; if (window.siyuan.user.userTitles.length > 0) { userTitlesHTML = '
'; window.siyuan.user.userTitles.forEach((item) => { userTitlesHTML += `
${item.icon} ${item.name}
`; }); userTitlesHTML += "
"; } let subscriptionHTML = payHTML; let activeSubscriptionHTML = `
`; if (window.siyuan.user.userSiYuanProExpireTime === -1) { activeSubscriptionHTML = ""; subscriptionHTML = `
${Constants.SIYUAN_IMAGE_VIP}${window.siyuan.languages.account12}
`; } else if (window.siyuan.user.userSiYuanProExpireTime > 0) { if (window.siyuan.user.userSiYuanSubscriptionPlan === 2) { subscriptionHTML = `
${window.siyuan.languages.account3}
${window.siyuan.languages.account6} ${Math.max(0, Math.floor((window.siyuan.user.userSiYuanProExpireTime - new Date().getTime()) / 1000 / 60 / 60 / 24))} ${window.siyuan.languages.day} ${window.siyuan.languages.clickMeToRenew}
${window.siyuan.languages.account8}`; } else { subscriptionHTML = `
${window.siyuan.languages.account10}
${window.siyuan.languages.account6} ${Math.max(0, Math.floor((window.siyuan.user.userSiYuanProExpireTime - new Date().getTime()) / 1000 / 60 / 60 / 24))} ${window.siyuan.languages.day} ${window.siyuan.languages.clickMeToRenew}
`; } } return `
${subscriptionHTML}
${activeSubscriptionHTML}
`; } return `
${payHTML}
`; }, bindEvent: (element: Element) => { const trialSubElement = element.querySelector("#trialSub"); if (trialSubElement) { trialSubElement.addEventListener("click", () => { fetchPost("/api/account/startFreeTrial", {}, () => { element.querySelector("#refresh").dispatchEvent(new Event("click")); }); }); } const agreeLoginElement = element.querySelector("#agreeLogin") as HTMLInputElement; const userNameElement = element.querySelector("#userName") as HTMLInputElement; if (!userNameElement) { const refreshElement = element.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; element.innerHTML = account.genHTML(); account.bindEvent(element); showMessage(window.siyuan.languages.refreshUser, 3000); account.onSetaccount(); processSync(); }); }); element.querySelector("#logout").addEventListener("click", () => { fetchPost("/api/setting/logoutCloudUser", {}, () => { fetchPost("/api/setting/getCloudUser", {}, response => { window.siyuan.user = response.data; element.innerHTML = account.genHTML(); account.bindEvent(element); account.onSetaccount(); processSync(); }); }); }); element.querySelector("#deactivateUser").addEventListener(getEventName(), () => { confirmDialog("⚠️ " + window.siyuan.languages.deactivateUser, window.siyuan.languages.deactivateUserTip, () => { fetchPost("/api/account/deactivate", {}, () => { window.siyuan.user = null; element.innerHTML = account.genHTML(); account.bindEvent(element); account.onSetaccount(); processSync(); }); }); }); element.querySelectorAll("input[type='checkbox']").forEach(item => { item.addEventListener("change", () => { fetchPost("/api/setting/setAccount", { displayTitle: (element.querySelector("#displayTitle") as HTMLInputElement).checked, displayVIP: (element.querySelector("#displayVIP") as HTMLInputElement).checked, }, (response) => { window.siyuan.config.account.displayTitle = response.data.displayTitle; window.siyuan.config.account.displayVIP = response.data.displayVIP; account.onSetaccount(); }); }); }); const activationCodeElement = element.querySelector("#activationCode"); activationCodeElement.addEventListener("click", () => { const activationCodeInput = (activationCodeElement.previousElementSibling as HTMLInputElement); fetchPost("/api/account/checkActivationcode", {data: activationCodeInput.value}, (response) => { if (0 !== response.code) { activationCodeInput.value = ""; } confirmDialog(window.siyuan.languages.activationCode, response.msg, () => { if (response.code === 0) { fetchPost("/api/account/useActivationcode", {data: (activationCodeElement.previousElementSibling as HTMLInputElement).value}, () => { refreshElement.dispatchEvent(new CustomEvent("click")); }); } }); }); }); return; } const userPasswordElement = element.querySelector("#userPassword") as HTMLInputElement; const captchaImgElement = element.querySelector("#captchaImg") as HTMLInputElement; const captchaElement = element.querySelector("#captcha") as HTMLInputElement; const twofactorAuthCodeElement = element.querySelector("#twofactorAuthCode") as HTMLInputElement; const loginBtnElement = element.querySelector("#login") as HTMLButtonElement; const login2BtnElement = element.querySelector("#login2") as HTMLButtonElement; agreeLoginElement.addEventListener("click", () => { if (agreeLoginElement.checked) { loginBtnElement.removeAttribute("disabled"); } else { loginBtnElement.setAttribute("disabled", "disabled"); } }); userNameElement.focus(); userNameElement.addEventListener("keydown", (event) => { if (event.isComposing) { event.preventDefault(); return; } if (event.key === "Enter") { loginBtnElement.click(); event.preventDefault(); } }); twofactorAuthCodeElement.addEventListener("keydown", (event) => { if (event.isComposing) { event.preventDefault(); return; } if (event.key === "Enter") { login2BtnElement.click(); event.preventDefault(); } }); captchaElement.addEventListener("keydown", (event) => { if (event.isComposing) { event.preventDefault(); return; } if (event.key === "Enter") { loginBtnElement.click(); event.preventDefault(); } }); userPasswordElement.addEventListener("keydown", (event) => { if (event.isComposing) { event.preventDefault(); return; } if (event.key === "Enter") { loginBtnElement.click(); event.preventDefault(); } }); let token: string; let needCaptcha: string; 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) => { let messageId; if (data.code === 1) { messageId = 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) { // 两步验证 element.querySelector("#form1").classList.add("fn__none"); element.querySelector("#form2").classList.remove("fn__none"); twofactorAuthCodeElement.focus(); token = data.data.token; return; } hideMessage(messageId); fetchPost("/api/setting/getCloudUser", { token: data.data.token, }, response => { account._afterLogin(response, element); }); }); }); login2BtnElement.addEventListener("click", () => { fetchPost("/api/setting/login2faCloudUser", { code: twofactorAuthCodeElement.value, token, }, response => { fetchPost("/api/setting/getCloudUser", { token: response.data.token, }, userResponse => { account._afterLogin(userResponse, element); }); }); }); }, _afterLogin(userResponse: IWebSocketData, element: Element) { window.siyuan.user = userResponse.data; processSync(); if (element.classList.contains("account") && !needSubscribe("")) { const dialogElement = hasClosestByClassName(element, "b3-dialog--open"); if (dialogElement) { window.siyuan.dialogs.find((item) => { if (item.element.isSameNode(dialogElement)) { item.destroy(); return true; } }); syncGuide(); return; } } element.innerHTML = account.genHTML(); account.bindEvent(element); account.onSetaccount(); }, onSetaccount() { if (repos.element) { repos.element.innerHTML = ""; } if (window.siyuan.config.system.container === "ios") { return; } let html = ""; if (window.siyuan.config.account.displayVIP && window.siyuan.user) { if (window.siyuan.user.userSiYuanProExpireTime === -1) { html = `
${Constants.SIYUAN_IMAGE_VIP}
`; } else if (window.siyuan.user.userSiYuanProExpireTime > 0) { if (window.siyuan.user.userSiYuanSubscriptionPlan === 2) { html = `
`; } else { html = `
`; } } } if (!window.siyuan.user || (window.siyuan.user && window.siyuan.user.userSiYuanSubscriptionStatus === -1)) { html = `
`; } if (window.siyuan.config.account.displayTitle && window.siyuan.user) { window.siyuan.user.userTitles.forEach(item => { html += `
${item.icon}
`; }); } document.getElementById("toolbarVIP").innerHTML = html; } };