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.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 ``;
},
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;
}
};