monkeytype/public/js/account.js

1283 lines
37 KiB
JavaScript
Raw Normal View History

2020-07-03 08:35:45 +08:00
$(".pageLogin .register input").keyup((e) => {
2020-05-10 09:04:05 +08:00
if (e.key == "Enter") {
signUp();
}
2020-07-03 08:35:45 +08:00
});
2020-07-03 08:35:45 +08:00
$(".pageLogin .register .button").click((e) => {
signUp();
});
2020-05-10 09:04:05 +08:00
2020-07-03 08:35:45 +08:00
$(".pageLogin .login input").keyup((e) => {
if (e.key == "Enter") {
signIn();
}
2020-07-03 08:35:45 +08:00
});
2020-07-03 08:35:45 +08:00
$(".pageLogin .login .button").click((e) => {
signIn();
2020-07-03 08:35:45 +08:00
});
2020-07-03 08:35:45 +08:00
$(".signOut").click((e) => {
signOut();
2020-07-03 08:35:45 +08:00
});
2020-07-03 08:35:45 +08:00
$(".pageAccount .loadMoreButton").click((e) => {
loadMoreLines();
2020-07-03 08:35:45 +08:00
});
2020-07-03 08:35:45 +08:00
$(".pageLogin #forgotPasswordButton").click((e) => {
let email = prompt("Email address");
2020-07-03 08:35:45 +08:00
if (email) {
firebase
.auth()
.sendPasswordResetEmail(email)
.then(function () {
// Email sent.
showNotification("Email sent", 2000);
})
.catch(function (error) {
// An error happened.
showNotification(error.message, 5000);
});
}
2020-07-03 08:35:45 +08:00
});
function showSignOutButton() {
2020-07-03 08:35:45 +08:00
$(".signOut").removeClass("hidden").css("opacity", 1);
}
function hideSignOutButton() {
2020-07-03 08:35:45 +08:00
$(".signOut").css("opacity", 0).addClass("hidden");
}
function signIn() {
2020-07-03 08:35:45 +08:00
$(".pageLogin .preloader").removeClass("hidden");
let email = $(".pageLogin .login input")[0].value;
let password = $(".pageLogin .login input")[1].value;
2020-07-03 08:35:45 +08:00
if ($(".pageLogin .login #rememberMe input").prop("checked")) {
//remember me
2020-07-03 08:35:45 +08:00
firebase
.auth()
.setPersistence(firebase.auth.Auth.Persistence.LOCAL)
.then(function () {
return firebase
.auth()
.signInWithEmailAndPassword(email, password)
.then((e) => {
changePage("test");
})
.catch(function (error) {
showNotification(error.message, 5000);
$(".pageLogin .preloader").addClass("hidden");
});
});
2020-07-03 08:35:45 +08:00
} else {
//dont remember
2020-07-03 08:35:45 +08:00
firebase
.auth()
.setPersistence(firebase.auth.Auth.Persistence.SESSION)
.then(function () {
return firebase
.auth()
.signInWithEmailAndPassword(email, password)
.then((e) => {
changePage("test");
})
.catch(function (error) {
showNotification(error.message, 5000);
$(".pageLogin .preloader").addClass("hidden");
});
});
}
}
2020-05-10 09:04:05 +08:00
let dontCheckUserName = false;
function signUp() {
2020-07-03 08:35:45 +08:00
$(".pageLogin .preloader").removeClass("hidden");
let nname = $(".pageLogin .register input")[0].value;
let email = $(".pageLogin .register input")[1].value;
let password = $(".pageLogin .register input")[2].value;
let passwordVerify = $(".pageLogin .register input")[3].value;
2020-05-10 09:04:05 +08:00
2020-07-03 08:35:45 +08:00
const namecheck = firebase.functions().httpsCallable("checkNameAvailability");
2020-07-03 08:35:45 +08:00
namecheck({ name: nname }).then((d) => {
if (d.data === -1) {
showNotification("Name unavailable", 3000);
2020-07-03 08:35:45 +08:00
$(".pageLogin .preloader").addClass("hidden");
return;
2020-07-03 08:35:45 +08:00
} else if (d.data === -2) {
showNotification(
"Name cannot contain special characters or contain more than 14 characters. Can include _ . and -",
2020-07-03 08:35:45 +08:00
8000
);
$(".pageLogin .preloader").addClass("hidden");
return;
2020-07-03 08:35:45 +08:00
} else if (d.data === 1) {
if (password != passwordVerify) {
showNotification("Passwords do not match", 3000);
2020-07-03 08:35:45 +08:00
$(".pageLogin .preloader").addClass("hidden");
return;
}
2020-07-03 08:35:45 +08:00
firebase
.auth()
.createUserWithEmailAndPassword(email, password)
.then((user) => {
// Account has been created here.
dontCheckUserName = true;
let usr = user.user;
usr
.updateProfile({
displayName: nname,
})
.then(function () {
// Update successful.
2020-07-04 20:08:37 +08:00
firebase
.firestore()
.collection("users")
.doc(usr.uid)
.set({ name: nname }, { merge: true });
usr.sendEmailVerification();
2020-07-03 08:35:45 +08:00
showNotification("Account created", 2000);
$("#menu .icon-button.account .text").text(nname);
try {
firebase.analytics().logEvent("accountCreated", usr.uid);
} catch (e) {
console.log("Analytics unavailable");
}
$(".pageLogin .preloader").addClass("hidden");
changePage("account");
})
.catch(function (error) {
// An error happened.
2020-07-04 20:08:37 +08:00
console.error(error);
2020-07-03 08:35:45 +08:00
usr
.delete()
.then(function () {
// User deleted.
2020-07-04 20:08:37 +08:00
showNotification("An error occured", 2000);
2020-07-03 08:35:45 +08:00
$(".pageLogin .preloader").addClass("hidden");
})
.catch(function (error) {
// An error happened.
$(".pageLogin .preloader").addClass("hidden");
});
});
})
.catch(function (error) {
// Handle Errors here.
var errorCode = error.code;
var errorMessage = error.message;
showNotification(errorMessage, 5000);
$(".pageLogin .preloader").addClass("hidden");
});
}
2020-07-03 08:35:45 +08:00
});
}
function signOut() {
2020-07-03 08:35:45 +08:00
firebase
.auth()
.signOut()
.then(function () {
showNotification("Signed out", 2000);
updateAccountLoginButton();
changePage("login");
dbSnapshot = null;
})
.catch(function (error) {
showNotification(error.message, 5000);
});
}
function sendVerificationEmail() {
let cu = firebase.auth().currentUser;
cu.sendEmailVerification()
.then((e) => {
showNotification("Email sent to " + cu.email, 4000);
})
.catch((e) => {
showNotification("Error: " + e.message, 3000);
console.error(e.message);
});
}
2020-07-03 08:35:45 +08:00
firebase.auth().onAuthStateChanged(function (user) {
2020-05-10 09:04:05 +08:00
if (user) {
// User is signed in.
if (user.emailVerified === false) {
$(".pageAccount .content").prepend(
`<p style="text-align:center">Your account is not verified. Click <a onClick="sendVerificationEmail()">here</a> to resend the verification email.`
);
}
updateAccountLoginButton();
accountIconLoading(true);
2020-07-03 08:35:45 +08:00
db_getUserSnapshot().then((e) => {
console.log("DB snapshot ready");
accountIconLoading(false);
2020-06-12 05:31:06 +08:00
updateFilterTags();
updateCommandsTagsList();
2020-06-24 01:17:08 +08:00
loadActiveTagsFromCookie();
updateResultEditTagsPanelButtons();
2020-07-03 08:35:45 +08:00
config.resultFilters.forEach((filter) => {
if (filter.substring(0, 4) === "tag_" && filter !== "tag_notag") {
toggleFilterButton(filter);
}
2020-07-03 08:35:45 +08:00
});
refreshTagsSettingsSection();
updateDiscordSettingsSection();
if (!configChangedBeforeDb) {
if (cookieConfig === null) {
dbConfigLoaded = true;
accountIconLoading(false);
applyConfig(dbSnapshot.config);
2020-08-08 04:38:51 +08:00
// showNotification('Applying db config',3000);
updateSettingsPage();
saveConfigToCookie(true);
} else if (dbSnapshot.config !== undefined) {
let configsDifferent = false;
Object.keys(config).forEach((key) => {
if (!configsDifferent) {
try {
if (key !== "resultFilters") {
if (Array.isArray(config[key])) {
config[key].forEach((arrval, index) => {
if (arrval != dbSnapshot.config[key][index])
configsDifferent = true;
});
} else {
if (config[key] != dbSnapshot.config[key])
configsDifferent = true;
}
}
} catch (e) {
console.log(e);
configsDifferent = true;
}
}
});
if (configsDifferent) {
dbConfigLoaded = true;
accountIconLoading(false);
applyConfig(dbSnapshot.config);
updateSettingsPage();
saveConfigToCookie(true);
2020-06-28 06:45:24 +08:00
}
}
} else {
accountIconLoading(false);
2020-06-28 06:45:24 +08:00
}
});
2020-05-10 09:04:05 +08:00
var displayName = user.displayName;
var email = user.email;
var emailVerified = user.emailVerified;
var photoURL = user.photoURL;
var isAnonymous = user.isAnonymous;
var uid = user.uid;
var providerData = user.providerData;
// showNotification('Signed in', 1000);
2020-07-03 08:35:45 +08:00
$(".pageLogin .preloader").addClass("hidden");
if (!dontCheckUserName) verifyUsername();
$("#menu .icon-button.account .text").text(displayName);
2020-05-10 09:04:05 +08:00
}
});
var resultHistoryChart = new Chart($(".pageAccount #resultHistoryChart"), {
animationSteps: 60,
2020-07-03 08:35:45 +08:00
type: "line",
2020-05-10 09:04:05 +08:00
data: {
datasets: [
{
label: "wpm",
2020-05-10 09:04:05 +08:00
fill: false,
data: [],
2020-07-03 08:35:45 +08:00
borderColor: "#f44336",
2020-05-10 09:04:05 +08:00
borderWidth: 2,
// trendlineLinear: {
// style: "rgba(244,67,54,.25)",
// lineStyle: "solid",
// width: 1
// }
trendlineLinear: {
style: "rgba(255,105,180, .8)",
lineStyle: "dotted",
2020-07-03 08:35:45 +08:00
width: 4,
},
2020-05-10 09:04:05 +08:00
},
],
},
options: {
tooltips: {
// Disable the on-canvas tooltip
enabled: true,
titleFontFamily: "Roboto Mono",
bodyFontFamily: "Roboto Mono",
intersect: false,
2020-07-03 08:35:45 +08:00
custom: function (tooltip) {
if (!tooltip) return;
// disable displaying the color box;
tooltip.displayColors = false;
2020-07-03 08:35:45 +08:00
},
callbacks: {
// HERE YOU CUSTOMIZE THE LABELS
title: function () {
return;
},
2020-07-03 08:35:45 +08:00
beforeLabel: function (tooltipItem, data) {
let resultData =
data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index];
let label =
`${data.datasets[tooltipItem.datasetIndex].label}: ${
tooltipItem.yLabel
}` +
"\n" +
`acc: ${resultData.acc}` +
"\n\n" +
`mode: ${resultData.mode} `;
if (resultData.mode == "time") {
label += resultData.mode2;
2020-07-03 08:35:45 +08:00
} else if (resultData.mode == "words") {
label += resultData.mode2;
}
2020-05-29 22:58:01 +08:00
let diff = resultData.difficulty;
2020-07-03 08:35:45 +08:00
if (diff == undefined) {
diff = "normal";
2020-05-29 22:58:01 +08:00
}
2020-07-03 08:35:45 +08:00
label += "\n" + `difficulty: ${diff}`;
label +=
"\n" +
`punctuation: ${resultData.punctuation}` +
"\n" +
`language: ${resultData.language}` +
"\n\n" +
`date: ${moment(resultData.timestamp).format("DD MMM YYYY HH:mm")}`;
return label;
},
2020-07-03 08:35:45 +08:00
label: function (tooltipItem, data) {
return;
},
2020-07-03 08:35:45 +08:00
afterLabel: function (tooltipItem, data) {
return;
},
2020-07-03 08:35:45 +08:00
},
},
animation: {
2020-07-03 08:35:45 +08:00
duration: 250,
},
2020-05-10 09:04:05 +08:00
legend: {
2020-05-27 02:59:26 +08:00
display: false,
2020-05-10 09:04:05 +08:00
labels: {
fontFamily: "Roboto Mono",
2020-07-03 08:35:45 +08:00
fontColor: "#ffffff",
},
2020-05-10 09:04:05 +08:00
},
responsive: true,
// maintainAspectRatio: false,
// tooltips: {
// mode: 'index',
// intersect: false,
// },
hover: {
2020-07-03 08:35:45 +08:00
mode: "nearest",
intersect: true,
2020-05-10 09:04:05 +08:00
},
scales: {
2020-07-03 08:35:45 +08:00
xAxes: [
{
ticks: {
fontFamily: "Roboto Mono",
},
type: "time",
bounds: "ticks",
distribution: "series",
display: false,
scaleLabel: {
display: true,
labelString: "Date",
},
},
2020-07-03 08:35:45 +08:00
],
yAxes: [
{
ticks: {
fontFamily: "Roboto Mono",
beginAtZero: true,
},
2020-05-10 09:04:05 +08:00
display: true,
2020-07-03 08:35:45 +08:00
scaleLabel: {
display: false,
labelString: "Words per Minute",
},
2020-05-10 09:04:05 +08:00
},
2020-07-03 08:35:45 +08:00
],
},
2020-07-03 08:35:45 +08:00
},
2020-05-10 09:04:05 +08:00
});
2020-07-03 08:35:45 +08:00
Object.keys(words).forEach((language) => {
$(".pageAccount .content .filterButtons .buttons.languages").append(
`<div class="button" filter="lang_${language}">${language.replace(
2020-07-03 08:35:45 +08:00
"_",
" "
)}</div>`
);
2020-07-09 21:03:21 +08:00
if (language === "english_expanded") {
$(".pageAccount .content .filterButtons .buttons.languages").append(
`<div class="button" filter="lang_english_10k">english 10k</div>`
2020-07-09 21:03:21 +08:00
);
}
2020-07-03 08:35:45 +08:00
});
2020-08-05 02:38:04 +08:00
$(".pageAccount .content .filterButtons .buttons.funbox").append(
`<div class="button" filter="funbox_none">none</div>`
);
getFunboxList().then((funboxModes) => {
funboxModes.forEach((funbox) => {
$(".pageAccount .content .filterButtons .buttons.funbox").append(
`<div class="button" filter="funbox_${funbox.name}">${funbox.name.replace(
/_/g,
" "
)}</div>`
);
});
});
let activeFilters = ["all"];
2020-07-03 08:35:45 +08:00
$(document).ready((e) => {
activeFilters = config.resultFilters;
2020-05-31 22:05:41 +08:00
// console.log(activeFilters);
2020-07-03 08:35:45 +08:00
if (activeFilters.includes("all")) {
toggleFilterButton("all");
} else {
activeFilters.forEach((filter) => {
2020-05-25 04:58:13 +08:00
toggleFilterButton(filter);
2020-07-03 08:35:45 +08:00
});
2020-05-25 04:58:13 +08:00
}
2020-07-03 08:35:45 +08:00
});
2020-07-03 08:35:45 +08:00
function updateFilterTags() {
2020-06-12 05:31:06 +08:00
$(".pageAccount .content .filterButtons .buttons.tags").empty();
2020-07-03 08:35:45 +08:00
if (dbSnapshot.tags.length > 0) {
$(".pageAccount .content .filterButtons .buttonsAndTitle.tags").removeClass(
"hidden"
);
if (config.resultFilters.includes("tag_notag")) {
$(".pageAccount .content .filterButtons .buttons.tags").append(
`<div class="button active" filter="tag_notag">no tag</div>`
);
} else {
$(".pageAccount .content .filterButtons .buttons.tags").append(
`<div class="button" filter="tag_notag">no tag</div>`
);
2020-06-12 05:31:06 +08:00
}
2020-07-03 08:35:45 +08:00
dbSnapshot.tags.forEach((tag) => {
if (config.resultFilters.includes("tag_" + tag.name)) {
$(".pageAccount .content .filterButtons .buttons.tags").append(
`<div class="button active" filter="tag_${tag.id}">${tag.name}</div>`
);
} else {
$(".pageAccount .content .filterButtons .buttons.tags").append(
`<div class="button" filter="tag_${tag.id}">${tag.name}</div>`
);
2020-06-12 05:31:06 +08:00
}
2020-07-03 08:35:45 +08:00
});
} else {
$(".pageAccount .content .filterButtons .buttonsAndTitle.tags").addClass(
"hidden"
);
2020-06-12 05:31:06 +08:00
}
updateActiveFilters();
}
2020-07-03 08:35:45 +08:00
function toggleFilterButton(filter) {
const element = $(
`.pageAccount .content .filterButtons .button[filter=${filter}]`
);
if (element.hasClass("active")) {
//disable that filter
2020-07-03 08:35:45 +08:00
if (filter == "all" || filter == "none") {
return;
2020-07-03 08:35:45 +08:00
} else if (filter == "mode_words") {
2020-05-25 04:58:13 +08:00
// $.each($(`.pageAccount .content .filterButtons .buttons.wordsFilter .button`),(index,obj)=>{
// let f = $(obj).attr('filter')
// disableFilterButton(f)
// })
2020-07-03 08:35:45 +08:00
} else if (filter == "mode_time") {
2020-05-25 04:58:13 +08:00
// $.each($(`.pageAccount .content .filterButtons .buttons.timeFilter .button`),(index,obj)=>{
// let f = $(obj).attr('filter')
// disableFilterButton(f)
// })
2020-07-03 08:35:45 +08:00
} else if (filter == "punc_off") {
2020-05-25 04:58:13 +08:00
enableFilterButton("punc_on");
2020-07-03 08:35:45 +08:00
} else if (filter == "punc_on") {
2020-05-25 04:58:13 +08:00
enableFilterButton("punc_off");
}
disableFilterButton(filter);
2020-07-03 08:35:45 +08:00
disableFilterButton("all");
} else {
//enable that filter
2020-07-03 08:35:45 +08:00
disableFilterButton("none");
if (filter == "all") {
$.each(
$(`.pageAccount .content .filterButtons .button`),
(index, obj) => {
let f = $(obj).attr("filter");
if (
f != "none" &&
f != "date_month" &&
f != "date_week" &&
f != "date_day"
) {
2020-07-03 08:35:45 +08:00
enableFilterButton(f);
}
}
2020-07-03 08:35:45 +08:00
);
} else if (filter == "none") {
disableFilterButton("all");
$.each(
$(`.pageAccount .content .filterButtons .button`),
(index, obj) => {
let f = $(obj).attr("filter");
if (f != "none") {
disableFilterButton(f);
}
}
2020-07-03 08:35:45 +08:00
);
} else if (
filter == "date_all" ||
filter == "date_month" ||
filter == "date_week" ||
filter == "date_day"
) {
disableFilterButton("date_all");
disableFilterButton("date_month");
disableFilterButton("date_week");
disableFilterButton("date_day");
enableFilterButton(filter);
}
2020-05-25 04:58:13 +08:00
// else if(filter == "mode_words"){
// $.each($(`.pageAccount .content .filterButtons .buttons.wordsFilter .button`),(index,obj)=>{
// let f = $(obj).attr('filter');
// enableFilterButton(f);
// })
// }else if(filter == "mode_time"){
// $.each($(`.pageAccount .content .filterButtons .buttons.timeFilter .button`),(index,obj)=>{
// let f = $(obj).attr('filter');
// enableFilterButton(f);
// })
// }else if(['10','25','50','100','200'].includes(filter)){
// enableFilterButton('words');
// }else if(['15','30','60','120'].includes(filter)){
// enableFilterButton('time');
// }
enableFilterButton(filter);
}
updateActiveFilters();
}
2020-07-03 08:35:45 +08:00
function disableFilterButton(filter) {
const element = $(
`.pageAccount .content .filterButtons .button[filter=${filter}]`
);
element.removeClass("active");
}
2020-07-03 08:35:45 +08:00
function enableFilterButton(filter) {
const element = $(
`.pageAccount .content .filterButtons .button[filter=${filter}]`
);
element.addClass("active");
}
2020-07-03 08:35:45 +08:00
function updateActiveFilters() {
activeFilters = [];
2020-07-03 08:35:45 +08:00
$.each($(".pageAccount .filterButtons .button"), (i, obj) => {
if ($(obj).hasClass("active")) {
activeFilters.push($(obj).attr("filter"));
}
2020-07-03 08:35:45 +08:00
});
refreshAccountPage();
}
2020-07-03 08:35:45 +08:00
function showChartPreloader() {
$(".pageAccount .group.chart .preloader").stop(true, true).animate(
{
opacity: 1,
},
125
);
2020-05-25 04:58:13 +08:00
}
2020-07-03 08:35:45 +08:00
function hideChartPreloader() {
$(".pageAccount .group.chart .preloader").stop(true, true).animate(
{
opacity: 0,
},
125
);
2020-05-25 04:58:13 +08:00
}
2020-07-03 08:35:45 +08:00
$(".pageAccount .filterButtons").click(".button", (e) => {
const filter = $(e.target).attr("filter");
toggleFilterButton(filter);
config.resultFilters = activeFilters;
saveConfigToCookie();
2020-07-03 08:35:45 +08:00
});
$(".pageAccount #currentConfigFilter").click((e) => {
let disableGroups = [
"globalFilters",
"difficultyFilters",
"modeFilters",
"punctuationFilter",
"wordsFilter",
"timeFilter",
"languages",
"tags",
2020-08-05 02:38:04 +08:00
"funbox",
];
disableGroups.forEach((group) => {
$.each(
$(`.pageAccount .filterButtons .buttons.${group} .button`),
(index, button) => {
let fl = $(button).attr("filter");
disableFilterButton(fl);
config.resultFilters = config.resultFilters.filter((f) => f !== fl);
}
);
});
updateActiveFilters();
//rewrite this monstrosity soon pls
config.resultFilters.push(`difficulty_${config.difficulty}`);
toggleFilterButton(`difficulty_${config.difficulty}`);
config.resultFilters.push(`mode_${config.mode}`);
toggleFilterButton(`mode_${config.mode}`);
if (config.mode === "time") {
config.resultFilters.push(`time_${config.time}`);
toggleFilterButton(`time_${config.time}`);
} else if (config.mode === "words") {
config.resultFilters.push(`words_${config.words}`);
toggleFilterButton(`words_${config.words}`);
}
let puncfilter = config.punctuation ? "punc_on" : "punc_off";
config.resultFilters.push(puncfilter);
toggleFilterButton(puncfilter);
config.resultFilters.push(`lang_${config.language}`);
toggleFilterButton(`lang_${config.language}`);
2020-08-05 02:38:04 +08:00
config.resultFilters.push(`funbox_${activeFunBox}`);
toggleFilterButton(`funbox_${activeFunBox}`);
let activeTags = [];
try {
dbSnapshot.tags.forEach((tag) => {
if (tag.active === true) {
activeTags.push(tag.id);
}
});
} catch (e) {}
if (activeTags.length > 0) {
activeTags.forEach((tag) => {
config.resultFilters.push(`tag_${tag}`);
toggleFilterButton(`tag_${tag}`);
});
} else {
config.resultFilters.push(`tag_notag`);
toggleFilterButton(`tag_notag`);
}
saveConfigToCookie();
});
let filteredResults = [];
let visibleTableLines = 0;
2020-07-03 08:35:45 +08:00
function loadMoreLines() {
if (filteredResults == [] || filteredResults.length == 0) return;
for (let i = visibleTableLines; i < visibleTableLines + 10; i++) {
result = filteredResults[i];
2020-07-03 08:35:45 +08:00
if (result == undefined) continue;
let withpunc = "";
2020-06-24 07:56:55 +08:00
// if (result.punctuation) {
// withpunc = '<br>punctuation';
// }
// if (result.blindMode) {
// withpunc = '<br>blind';
// }
let diff = result.difficulty;
2020-07-03 08:35:45 +08:00
if (diff == undefined) {
diff = "normal";
}
let raw = result.rawWpm;
2020-07-03 08:35:45 +08:00
if (raw == undefined) {
raw = "-";
}
2020-07-03 08:35:45 +08:00
let icons = `<span aria-label="${result.language.replace(
"_",
" "
)}" data-balloon-pos="up"><i class="fas fa-fw fa-globe-americas"></i></span>`;
2020-07-03 08:35:45 +08:00
if (diff === "normal") {
icons += `<span aria-label="${result.difficulty}" data-balloon-pos="up"><i class="far fa-fw fa-star"></i></span>`;
2020-07-03 08:35:45 +08:00
} else if (diff === "expert") {
icons += `<span aria-label="${result.difficulty}" data-balloon-pos="up"><i class="fas fa-fw fa-star-half-alt"></i></span>`;
2020-07-03 08:35:45 +08:00
} else if (diff === "master") {
icons += `<span aria-label="${result.difficulty}" data-balloon-pos="up"><i class="fas fa-fw fa-star"></i></span>`;
}
2020-07-03 08:35:45 +08:00
if (result.punctuation) {
icons += `<span aria-label="punctuation" data-balloon-pos="up" style="font-weight:900">!?</span>`;
}
2020-07-03 08:35:45 +08:00
if (result.blindMode) {
icons += `<span aria-label="blind mode" data-balloon-pos="up"><i class="fas fa-fw fa-eye-slash"></i></span>`;
}
2020-08-05 02:38:04 +08:00
if (result.funbox !== "none" && result.funbox !== undefined) {
icons += `<span aria-label="${result.funbox.replace(
/_/g,
" "
)}" data-balloon-pos="up"><i class="fas fa-gamepad"></i></span>`;
}
let tagNames = "";
2020-07-03 08:35:45 +08:00
if (result.tags !== undefined && result.tags.length > 0) {
result.tags.forEach((tag) => {
dbSnapshot.tags.forEach((snaptag) => {
if (tag === snaptag.id) {
tagNames += snaptag.name + ", ";
}
2020-07-03 08:35:45 +08:00
});
});
tagNames = tagNames.substring(0, tagNames.length - 2);
}
// if(tagNames !== ""){
// icons += `<span aria-label="${tagNames}" data-balloon-pos="up"><i class="fas fa-fw fa-tag"></i></span>`;
// }
let restags;
2020-07-03 08:35:45 +08:00
if (result.tags === undefined) {
restags = "[]";
} else {
restags = JSON.stringify(result.tags);
}
let tagIcons = `<span id="resultEditTags" resultId="${result.id}" tags='${restags}' aria-label="no tags" data-balloon-pos="up" style="opacity: .25"><i class="fas fa-fw fa-tag"></i></span>`;
2020-07-03 08:35:45 +08:00
if (tagNames !== "") {
if (result.tags !== undefined && result.tags.length > 1) {
tagIcons = `<span id="resultEditTags" resultId="${result.id}" tags='${restags}' aria-label="${tagNames}" data-balloon-pos="up"><i class="fas fa-fw fa-tags"></i></span>`;
2020-07-03 08:35:45 +08:00
} else {
tagIcons = `<span id="resultEditTags" resultId="${result.id}" tags='${restags}' aria-label="${tagNames}" data-balloon-pos="up"><i class="fas fa-fw fa-tag"></i></span>`;
}
}
2020-07-31 06:03:47 +08:00
let consistency = result.consistency;
if (consistency === undefined) {
consistency = "-";
} else {
consistency += "%";
}
$(".pageAccount .history table tbody").append(`
<tr>
2020-07-08 02:14:49 +08:00
<td>${result.wpm}</td>
<td>${raw}</td>
<td>${result.acc}%</td>
<td>${result.correctChars}</td>
<td>${result.incorrectChars}</td>
2020-07-31 06:03:47 +08:00
<td>${consistency}</td>
<td>${result.mode} ${result.mode2}${withpunc}</td>
<td class="infoIcons">${icons}</td>
<td>${tagIcons}</td>
2020-07-03 08:35:45 +08:00
<td>${moment(result.timestamp).format("DD MMM YYYY<br>HH:mm")}</td>
</tr>`);
}
2020-07-03 08:35:45 +08:00
visibleTableLines += 10;
if (visibleTableLines >= filteredResults.length) {
$(".pageAccount .loadMoreButton").addClass("hidden");
} else {
$(".pageAccount .loadMoreButton").removeClass("hidden");
}
}
2020-05-10 09:04:05 +08:00
function refreshAccountPage() {
2020-07-03 08:35:45 +08:00
function cont() {
let chartData = [];
visibleTableLines = 0;
2020-07-03 08:35:45 +08:00
2020-05-10 09:04:05 +08:00
let topWpm = 0;
2020-07-03 08:35:45 +08:00
let topMode = "";
let testRestarts = 0;
2020-05-20 03:27:08 +08:00
let totalWpm = 0;
let testCount = 0;
2020-05-10 09:04:05 +08:00
let last10 = 0;
let wpmLast10total = 0;
let totalAcc = 0;
let totalAcc10 = 0;
let rawWpm = {
total: 0,
count: 0,
last10Total: 0,
last10Count: 0,
2020-07-03 08:35:45 +08:00
max: 0,
};
let totalSeconds = 0;
let totalSecondsFiltered = 0;
2020-07-03 08:35:45 +08:00
2020-07-31 06:03:47 +08:00
let totalCons = 0;
let totalCons10 = 0;
let consCount = 0;
filteredResults = [];
$(".pageAccount .history table tbody").empty();
2020-07-03 08:35:45 +08:00
dbSnapshot.results.forEach((result) => {
let tt = 0;
2020-07-03 08:35:45 +08:00
if (result.testDuration == undefined) {
//test finished before testDuration field was introduced - estimate
2020-07-03 08:35:45 +08:00
if (result.mode == "time") {
tt = parseFloat(result.mode2);
2020-07-03 08:35:45 +08:00
} else if (result.mode == "words") {
tt = (parseFloat(result.mode2) / parseFloat(result.wpm)) * 60;
}
2020-07-03 08:35:45 +08:00
} else {
tt = parseFloat(result.testDuration);
}
2020-07-03 08:35:45 +08:00
if (result.incompleteTestSeconds != undefined) {
tt += result.incompleteTestSeconds;
2020-07-03 08:35:45 +08:00
} else if (result.restartCount != undefined && result.restartCount > 0) {
tt += (tt / 4) * result.restartCount;
}
totalSeconds += tt;
2020-05-25 04:58:13 +08:00
// console.log(result);
//apply filters
2020-05-29 22:58:01 +08:00
let resdiff = result.difficulty;
2020-07-03 08:35:45 +08:00
if (resdiff == undefined) {
2020-05-29 22:58:01 +08:00
resdiff = "normal";
}
2020-07-03 08:35:45 +08:00
if (!activeFilters.includes("difficulty_" + resdiff)) return;
if (!activeFilters.includes("mode_" + result.mode)) return;
if (result.mode == "time") {
2020-05-25 04:58:13 +08:00
let timefilter = "time_custom";
2020-07-03 08:35:45 +08:00
if ([15, 30, 60, 120].includes(parseInt(result.mode2))) {
timefilter = "time_" + result.mode2;
2020-05-25 04:58:13 +08:00
}
2020-07-03 08:35:45 +08:00
if (!activeFilters.includes(timefilter)) return;
} else if (result.mode == "words") {
2020-05-25 04:58:13 +08:00
let wordfilter = "words_custom";
2020-07-03 08:35:45 +08:00
if ([10, 25, 50, 100, 200].includes(parseInt(result.mode2))) {
wordfilter = "words_" + result.mode2;
2020-05-25 04:58:13 +08:00
}
2020-07-03 08:35:45 +08:00
if (!activeFilters.includes(wordfilter)) return;
}
2020-05-25 04:58:13 +08:00
if (!activeFilters.includes("lang_" + result.language)) return;
2020-05-25 04:58:13 +08:00
let puncfilter = "punc_off";
2020-07-03 08:35:45 +08:00
if (result.punctuation) {
2020-05-25 04:58:13 +08:00
puncfilter = "punc_on";
}
2020-07-03 08:35:45 +08:00
if (!activeFilters.includes(puncfilter)) return;
2020-08-05 02:38:04 +08:00
if (result.funbox === "none" || result.funbox === undefined) {
if (!activeFilters.includes("funbox_none")) return;
} else {
if (!activeFilters.includes("funbox_" + result.funbox)) return;
}
2020-07-03 08:35:45 +08:00
if (dbSnapshot.tags.length > 0) {
2020-08-05 02:38:04 +08:00
//check if the user has any tags defined
//check if that result has any tags
2020-07-03 08:35:45 +08:00
if (result.tags !== undefined && result.tags.length > 0) {
2020-06-12 05:31:06 +08:00
let found = false;
2020-07-03 08:35:45 +08:00
result.tags.forEach((tag) => {
//check if any of the tags inside the result are active
2020-07-03 08:35:45 +08:00
if (activeFilters.includes("tag_" + tag)) found = true;
//check if a tag doesnt exist and tag_notag is active
2020-07-03 08:35:45 +08:00
if (
!dbSnapshot.tags.map((t) => t.id).includes(tag) &&
activeFilters.includes("tag_notag")
)
found = true;
});
if (!found) return;
} else {
if (!activeFilters.includes("tag_notag")) return;
2020-06-12 05:31:06 +08:00
}
}
2020-06-22 07:43:38 +08:00
let timeSinceTest = Math.abs(result.timestamp - Date.now()) / 1000;
let datehide = true;
2020-07-03 08:35:45 +08:00
if (
activeFilters.includes("date_all") ||
2020-06-22 07:43:38 +08:00
(activeFilters.includes("date_day") && timeSinceTest <= 86400) ||
(activeFilters.includes("date_week") && timeSinceTest <= 604800) ||
(activeFilters.includes("date_month") && timeSinceTest <= 18144000)
2020-07-03 08:35:45 +08:00
) {
2020-06-22 07:43:38 +08:00
datehide = false;
}
2020-07-03 08:35:45 +08:00
if (datehide) return;
2020-06-22 07:43:38 +08:00
filteredResults.push(result);
//filters done
2020-06-22 07:43:38 +08:00
//=======================================
tt = 0;
2020-07-14 04:35:42 +08:00
if (result.testDuration == undefined) {
//test finished before testDuration field was introduced - estimate
2020-07-03 08:35:45 +08:00
if (result.mode == "time") {
tt = parseFloat(result.mode2);
2020-07-03 08:35:45 +08:00
} else if (result.mode == "words") {
tt = (parseFloat(result.mode2) / parseFloat(result.wpm)) * 60;
}
2020-07-03 08:35:45 +08:00
} else {
2020-07-14 04:35:42 +08:00
tt = parseFloat(result.testDuration);
}
2020-07-14 04:35:42 +08:00
if (result.incompleteTestSeconds != undefined) {
tt += result.incompleteTestSeconds;
} else if (result.restartCount != undefined && result.restartCount > 0) {
2020-07-03 08:35:45 +08:00
tt += (tt / 4) * result.restartCount;
}
totalSecondsFiltered += tt;
2020-07-03 08:35:45 +08:00
if (last10 < 10) {
last10++;
wpmLast10total += result.wpm;
totalAcc10 += result.acc;
2020-07-31 06:03:47 +08:00
result.consistency !== undefined
? (totalCons10 += result.consistency)
: 0;
}
testCount++;
2020-07-31 06:03:47 +08:00
if (result.consistency !== undefined) {
consCount++;
totalCons += result.consistency;
}
2020-07-03 08:35:45 +08:00
if (result.rawWpm != null) {
if (rawWpm.last10Count < 10) {
rawWpm.last10Count++;
rawWpm.last10Total += result.rawWpm;
}
rawWpm.total += result.rawWpm;
rawWpm.count++;
2020-07-03 08:35:45 +08:00
if (result.rawWpm > rawWpm.max) {
rawWpm.max = result.rawWpm;
}
}
totalAcc += result.acc;
if (result.restartCount != undefined) {
testRestarts += result.restartCount;
}
chartData.push({
x: result.timestamp,
y: result.wpm,
acc: result.acc,
mode: result.mode,
mode2: result.mode2,
punctuation: result.punctuation,
language: result.language,
2020-05-29 22:58:01 +08:00
timestamp: result.timestamp,
2020-07-03 08:35:45 +08:00
difficulty: result.difficulty,
});
2020-05-10 09:04:05 +08:00
if (result.wpm > topWpm) {
let puncsctring = result.punctuation ? ",<br>with punctuation" : "";
2020-05-10 09:04:05 +08:00
topWpm = result.wpm;
topMode = result.mode + " " + result.mode2 + puncsctring;
2020-05-10 09:04:05 +08:00
}
2020-05-20 03:27:08 +08:00
totalWpm += result.wpm;
2020-07-03 08:35:45 +08:00
});
loadMoreLines();
////////
if (themeColors.main == "") {
refreshThemeColorObject();
}
resultHistoryChart.options.scales.xAxes[0].ticks.minor.fontColor =
themeColors.sub;
resultHistoryChart.options.scales.yAxes[0].ticks.minor.fontColor =
themeColors.sub;
resultHistoryChart.data.datasets[0].borderColor = themeColors.main;
resultHistoryChart.options.legend.labels.fontColor = themeColors.sub;
resultHistoryChart.data.datasets[0].trendlineLinear.style = themeColors.sub;
resultHistoryChart.data.datasets[0].data = chartData;
2020-05-10 09:04:05 +08:00
2020-07-03 08:35:45 +08:00
if (chartData == [] || chartData.length == 0) {
$(".pageAccount .group.noDataError").removeClass("hidden");
$(".pageAccount .group.chart").addClass("hidden");
$(".pageAccount .group.history").addClass("hidden");
$(".pageAccount .triplegroup.stats").addClass("hidden");
} else {
$(".pageAccount .group.noDataError").addClass("hidden");
$(".pageAccount .group.chart").removeClass("hidden");
$(".pageAccount .group.history").removeClass("hidden");
$(".pageAccount .triplegroup.stats").removeClass("hidden");
}
// moment
// .utc(moment.duration(totalSeconds, "seconds").asMilliseconds())
// .format("HH:mm:ss")
2020-07-31 09:28:51 +08:00
let th = Math.floor(totalSeconds / 3600);
let tm = Math.floor((totalSeconds % 3600) / 60);
let ts = Math.floor((totalSeconds % 3600) % 60);
$(".pageAccount .timeTotal .val").text(`
2020-07-31 09:28:51 +08:00
${th < 10 ? "0" + th : th}:${tm < 10 ? "0" + tm : tm}:${
ts < 10 ? "0" + ts : ts
}
`);
//moment
// .utc(moment.duration(totalSecondsFiltered, "seconds").asMilliseconds())
// .format("HH:mm:ss")
2020-07-31 09:28:51 +08:00
let tfh = Math.floor(totalSecondsFiltered / 3600);
let tfm = Math.floor((totalSecondsFiltered % 3600) / 60);
let tfs = Math.floor((totalSecondsFiltered % 3600) % 60);
$(".pageAccount .timeTotalFiltered .val").text(`
2020-07-31 09:28:51 +08:00
${tfh < 10 ? "0" + tfh : tfh}:${tfm < 10 ? "0" + tfm : tfm}:${
tfs < 10 ? "0" + tfs : tfs
}
`);
2020-05-10 09:04:05 +08:00
$(".pageAccount .highestWpm .val").text(topWpm);
2020-07-03 08:35:45 +08:00
$(".pageAccount .averageWpm .val").text(Math.round(totalWpm / testCount));
$(".pageAccount .averageWpm10 .val").text(
Math.round(wpmLast10total / last10)
);
$(".pageAccount .highestRaw .val").text(rawWpm.max);
2020-07-03 08:35:45 +08:00
$(".pageAccount .averageRaw .val").text(
Math.round(rawWpm.total / rawWpm.count)
);
$(".pageAccount .averageRaw10 .val").text(
Math.round(rawWpm.last10Total / rawWpm.last10Count)
);
$(".pageAccount .highestWpm .mode").html(topMode);
2020-05-10 09:04:05 +08:00
$(".pageAccount .testsTaken .val").text(testCount);
2020-07-03 08:35:45 +08:00
$(".pageAccount .avgAcc .val").text(Math.round(totalAcc / testCount) + "%");
$(".pageAccount .avgAcc10 .val").text(
Math.round(totalAcc10 / last10) + "%"
);
2020-07-31 07:31:07 +08:00
// console.log(totalCons10);
// console.log(last10);
2020-07-31 06:03:47 +08:00
if (totalCons == 0 || totalCons == undefined) {
$(".pageAccount .avgCons .val").text("-");
$(".pageAccount .avgCons10 .val").text("-");
} else {
$(".pageAccount .avgCons .val").text(
Math.round(totalCons / consCount) + "%"
);
$(".pageAccount .avgCons10 .val").text(
Math.round(totalCons10 / Math.min(last10, consCount)) + "%"
);
}
2020-07-03 08:35:45 +08:00
$(".pageAccount .testsStarted .val").text(`${testCount + testRestarts}`);
$(".pageAccount .testsCompleted .val").text(
2020-07-03 08:35:45 +08:00
`${testCount}(${Math.floor(
(testCount / (testCount + testRestarts)) * 100
)}%)`
);
$(".pageAccount .avgRestart .val").text(
2020-07-03 08:35:45 +08:00
(testRestarts / testCount).toFixed(1)
);
// if(testCount == 0){
// $('.pageAccount .group.chart').fadeOut(125);
// $('.pageAccount .triplegroup.stats').fadeOut(125);
// $('.pageAccount .group.history').fadeOut(125);
// }else{
// $('.pageAccount .group.chart').fadeIn(125);
// $('.pageAccount .triplegroup.stats').fadeIn(125);
// $('.pageAccount .group.history').fadeIn(125);
// }
// let favMode = testModes.words10;
// let favModeName = 'words10';
// $.each(testModes, (key, mode) => {
// if (mode.length > favMode.length) {
// favMode = mode;
// favModeName = key;
// }
// })
// if (favModeName == 'words10' && testModes.words10.length == 0) {
2020-07-03 08:35:45 +08:00
// //new user
// $(".pageAccount .favouriteTest .val").text(`-`);
// } else {
// $(".pageAccount .favouriteTest .val").text(`${favModeName} (${Math.floor((favMode.length/testCount) * 100)}%)`);
// }
2020-05-10 09:04:05 +08:00
2020-07-03 08:35:45 +08:00
if (resultHistoryChart.data.datasets[0].length > 0) {
resultHistoryChart.options.plugins.trendlineLinear = true;
2020-07-03 08:35:45 +08:00
} else {
resultHistoryChart.options.plugins.trendlineLinear = false;
}
2020-07-03 08:35:45 +08:00
resultHistoryChart.update({ duration: 0 });
swapElements($(".pageAccount .preloader"), $(".pageAccount .content"), 250);
}
2020-05-10 09:04:05 +08:00
2020-06-09 03:12:01 +08:00
if (dbSnapshot === null) {
2020-05-15 09:57:57 +08:00
// console.log('no db snap');
// db_getUserResults().then(data => {
// if(!data) return;
// dbSnapshot = data;
// cont();
// })
} else {
2020-05-15 09:57:57 +08:00
// console.log('using db snap');
cont();
}
}
2020-07-03 08:35:45 +08:00
function showResultEditTagsPanel() {
if ($("#resultEditTagsPanelWrapper").hasClass("hidden")) {
$("#resultEditTagsPanelWrapper")
2020-07-03 08:35:45 +08:00
.stop(true, true)
.css("opacity", 0)
.removeClass("hidden")
.animate({ opacity: 1 }, 125);
}
}
2020-07-03 08:35:45 +08:00
function hideResultEditTagsPanel() {
if (!$("#resultEditTagsPanelWrapper").hasClass("hidden")) {
$("#resultEditTagsPanelWrapper")
2020-07-03 08:35:45 +08:00
.stop(true, true)
.css("opacity", 1)
.animate(
{
2020-07-03 08:35:45 +08:00
opacity: 0,
},
100,
(e) => {
$("#resultEditTagsPanelWrapper").addClass("hidden");
}
);
}
}
2020-07-03 08:35:45 +08:00
$(document).on("click", ".pageAccount .group.history #resultEditTags", (f) => {
if (dbSnapshot.tags.length > 0) {
let resultid = $(f.target).parents("span").attr("resultid");
let tags = $(f.target).parents("span").attr("tags");
$("#resultEditTagsPanel").attr("resultid", resultid);
$("#resultEditTagsPanel").attr("tags", tags);
updateActiveResultEditTagsPanelButtons(JSON.parse(tags));
showResultEditTagsPanel();
}
2020-07-03 08:35:45 +08:00
});
2020-07-03 08:35:45 +08:00
$(document).on("click", "#resultEditTagsPanelWrapper .button.tag", (f) => {
$(f.target).toggleClass("active");
});
2020-07-03 08:35:45 +08:00
$("#resultEditTagsPanelWrapper").click((e) => {
if ($(e.target).attr("id") === "resultEditTagsPanelWrapper") {
hideResultEditTagsPanel();
}
2020-07-03 08:35:45 +08:00
});
2020-07-03 08:35:45 +08:00
function updateResultEditTagsPanelButtons() {
$("#resultEditTagsPanel .buttons").empty();
2020-07-03 08:35:45 +08:00
dbSnapshot.tags.forEach((tag) => {
$("#resultEditTagsPanel .buttons").append(
`<div class="button tag" tagid="${tag.id}">${tag.name}</div>`
);
});
}
2020-07-03 08:35:45 +08:00
function updateActiveResultEditTagsPanelButtons(active) {
if (active === []) return;
$.each($("#resultEditTagsPanel .buttons .button"), (index, obj) => {
let tagid = $(obj).attr("tagid");
if (active.includes(tagid)) {
$(obj).addClass("active");
} else {
$(obj).removeClass("active");
}
// active.forEach(activetagid => {
// if(activetagid === tagid){
// $(obj).addClass('active');
// }else{
// $(obj).removeClass('active');
// }
// })
});
}
2020-07-03 08:35:45 +08:00
$("#resultEditTagsPanel .confirmButton").click((f) => {
let resultid = $("#resultEditTagsPanel").attr("resultid");
let oldtags = JSON.parse($("#resultEditTagsPanel").attr("tags"));
let newtags = [];
2020-07-03 08:35:45 +08:00
$.each($("#resultEditTagsPanel .buttons .button"), (index, obj) => {
let tagid = $(obj).attr("tagid");
if ($(obj).hasClass("active")) {
newtags.push(tagid);
}
});
showBackgroundLoader();
hideResultEditTagsPanel();
2020-07-03 08:35:45 +08:00
updateResultTags({
uid: firebase.auth().currentUser.uid,
tags: newtags,
resultid: resultid,
}).then((r) => {
hideBackgroundLoader();
2020-07-03 08:35:45 +08:00
if (r.data.resultCode === 1) {
showNotification("Tags updated", 1000);
dbSnapshot.results.forEach((result) => {
if (result.id === resultid) {
result.tags = newtags;
}
2020-07-03 08:35:45 +08:00
});
refreshAccountPage();
2020-07-03 08:35:45 +08:00
} else {
showNotification("Error updating tags", 3000);
}
});
2020-07-03 08:35:45 +08:00
});