From 27fff39cc3ef9daa535e70e6c69e11f71c4eab6c Mon Sep 17 00:00:00 2001 From: Jack Date: Wed, 31 Mar 2021 19:09:16 +0100 Subject: [PATCH] moved account to a module. part of #495 --- gulpfile.js | 8 +- src/js/account-controller.js | 276 +++++- src/js/account.js | 851 +----------------- src/js/account/all-time-stats.js | 2 + src/js/account/pb-tables.js | 234 +++++ src/js/account/result-filters.js | 452 ++++++++++ src/js/account/verification-controller.js | 23 + src/js/db.js | 2 +- .../{account-icon.js => account-button.js} | 0 src/js/exports.js | 2 + src/js/global-dependencies.js | 5 +- src/js/result-filters.js | 149 --- src/js/script.js | 177 +--- src/js/test/test-logic.js | 2 +- src/js/ui.js | 111 +++ 15 files changed, 1143 insertions(+), 1151 deletions(-) create mode 100644 src/js/account/pb-tables.js create mode 100644 src/js/account/result-filters.js create mode 100644 src/js/account/verification-controller.js rename src/js/elements/{account-icon.js => account-button.js} (100%) delete mode 100644 src/js/result-filters.js diff --git a/gulpfile.js b/gulpfile.js index c06ce22e3..89321cc93 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -90,7 +90,6 @@ const refactoredSrc = [ "./src/js/cloud-functions.js", "./src/js/misc.js", "./src/js/layouts.js", - "./src/js/result-filters.js", "./src/js/sound.js", "./src/js/theme-colors.js", "./src/js/chart-controller.js", @@ -108,11 +107,15 @@ const refactoredSrc = [ "./src/js/settings.js", "./src/js/account/all-time-stats.js", + "./src/js/account/pb-tables.js", + "./src/js/account/result-filters.js", + "./src/js/account/verification-controller.js", + "./src/js/account.js", "./src/js/elements/monkey.js", "./src/js/elements/notifications.js", "./src/js/elements/leaderboards.js", - "./src/js/elements/account-icon.js", + "./src/js/elements/account-button.js", "./src/js/elements/loader.js", "./src/js/elements/sign-out-button.js", @@ -160,7 +163,6 @@ const refactoredSrc = [ //the order of files is important const globalSrc = [ "./src/js/global-dependencies.js", - "./src/js/account.js", "./src/js/script.js", "./src/js/exports.js", ]; diff --git a/src/js/account-controller.js b/src/js/account-controller.js index 072d77441..4ed197bcb 100644 --- a/src/js/account-controller.js +++ b/src/js/account-controller.js @@ -1,4 +1,18 @@ import * as Notifications from "./notifications"; +import * as UpdateConfig from "./config"; +import * as AccountButton from "./account-button"; +import * as Account from "./account"; +import * as CommandlineLists from "./commandline-lists"; +import * as VerificationController from "./verification-controller"; +import * as Misc from "./misc"; +import * as Settings from "./settings"; +import * as ChallengeController from "./challenge-controller"; +import Config from "./config"; +import * as CloudFunctions from "./cloud-functions"; +import * as AllTimeStats from "./all-time-stats"; +import * as DB from "./db"; +import * as TestLogic from "./test-logic"; +import * as UI from "./ui"; var gmailProvider = new firebase.auth.GoogleAuthProvider(); @@ -17,7 +31,7 @@ export function signIn() { .auth() .signInWithEmailAndPassword(email, password) .then((e) => { - // changePage("test"); + // UI.changePage("test"); }) .catch(function (error) { Notifications.add(error.message, -1); @@ -34,7 +48,7 @@ export function signIn() { .auth() .signInWithEmailAndPassword(email, password) .then((e) => { - // changePage("test"); + // UI.changePage("test"); }) .catch(function (error) { Notifications.add(error.message, -1); @@ -96,19 +110,255 @@ export function signOut() { .signOut() .then(function () { Notifications.add("Signed out", 0, 2); - setTimeout(() => { - location.reload(); - }, 1000); - - //TODO Bring this back when possible - - // AllTimeStats.clear(); - // Settings.hideAccountSection(); - // AccountIcon.update(); - // changePage("login"); - // DB.setSnapshot(null); + AllTimeStats.clear(); + Settings.hideAccountSection(); + AccountButton.update(); + UI.changePage("login"); + DB.setSnapshot(null); }) .catch(function (error) { Notifications.add(error.message, -1); }); } + +function signUp() { + $(".pageLogin .register .button").addClass("disabled"); + $(".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; + + if (password != passwordVerify) { + Notifications.add("Passwords do not match", 0, 3); + $(".pageLogin .preloader").addClass("hidden"); + $(".pageLogin .register .button").removeClass("disabled"); + return; + } + + CloudFunctions.namecheck({ name: nname }).then((d) => { + if (d.data.resultCode === -1) { + Notifications.add("Name unavailable", -1); + $(".pageLogin .preloader").addClass("hidden"); + $(".pageLogin .register .button").removeClass("disabled"); + return; + } else if (d.data.resultCode === -2) { + Notifications.add( + "Name cannot contain special characters or contain more than 14 characters. Can include _ . and -", + -1 + ); + $(".pageLogin .preloader").addClass("hidden"); + $(".pageLogin .register .button").removeClass("disabled"); + return; + } else if (d.data.resultCode === 1) { + firebase + .auth() + .createUserWithEmailAndPassword(email, password) + .then((user) => { + // Account has been created here. + // dontCheckUserName = true; + let usr = user.user; + usr + .updateProfile({ + displayName: nname, + }) + .then(async function () { + // Update successful. + await firebase + .firestore() + .collection("users") + .doc(usr.uid) + .set({ name: nname }, { merge: true }); + CloudFunctions.reserveName({ name: nname, uid: usr.uid }).catch( + (e) => { + console.error("Could not reserve name " + e); + throw "Could not reserve name"; + } + ); + usr.sendEmailVerification(); + AllTimeStats.clear(); + Notifications.add("Account created", 1, 3); + $("#menu .icon-button.account .text").text(nname); + try { + firebase.analytics().logEvent("accountCreated", usr.uid); + } catch (e) { + console.log("Analytics unavailable"); + } + $(".pageLogin .preloader").addClass("hidden"); + DB.setSnapshot({ + results: [], + personalBests: {}, + tags: [], + globalStats: { + time: undefined, + started: undefined, + completed: undefined, + }, + }); + if (TestLogic.notSignedInLastResult !== null) { + TestLogic.setNotSignedInUid(usr.uid); + CloudFunctions.testCompleted({ + uid: usr.uid, + obj: TestLogic.notSignedInLastResult, + }); + DB.getSnapshot().results.push(TestLogic.notSignedInLastResult); + } + UI.changePage("account"); + usr.sendEmailVerification(); + $(".pageLogin .register .button").removeClass("disabled"); + }) + .catch(function (error) { + // An error happened. + $(".pageLogin .register .button").removeClass("disabled"); + console.error(error); + usr + .delete() + .then(function () { + // User deleted. + Notifications.add( + "Account not created. " + error.message, + -1 + ); + $(".pageLogin .preloader").addClass("hidden"); + }) + .catch(function (error) { + // An error happened. + $(".pageLogin .preloader").addClass("hidden"); + Notifications.add( + "Something went wrong. " + error.message, + -1 + ); + console.error(error); + }); + }); + }) + .catch(function (error) { + // Handle Errors here. + $(".pageLogin .register .button").removeClass("disabled"); + Notifications.add(error.message, -1); + $(".pageLogin .preloader").addClass("hidden"); + }); + } else { + $(".pageLogin .preloader").addClass("hidden"); + Notifications.add( + "Something went wrong when checking name: " + d.data.message, + -1 + ); + } + }); +} + +$(".pageLogin #forgotPasswordButton").click((e) => { + let email = prompt("Email address"); + if (email) { + firebase + .auth() + .sendPasswordResetEmail(email) + .then(function () { + // Email sent. + Notifications.add("Email sent", 1, 2); + }) + .catch(function (error) { + // An error happened. + Notifications.add(error.message, -1); + }); + } +}); + +$(".pageLogin .login input").keyup((e) => { + if (e.key == "Enter") { + UpdateConfig.setChangedBeforeDb(false); + signIn(); + } +}); + +$(".pageLogin .login .button.signIn").click((e) => { + UpdateConfig.setChangedBeforeDb(false); + signIn(); +}); + +$(".pageLogin .login .button.signInWithGoogle").click((e) => { + UpdateConfig.setChangedBeforeDb(false); + signInWithGoogle(); +}); + +$(".signOut").click((e) => { + signOut(); +}); + +firebase.auth().onAuthStateChanged(function (user) { + if (user) { + // User is signed in. + $(".pageAccount .content p.accountVerificatinNotice").remove(); + if (user.emailVerified === false) { + $(".pageAccount .content").prepend( + `

Your account is not verified. Click here to resend the verification email.` + ); + } + AccountButton.update(); + AccountButton.loading(true); + Account.getDataAndInit(); + 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; + $(".pageLogin .preloader").addClass("hidden"); + $("#menu .icon-button.account .text").text(displayName); + + // showFavouriteThemesAtTheTop(); + CommandlineLists.updateThemeCommands(); + + let text = "Account created on " + user.metadata.creationTime; + + const date1 = new Date(user.metadata.creationTime); + const date2 = new Date(); + const diffTime = Math.abs(date2 - date1); + const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)); + + text += ` (${diffDays} day${diffDays != 1 ? "s" : ""} ago)`; + + $(".pageAccount .group.createdDate").text(text); + + if (VerificationController.data !== null) { + VerificationController.verify(user); + } + } + let theme = Misc.findGetParameter("customTheme"); + if (theme !== null) { + try { + theme = theme.split(","); + UpdateConfig.setCustomThemeColors(theme); + Notifications.add("Custom theme applied.", 1); + } catch (e) { + Notifications.add( + "Something went wrong. Reverting to default custom colors.", + 0 + ); + UpdateConfig.setCustomThemeColors(Config.defaultConfig.customThemeColors); + } + UpdateConfig.setCustomTheme(true); + Settings.setCustomThemeInputs(); + } + if (/challenge_.+/g.test(window.location.pathname)) { + Notifications.add("Loading challenge", 0); + let challengeName = window.location.pathname.split("_")[1]; + setTimeout(() => { + ChallengeController.setup(challengeName); + }, 1000); + } +}); + +$(".pageLogin .register input").keyup((e) => { + if ($(".pageLogin .register .button").hasClass("disabled")) return; + if (e.key == "Enter") { + signUp(); + } +}); + +$(".pageLogin .register .button").click((e) => { + if ($(".pageLogin .register .button").hasClass("disabled")) return; + signUp(); +}); diff --git a/src/js/account.js b/src/js/account.js index 8617d1404..fc4e58146 100644 --- a/src/js/account.js +++ b/src/js/account.js @@ -1,208 +1,25 @@ -// let dontCheckUserName = false; +import * as DB from "./db"; +import * as Misc from "./misc"; +import * as CloudFunctions from "./cloud-functions"; +import * as Notifications from "./notifications"; +import * as ResultFilters from "./result-filters"; +import * as ThemeColors from "./theme-colors"; +import * as ChartController from "./chart-controller"; +import Config, * as UpdateConfig from "./config"; +import * as AccountButton from "./account-button"; +import * as TestLogic from "./test-logic"; +import * as PaceCaret from "./pace-caret"; +import * as TagController from "./tag-controller"; +import * as UI from "./ui"; +import * as CommandlineLists from "./commandline-lists"; +import * as MiniResultChart from "./mini-result-chart"; +import * as ResultTagsPopup from "./result-tags-popup"; +import * as Settings from "./settings"; +import * as ThemePicker from "./theme-picker"; +import * as AllTimeStats from "./all-time-stats"; +import * as PbTables from "./pb-tables"; -function signUp() { - $(".pageLogin .register .button").addClass("disabled"); - $(".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; - - if (password != passwordVerify) { - Notifications.add("Passwords do not match", 0, 3); - $(".pageLogin .preloader").addClass("hidden"); - $(".pageLogin .register .button").removeClass("disabled"); - return; - } - - CloudFunctions.namecheck({ name: nname }).then((d) => { - if (d.data.resultCode === -1) { - Notifications.add("Name unavailable", -1); - $(".pageLogin .preloader").addClass("hidden"); - $(".pageLogin .register .button").removeClass("disabled"); - return; - } else if (d.data.resultCode === -2) { - Notifications.add( - "Name cannot contain special characters or contain more than 14 characters. Can include _ . and -", - -1 - ); - $(".pageLogin .preloader").addClass("hidden"); - $(".pageLogin .register .button").removeClass("disabled"); - return; - } else if (d.data.resultCode === 1) { - firebase - .auth() - .createUserWithEmailAndPassword(email, password) - .then((user) => { - // Account has been created here. - // dontCheckUserName = true; - let usr = user.user; - usr - .updateProfile({ - displayName: nname, - }) - .then(async function () { - // Update successful. - await firebase - .firestore() - .collection("users") - .doc(usr.uid) - .set({ name: nname }, { merge: true }); - CloudFunctions.reserveName({ name: nname, uid: usr.uid }).catch( - (e) => { - console.error("Could not reserve name " + e); - throw "Could not reserve name"; - } - ); - usr.sendEmailVerification(); - AllTimeStats.clear(); - Notifications.add("Account created", 1, 3); - $("#menu .icon-button.account .text").text(nname); - try { - firebase.analytics().logEvent("accountCreated", usr.uid); - } catch (e) { - console.log("Analytics unavailable"); - } - $(".pageLogin .preloader").addClass("hidden"); - DB.setSnapshot({ - results: [], - personalBests: {}, - tags: [], - globalStats: { - time: undefined, - started: undefined, - completed: undefined, - }, - }); - if (TestLogic.notSignedInLastResult !== null) { - TestLogic.setNotSignedInUid(usr.uid); - CloudFunctions.testCompleted({ - uid: usr.uid, - obj: TestLogic.notSignedInLastResult, - }); - DB.getSnapshot().results.push(TestLogic.notSignedInLastResult); - } - changePage("account"); - usr.sendEmailVerification(); - $(".pageLogin .register .button").removeClass("disabled"); - }) - .catch(function (error) { - // An error happened. - $(".pageLogin .register .button").removeClass("disabled"); - console.error(error); - usr - .delete() - .then(function () { - // User deleted. - Notifications.add( - "Account not created. " + error.message, - -1 - ); - $(".pageLogin .preloader").addClass("hidden"); - }) - .catch(function (error) { - // An error happened. - $(".pageLogin .preloader").addClass("hidden"); - Notifications.add( - "Something went wrong. " + error.message, - -1 - ); - console.error(error); - }); - }); - }) - .catch(function (error) { - // Handle Errors here. - $(".pageLogin .register .button").removeClass("disabled"); - Notifications.add(error.message, -1); - $(".pageLogin .preloader").addClass("hidden"); - }); - } else { - $(".pageLogin .preloader").addClass("hidden"); - Notifications.add( - "Something went wrong when checking name: " + d.data.message, - -1 - ); - } - }); -} - -firebase.auth().onAuthStateChanged(function (user) { - if (user) { - // User is signed in. - $(".pageAccount .content p.accountVerificatinNotice").remove(); - if (user.emailVerified === false) { - $(".pageAccount .content").prepend( - `

Your account is not verified. Click here to resend the verification email.` - ); - } - AccountButton.update(); - AccountButton.loading(true); - getAccountDataAndInit(); - 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; - $(".pageLogin .preloader").addClass("hidden"); - $("#menu .icon-button.account .text").text(displayName); - - // showFavouriteThemesAtTheTop(); - CommandlineLists.updateThemeCommands(); - - let text = "Account created on " + user.metadata.creationTime; - - const date1 = new Date(user.metadata.creationTime); - const date2 = new Date(); - const diffTime = Math.abs(date2 - date1); - const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)); - - text += ` (${diffDays} day${diffDays != 1 ? "s" : ""} ago)`; - - $(".pageAccount .group.createdDate").text(text); - - if (verifyUserWhenLoggedIn !== null) { - Notifications.add("Verifying", 0, 3); - verifyUserWhenLoggedIn.uid = user.uid; - CloudFunctions.verifyUser(verifyUserWhenLoggedIn).then((data) => { - if (data.data.status === 1) { - Notifications.add(data.data.message, 1); - DB.getSnapshot().discordId = data.data.did; - Settings.updateDiscordSection(); - } else { - Notifications.add(data.data.message, -1); - } - }); - } - } - let theme = Misc.findGetParameter("customTheme"); - if (theme !== null) { - try { - theme = theme.split(","); - UpdateConfig.setCustomThemeColors(theme); - Notifications.add("Custom theme applied.", 1); - } catch (e) { - Notifications.add( - "Something went wrong. Reverting to default custom colors.", - 0 - ); - UpdateConfig.setCustomThemeColors(Config.defaultConfig.customThemeColors); - } - UpdateConfig.setCustomTheme(true); - Settings.setCustomThemeInputs(); - } - if (/challenge_.+/g.test(window.location.pathname)) { - Notifications.add("Loading challenge", 0); - let challengeName = window.location.pathname.split("_")[1]; - setTimeout(() => { - ChallengeController.setup(challengeName); - }, 1000); - } -}); - -function getAccountDataAndInit() { +export function getDataAndInit() { DB.initSnapshot() .then(async (e) => { let snap = DB.getSnapshot(); @@ -311,7 +128,7 @@ function getAccountDataAndInit() { $(".pageLogin").hasClass("active") || window.location.pathname === "/account" ) { - changePage("account"); + UI.changePage("account"); } ThemePicker.refreshButtons(); AccountButton.loading(false); @@ -333,562 +150,6 @@ function getAccountDataAndInit() { }); } -$(document).on("click", ".pageAccount .miniResultChartButton", (event) => { - console.log("updating"); - let filteredId = $(event.currentTarget).attr("filteredResultsId"); - if (filteredId === undefined) return; - MiniResultChart.updateData(filteredResults[filteredId].chartData); - MiniResultChart.show(); - MiniResultChart.updatePosition( - event.pageX - $(".pageAccount .miniResultChartWrapper").outerWidth(), - event.pageY + 30 - ); -}); - -Misc.getLanguageList().then((languages) => { - languages.forEach((language) => { - $( - ".pageAccount .content .filterButtons .buttonsAndTitle.languages .buttons" - ).append( - `

${language.replace( - "_", - " " - )}
` - ); - }); -}); - -$( - ".pageAccount .content .filterButtons .buttonsAndTitle.funbox .buttons" -).append(`
none
`); -Misc.getFunboxList().then((funboxModes) => { - funboxModes.forEach((funbox) => { - $( - ".pageAccount .content .filterButtons .buttonsAndTitle.funbox .buttons" - ).append( - `
${funbox.name.replace( - /_/g, - " " - )}
` - ); - }); -}); - -function toggleFilter(group, filter) { - try { - if (group === "date") { - Object.keys(ResultFilters.getGroup("date")).forEach((date) => { - ResultFilters.setFilter("date", date, false); - }); - } - ResultFilters.toggleFilter(group, filter); - ResultFilters.save(); - } catch (e) { - Notifications.add( - "Something went wrong toggling filter. Reverting to defaults", - 0 - ); - console.log("toggling filter error"); - console.error(e); - ResultFilters.reset(); - showActiveFilters(); - } -} - -function showActiveFilters() { - let aboveChartDisplay = {}; - Object.keys(ResultFilters.getFilters()).forEach((group) => { - aboveChartDisplay[group] = { - all: true, - array: [], - }; - Object.keys(ResultFilters.getGroup(group)).forEach((filter) => { - if (ResultFilters.getFilter(group, filter)) { - aboveChartDisplay[group].array.push(filter); - } else { - aboveChartDisplay[group].all = false; - } - let buttonEl; - if (group === "date") { - buttonEl = $( - `.pageAccount .group.topFilters .filterGroup[group="${group}"] .button[filter="${filter}"]` - ); - } else { - buttonEl = $( - `.pageAccount .group.filterButtons .filterGroup[group="${group}"] .button[filter="${filter}"]` - ); - } - if (ResultFilters.getFilter(group, filter)) { - buttonEl.addClass("active"); - } else { - buttonEl.removeClass("active"); - } - }); - }); - - function addText(group) { - let ret = ""; - ret += "
"; - if (group == "difficulty") { - ret += ``; - } else if (group == "mode") { - ret += ``; - } else if (group == "punctuation") { - ret += `!?`; - } else if (group == "numbers") { - ret += `15`; - } else if (group == "words") { - ret += ``; - } else if (group == "time") { - ret += ``; - } else if (group == "date") { - ret += ``; - } else if (group == "tags") { - ret += ``; - } else if (group == "language") { - ret += ``; - } else if (group == "funbox") { - ret += ``; - } - if (aboveChartDisplay[group].all) { - ret += "all"; - } else { - if (group === "tags") { - ret += aboveChartDisplay.tags.array - .map((id) => { - if (id == "none") return id; - let name = DB.getSnapshot().tags.filter((t) => t.id == id)[0]; - if (name !== undefined) { - return DB.getSnapshot().tags.filter((t) => t.id == id)[0].name; - } - }) - .join(", "); - } else { - ret += aboveChartDisplay[group].array.join(", ").replace(/_/g, " "); - } - } - ret += "
"; - return ret; - } - - let chartString = ""; - - //date - chartString += addText("date"); - chartString += `
`; - - //mode - chartString += addText("mode"); - chartString += `
`; - - //time - if (aboveChartDisplay.mode.array.includes("time")) { - chartString += addText("time"); - chartString += `
`; - } - - //words - if (aboveChartDisplay.mode.array.includes("words")) { - chartString += addText("words"); - chartString += `
`; - } - - //diff - chartString += addText("difficulty"); - chartString += `
`; - - //punc - chartString += addText("punctuation"); - chartString += `
`; - - //numbers - chartString += addText("numbers"); - chartString += `
`; - - //language - chartString += addText("language"); - chartString += `
`; - - //funbox - chartString += addText("funbox"); - chartString += `
`; - - //tags - chartString += addText("tags"); - - $(".pageAccount .group.chart .above").html(chartString); - - refreshAccountPage(); -} - -// function showChartPreloader() { -// $(".pageAccount .group.chart .preloader").stop(true, true).animate( -// { -// opacity: 1, -// }, -// 125 -// ); -// } - -// function hideChartPreloader() { -// $(".pageAccount .group.chart .preloader").stop(true, true).animate( -// { -// opacity: 0, -// }, -// 125 -// ); -// } - -$(".pageAccount .topFilters .button.allFilters").click((e) => { - Object.keys(ResultFilters.getFilters()).forEach((group) => { - Object.keys(ResultFilters.getGroup(group)).forEach((filter) => { - if (group === "date") { - ResultFilters.setFilter(group, filter, false); - } else { - ResultFilters.setFilter(group, filter, true); - } - }); - }); - ResultFilters.setFilter("date", "all", true); - showActiveFilters(); - ResultFilters.save(); -}); - -$(".pageAccount .topFilters .button.currentConfigFilter").click((e) => { - Object.keys(ResultFilters.getFilters()).forEach((group) => { - Object.keys(ResultFilters.getGroup(group)).forEach((filter) => { - ResultFilters.setFilter(group, filter, false); - }); - }); - - ResultFilters.setFilter("difficulty", Config.difficulty, true); - ResultFilters.setFilter("mode", Config.mode, true); - if (Config.mode === "time") { - ResultFilters.setFilter("time", Config.time, true); - } else if (Config.mode === "words") { - ResultFilters.setFilter("words", Config.words, true); - } else if (Config.mode === "quote") { - Object.keys(ResultFilters.getGroup("quoteLength")).forEach((ql) => { - ResultFilters.setFilter("quoteLength", ql, true); - }); - } - if (Config.punctuation) { - ResultFilters.setFilter("punctuation", "on", true); - } else { - ResultFilters.setFilter("punctuation", "off", true); - } - if (Config.numbers) { - ResultFilters.setFilter("numbers", "on", true); - } else { - ResultFilters.setFilter("numbers", "off", true); - } - if (Config.mode === "quote" && /english.*/.test(Config.language)) { - ResultFilters.setFilter("language", "english", true); - } else { - ResultFilters.setFilter("language", Config.language, true); - } - ResultFilters.setFilter("funbox", true); - ResultFilters.setFilter("tags", "none", true); - DB.getSnapshot().tags.forEach((tag) => { - if (tag.active === true) { - ResultFilters.setFilter("tags", "none", false); - ResultFilters.setFilter("tags", tag.id, true); - } - }); - - ResultFilters.setFilter("date", "all", true); - showActiveFilters(); - ResultFilters.save(); - console.log(ResultFilters.getFilters()); -}); - -$(".pageAccount .topFilters .button.toggleAdvancedFilters").click((e) => { - $(".pageAccount .filterButtons").slideToggle(250); - $(".pageAccount .topFilters .button.toggleAdvancedFilters").toggleClass( - "active" - ); -}); - -$( - ".pageAccount .filterButtons .buttonsAndTitle .buttons, .pageAccount .group.topFilters .buttonsAndTitle.testDate .buttons" -).click(".button", (e) => { - const filter = $(e.target).attr("filter"); - const group = $(e.target).parents(".buttons").attr("group"); - if ($(e.target).hasClass("allFilters")) { - Object.keys(ResultFilters.getFilters()).forEach((group) => { - Object.keys(ResultFilters.getGroup(group)).forEach((filter) => { - if (group === "date") { - ResultFilters.setFilter(group, filter, false); - } else { - ResultFilters.setFilter(group, filter, true); - } - }); - }); - ResultFilters.setFilter("date", "all", true); - } else if ($(e.target).hasClass("noFilters")) { - Object.keys(ResultFilters.getFilters()).forEach((group) => { - if (group !== "date") { - Object.keys(ResultFilters.getGroup(group)).forEach((filter) => { - ResultFilters.setFilter(group, filter, false); - }); - } - }); - } else { - if (e.shiftKey) { - Object.keys(ResultFilters.getGroup(group)).forEach((filter) => { - ResultFilters.setFilter(group, filter, false); - }); - ResultFilters.setFilter(group, filter, true); - } else { - toggleFilter(group, filter); - } - } - showActiveFilters(); - ResultFilters.save(); -}); - -function fillPbTables() { - $(".pageAccount .timePbTable tbody").html(` - - 15 - - - - - - - - - - - 30 - - - - - - - - - - - 60 - - - - - - - - - - - 120 - - - - - - - - - - `); - $(".pageAccount .wordsPbTable tbody").html(` - - 10 - - - - - - - - - - - 25 - - - - - - - - - - - 50 - - - - - - - - - - - 100 - - - - - - - - - - `); - - const pb = DB.getSnapshot().personalBests; - let pbData; - let text; - - text = ""; - try { - pbData = pb.time[15].sort((a, b) => b.wpm - a.wpm)[0]; - text += ` - 15 - ${pbData.wpm} - ${pbData.raw === undefined ? "-" : pbData.raw} - ${pbData.acc === undefined ? "-" : pbData.acc + "%"} - - ${pbData.consistency === undefined ? "-" : pbData.consistency + "%"} - - `; - } catch (e) { - text += ` - 15 - - - - - - - - - `; - } - try { - pbData = pb.time[30].sort((a, b) => b.wpm - a.wpm)[0]; - text += ` - 30 - ${pbData.wpm} - ${pbData.raw === undefined ? "-" : pbData.raw} - ${pbData.acc === undefined ? "-" : pbData.acc + "%"} - - ${pbData.consistency === undefined ? "-" : pbData.consistency + "%"} - - `; - } catch (e) { - text += ` - 30 - - - - - - - - - `; - } - try { - pbData = pb.time[60].sort((a, b) => b.wpm - a.wpm)[0]; - text += ` - 60 - ${pbData.wpm} - ${pbData.raw === undefined ? "-" : pbData.raw} - ${pbData.acc === undefined ? "-" : pbData.acc + "%"} - - ${pbData.consistency === undefined ? "-" : pbData.consistency + "%"} - - `; - } catch (e) { - text += ` - 60 - - - - - - - - - `; - } - try { - pbData = pb.time[120].sort((a, b) => b.wpm - a.wpm)[0]; - text += ` - 120 - ${pbData.wpm} - ${pbData.raw === undefined ? "-" : pbData.raw} - ${pbData.acc === undefined ? "-" : pbData.acc + "%"} - - ${pbData.consistency === undefined ? "-" : pbData.consistency + "%"} - - `; - } catch (e) { - text += ` - 120 - - - - - - - - - `; - } - $(".pageAccount .timePbTable tbody").html(text); - - text = ""; - try { - pbData = pb.words[10].sort((a, b) => b.wpm - a.wpm)[0]; - text += ` - 10 - ${pbData.wpm} - ${pbData.raw === undefined ? "-" : pbData.raw} - ${pbData.acc === undefined ? "-" : pbData.acc + "%"} - - ${pbData.consistency === undefined ? "-" : pbData.consistency + "%"} - - `; - } catch (e) { - text += ` - 10 - - - - - - - - - `; - } - try { - pbData = pb.words[25].sort((a, b) => b.wpm - a.wpm)[0]; - text += ` - 25 - ${pbData.wpm} - ${pbData.raw === undefined ? "-" : pbData.raw} - ${pbData.acc === undefined ? "-" : pbData.acc + "%"} - - ${pbData.consistency === undefined ? "-" : pbData.consistency + "%"} - - `; - } catch (e) { - text += ` - 25 - - - - - - - - - `; - } - try { - pbData = pb.words[50].sort((a, b) => b.wpm - a.wpm)[0]; - text += ` - 50 - ${pbData.wpm} - ${pbData.raw === undefined ? "-" : pbData.raw} - ${pbData.acc === undefined ? "-" : pbData.acc + "%"} - - ${pbData.consistency === undefined ? "-" : pbData.consistency + "%"} - - `; - } catch (e) { - text += ` - 50 - - - - - - - - - `; - } - try { - pbData = pb.words[100].sort((a, b) => b.wpm - a.wpm)[0]; - text += ` - 100 - ${pbData.wpm} - ${pbData.raw === undefined ? "-" : pbData.raw} - ${pbData.acc === undefined ? "-" : pbData.acc + "%"} - - ${pbData.consistency === undefined ? "-" : pbData.consistency + "%"} - - `; - } catch (e) { - text += ` - 100 - - - - - - - - - `; - } - $(".pageAccount .wordsPbTable tbody").html(text); -} - let filteredResults = []; let visibleTableLines = 0; @@ -1023,13 +284,13 @@ function loadMoreLines() { let totalSecondsFiltered = 0; -function refreshAccountPage() { +export function update() { function cont() { ThemeColors.update(); ChartController.accountHistory.updateColors(); ChartController.accountActivity.updateColors(); AllTimeStats.update(); - fillPbTables(); + PbTables.update(); let chartData = []; let wpmChartData = []; @@ -1210,7 +471,7 @@ function refreshAccountPage() { console.log(result); console.error(e); ResultFilters.reset(); - showActiveFilters(); + ResultFilters.updateActive(); } //filters done @@ -1520,10 +781,10 @@ function refreshAccountPage() { } else if (DB.getSnapshot().results === undefined) { DB.getUserResults().then((d) => { if (d) { - showActiveFilters(); + ResultFilters.updateActive(); } else { setTimeout(() => { - changePage(""); + UI.changePage(""); }, 500); } }); @@ -1546,56 +807,18 @@ $(".pageAccount .toggleChartStyle").click((e) => { UpdateConfig.toggleChartStyle(); }); -$(".pageLogin .register input").keyup((e) => { - if ($(".pageLogin .register .button").hasClass("disabled")) return; - if (e.key == "Enter") { - signUp(); - } -}); - -$(".pageLogin .register .button").click((e) => { - if ($(".pageLogin .register .button").hasClass("disabled")) return; - signUp(); -}); - -$(".pageLogin .login input").keyup((e) => { - if (e.key == "Enter") { - UpdateConfig.setChangedBeforeDb(false); - AccountController.signIn(); - } -}); - -$(".pageLogin .login .button.signIn").click((e) => { - UpdateConfig.setChangedBeforeDb(false); - AccountController.signIn(); -}); - -$(".pageLogin .login .button.signInWithGoogle").click((e) => { - UpdateConfig.setChangedBeforeDb(false); - AccountController.signInWithGoogle(); -}); - -$(".signOut").click((e) => { - AccountController.signOut(); -}); - $(".pageAccount .loadMoreButton").click((e) => { loadMoreLines(); }); -$(".pageLogin #forgotPasswordButton").click((e) => { - let email = prompt("Email address"); - if (email) { - firebase - .auth() - .sendPasswordResetEmail(email) - .then(function () { - // Email sent. - Notifications.add("Email sent", 1, 2); - }) - .catch(function (error) { - // An error happened. - Notifications.add(error.message, -1); - }); - } +$(document).on("click", ".pageAccount .miniResultChartButton", (event) => { + console.log("updating"); + let filteredId = $(event.currentTarget).attr("filteredResultsId"); + if (filteredId === undefined) return; + MiniResultChart.updateData(filteredResults[filteredId].chartData); + MiniResultChart.show(); + MiniResultChart.updatePosition( + event.pageX - $(".pageAccount .miniResultChartWrapper").outerWidth(), + event.pageY + 30 + ); }); diff --git a/src/js/account/all-time-stats.js b/src/js/account/all-time-stats.js index 7ccdae4a0..4983f35b9 100644 --- a/src/js/account/all-time-stats.js +++ b/src/js/account/all-time-stats.js @@ -1,3 +1,5 @@ +import * as DB from "./db"; + export function clear() { $(".pageAccount .globalTimeTyping .val").text(`-`); $(".pageAccount .globalTestsStarted .val").text(`-`); diff --git a/src/js/account/pb-tables.js b/src/js/account/pb-tables.js new file mode 100644 index 000000000..c6972593d --- /dev/null +++ b/src/js/account/pb-tables.js @@ -0,0 +1,234 @@ +import * as DB from "./db"; + +export function update() { + $(".pageAccount .timePbTable tbody").html(` + + 15 + - + - + - + - + + + 30 + - + - + - + - + + + 60 + - + - + - + - + + + 120 + - + - + - + - + + `); + $(".pageAccount .wordsPbTable tbody").html(` + + 10 + - + - + - + - + + + 25 + - + - + - + - + + + 50 + - + - + - + - + + + 100 + - + - + - + - + + `); + + const pb = DB.getSnapshot().personalBests; + let pbData; + let text; + + text = ""; + try { + pbData = pb.time[15].sort((a, b) => b.wpm - a.wpm)[0]; + text += ` + 15 + ${pbData.wpm} + ${pbData.raw === undefined ? "-" : pbData.raw} + ${pbData.acc === undefined ? "-" : pbData.acc + "%"} + + ${pbData.consistency === undefined ? "-" : pbData.consistency + "%"} + + `; + } catch (e) { + text += ` + 15 + - + - + - + - + `; + } + try { + pbData = pb.time[30].sort((a, b) => b.wpm - a.wpm)[0]; + text += ` + 30 + ${pbData.wpm} + ${pbData.raw === undefined ? "-" : pbData.raw} + ${pbData.acc === undefined ? "-" : pbData.acc + "%"} + + ${pbData.consistency === undefined ? "-" : pbData.consistency + "%"} + + `; + } catch (e) { + text += ` + 30 + - + - + - + - + `; + } + try { + pbData = pb.time[60].sort((a, b) => b.wpm - a.wpm)[0]; + text += ` + 60 + ${pbData.wpm} + ${pbData.raw === undefined ? "-" : pbData.raw} + ${pbData.acc === undefined ? "-" : pbData.acc + "%"} + + ${pbData.consistency === undefined ? "-" : pbData.consistency + "%"} + + `; + } catch (e) { + text += ` + 60 + - + - + - + - + `; + } + try { + pbData = pb.time[120].sort((a, b) => b.wpm - a.wpm)[0]; + text += ` + 120 + ${pbData.wpm} + ${pbData.raw === undefined ? "-" : pbData.raw} + ${pbData.acc === undefined ? "-" : pbData.acc + "%"} + + ${pbData.consistency === undefined ? "-" : pbData.consistency + "%"} + + `; + } catch (e) { + text += ` + 120 + - + - + - + - + `; + } + $(".pageAccount .timePbTable tbody").html(text); + + text = ""; + try { + pbData = pb.words[10].sort((a, b) => b.wpm - a.wpm)[0]; + text += ` + 10 + ${pbData.wpm} + ${pbData.raw === undefined ? "-" : pbData.raw} + ${pbData.acc === undefined ? "-" : pbData.acc + "%"} + + ${pbData.consistency === undefined ? "-" : pbData.consistency + "%"} + + `; + } catch (e) { + text += ` + 10 + - + - + - + - + `; + } + try { + pbData = pb.words[25].sort((a, b) => b.wpm - a.wpm)[0]; + text += ` + 25 + ${pbData.wpm} + ${pbData.raw === undefined ? "-" : pbData.raw} + ${pbData.acc === undefined ? "-" : pbData.acc + "%"} + + ${pbData.consistency === undefined ? "-" : pbData.consistency + "%"} + + `; + } catch (e) { + text += ` + 25 + - + - + - + - + `; + } + try { + pbData = pb.words[50].sort((a, b) => b.wpm - a.wpm)[0]; + text += ` + 50 + ${pbData.wpm} + ${pbData.raw === undefined ? "-" : pbData.raw} + ${pbData.acc === undefined ? "-" : pbData.acc + "%"} + + ${pbData.consistency === undefined ? "-" : pbData.consistency + "%"} + + `; + } catch (e) { + text += ` + 50 + - + - + - + - + `; + } + try { + pbData = pb.words[100].sort((a, b) => b.wpm - a.wpm)[0]; + text += ` + 100 + ${pbData.wpm} + ${pbData.raw === undefined ? "-" : pbData.raw} + ${pbData.acc === undefined ? "-" : pbData.acc + "%"} + + ${pbData.consistency === undefined ? "-" : pbData.consistency + "%"} + + `; + } catch (e) { + text += ` + 100 + - + - + - + - + `; + } + $(".pageAccount .wordsPbTable tbody").html(text); +} diff --git a/src/js/account/result-filters.js b/src/js/account/result-filters.js new file mode 100644 index 000000000..8e0c33f2b --- /dev/null +++ b/src/js/account/result-filters.js @@ -0,0 +1,452 @@ +import * as Misc from "./misc"; +import * as DB from "./db"; +import Config from "./config"; +import * as Notifications from "./notifications"; +import * as Account from "./account"; +import * as Funbox from "./funbox"; + +let defaultResultFilters = { + difficulty: { + normal: true, + expert: true, + master: true, + }, + mode: { + words: true, + time: true, + quote: true, + custom: true, + }, + words: { + 10: true, + 25: true, + 50: true, + 100: true, + 200: true, + custom: true, + }, + time: { + 15: true, + 30: true, + 60: true, + 120: true, + custom: true, + }, + quoteLength: { + short: true, + medium: true, + long: true, + thicc: true, + }, + punctuation: { + on: true, + off: true, + }, + numbers: { + on: true, + off: true, + }, + date: { + last_day: false, + last_week: false, + last_month: false, + all: true, + }, + tags: { + none: true, + }, + language: {}, + funbox: { + none: true, + }, +}; + +export let filters; + +Promise.all([Misc.getLanguageList(), Misc.getFunboxList()]).then((values) => { + let languages = values[0]; + let funboxModes = values[1]; + languages.forEach((language) => { + defaultResultFilters.language[language] = true; + }); + funboxModes.forEach((funbox) => { + defaultResultFilters.funbox[funbox.name] = true; + }); + filters = defaultResultFilters; +}); + +export function getFilters() { + return filters; +} + +export function getGroup(group) { + return filters[group]; +} + +// export function setFilter(group, filter, value) { +// filters[group][filter] = value; +// } + +export function getFilter(group, filter) { + return filters[group][filter]; +} + +// export function toggleFilter(group, filter) { +// filters[group][filter] = !filters[group][filter]; +// } + +export function loadTags(tags) { + tags.forEach((tag) => { + defaultResultFilters[tag.id] = true; + }); +} + +export function save() { + Misc.setCookie("resultFilters", JSON.stringify(filters), 365); +} + +export function load() { + // let newTags = $.cookie("activeTags"); + try { + let newResultFilters = Misc.getCookie("resultFilters"); + if (newResultFilters !== undefined && newResultFilters !== "") { + filters = JSON.parse(newResultFilters); + save(); + } else { + filters = defaultResultFilters; + save(); + } + } catch { + filters = defaultResultFilters; + save(); + } +} + +export function reset() { + filters = defaultResultFilters; + save(); +} + +load(); + +export function updateActive() { + let aboveChartDisplay = {}; + Object.keys(getFilters()).forEach((group) => { + aboveChartDisplay[group] = { + all: true, + array: [], + }; + Object.keys(getGroup(group)).forEach((filter) => { + if (getFilter(group, filter)) { + aboveChartDisplay[group].array.push(filter); + } else { + aboveChartDisplay[group].all = false; + } + let buttonEl; + if (group === "date") { + buttonEl = $( + `.pageAccount .group.topFilters .filterGroup[group="${group}"] .button[filter="${filter}"]` + ); + } else { + buttonEl = $( + `.pageAccount .group.filterButtons .filterGroup[group="${group}"] .button[filter="${filter}"]` + ); + } + if (getFilter(group, filter)) { + buttonEl.addClass("active"); + } else { + buttonEl.removeClass("active"); + } + }); + }); + + function addText(group) { + let ret = ""; + ret += "
"; + if (group == "difficulty") { + ret += ``; + } else if (group == "mode") { + ret += ``; + } else if (group == "punctuation") { + ret += `!?`; + } else if (group == "numbers") { + ret += `15`; + } else if (group == "words") { + ret += ``; + } else if (group == "time") { + ret += ``; + } else if (group == "date") { + ret += ``; + } else if (group == "tags") { + ret += ``; + } else if (group == "language") { + ret += ``; + } else if (group == "funbox") { + ret += ``; + } + if (aboveChartDisplay[group].all) { + ret += "all"; + } else { + if (group === "tags") { + ret += aboveChartDisplay.tags.array + .map((id) => { + if (id == "none") return id; + let name = DB.getSnapshot().tags.filter((t) => t.id == id)[0]; + if (name !== undefined) { + return DB.getSnapshot().tags.filter((t) => t.id == id)[0].name; + } + }) + .join(", "); + } else { + ret += aboveChartDisplay[group].array.join(", ").replace(/_/g, " "); + } + } + ret += "
"; + return ret; + } + + let chartString = ""; + + //date + chartString += addText("date"); + chartString += `
`; + + //mode + chartString += addText("mode"); + chartString += `
`; + + //time + if (aboveChartDisplay.mode.array.includes("time")) { + chartString += addText("time"); + chartString += `
`; + } + + //words + if (aboveChartDisplay.mode.array.includes("words")) { + chartString += addText("words"); + chartString += `
`; + } + + //diff + chartString += addText("difficulty"); + chartString += `
`; + + //punc + chartString += addText("punctuation"); + chartString += `
`; + + //numbers + chartString += addText("numbers"); + chartString += `
`; + + //language + chartString += addText("language"); + chartString += `
`; + + //funbox + chartString += addText("funbox"); + chartString += `
`; + + //tags + chartString += addText("tags"); + + $(".pageAccount .group.chart .above").html(chartString); + + Account.update(); +} + +export function toggle(group, filter) { + try { + if (group === "date") { + Object.keys(getGroup("date")).forEach((date) => { + filters["date"][date] = false; + }); + } + filters[group][filter] = !filters[group][filter]; + save(); + } catch (e) { + Notifications.add( + "Something went wrong toggling filter. Reverting to defaults", + 0 + ); + console.log("toggling filter error"); + console.error(e); + reset(); + updateActive(); + } +} + +export function updateTags() { + $( + ".pageAccount .content .filterButtons .buttonsAndTitle.tags .buttons" + ).empty(); + if (DB.getSnapshot().tags.length > 0) { + $(".pageAccount .content .filterButtons .buttonsAndTitle.tags").removeClass( + "hidden" + ); + $( + ".pageAccount .content .filterButtons .buttonsAndTitle.tags .buttons" + ).append(`
no tag
`); + DB.getSnapshot().tags.forEach((tag) => { + $( + ".pageAccount .content .filterButtons .buttonsAndTitle.tags .buttons" + ).append(`
${tag.name}
`); + }); + } else { + $(".pageAccount .content .filterButtons .buttonsAndTitle.tags").addClass( + "hidden" + ); + } +} + +$( + ".pageAccount .filterButtons .buttonsAndTitle .buttons, .pageAccount .group.topFilters .buttonsAndTitle.testDate .buttons" +).click(".button", (e) => { + const filter = $(e.target).attr("filter"); + const group = $(e.target).parents(".buttons").attr("group"); + if ($(e.target).hasClass("allFilters")) { + Object.keys(getFilters()).forEach((group) => { + Object.keys(getGroup(group)).forEach((filter) => { + if (group === "date") { + filters[group][filter] = false; + } else { + filters[group][filter] = true; + } + }); + }); + filters["date"]["all"] = true; + } else if ($(e.target).hasClass("noFilters")) { + Object.keys(getFilters()).forEach((group) => { + if (group !== "date") { + Object.keys(getGroup(group)).forEach((filter) => { + filters[group][filter] = false; + }); + } + }); + } else { + if (e.shiftKey) { + Object.keys(getGroup(group)).forEach((filter) => { + filters[group][filter] = false; + }); + filters[group][filter] = true; + } else { + filters[group][filter] = !filters[group][filter]; + } + } + updateActive(); + save(); +}); + +$(".pageAccount .topFilters .button.allFilters").click((e) => { + Object.keys(getFilters()).forEach((group) => { + Object.keys(getGroup(group)).forEach((filter) => { + if (group === "date") { + filters[group][filter] = false; + } else { + filters[group][filter] = true; + } + }); + }); + filters["date"]["all"] = true; + updateActive(); + save(); +}); + +$(".pageAccount .topFilters .button.currentConfigFilter").click((e) => { + Object.keys(getFilters()).forEach((group) => { + Object.keys(getGroup(group)).forEach((filter) => { + filters[group][filter] = false; + }); + }); + + filters["difficulty"][Config.difficulty] = true; + filters["mode"][Config.mode] = true; + if (Config.mode === "time") { + filters["time"][Config.time] = true; + } else if (Config.mode === "words") { + filters["words"][Config.words] = true; + } else if (Config.mode === "quote") { + Object.keys(getGroup("quoteLength")).forEach((ql) => { + filters["quoteLength"][ql] = true; + }); + } + if (Config.punctuation) { + filters["punctuation"]["on"] = true; + } else { + filters["punctuation"]["off"] = true; + } + if (Config.numbers) { + filters["numbers"]["on"] = true; + } else { + filters["numbers"]["off"] = true; + } + if (Config.mode === "quote" && /english.*/.test(Config.language)) { + filters["language"]["english"] = true; + } else { + filters["language"][Config.language] = true; + } + + if (Funbox.active === "none") { + filters.funbox.none = true; + } else { + filters.funbox[Funbox.active] = true; + } + + filters["tags"]["none"] = true; + DB.getSnapshot().tags.forEach((tag) => { + if (tag.active === true) { + filters["tags"]["none"] = false; + filters["tags"][tag.id] = true; + } + }); + + filters["date"]["all"] = true; + updateActive(); + save(); + console.log(getFilters()); +}); + +$(".pageAccount .topFilters .button.toggleAdvancedFilters").click((e) => { + $(".pageAccount .filterButtons").slideToggle(250); + $(".pageAccount .topFilters .button.toggleAdvancedFilters").toggleClass( + "active" + ); +}); + +Misc.getLanguageList().then((languages) => { + languages.forEach((language) => { + $( + ".pageAccount .content .filterButtons .buttonsAndTitle.languages .buttons" + ).append( + `
${language.replace( + "_", + " " + )}
` + ); + }); +}); + +$( + ".pageAccount .content .filterButtons .buttonsAndTitle.funbox .buttons" +).append(`
none
`); +Misc.getFunboxList().then((funboxModes) => { + funboxModes.forEach((funbox) => { + $( + ".pageAccount .content .filterButtons .buttonsAndTitle.funbox .buttons" + ).append( + `
${funbox.name.replace( + /_/g, + " " + )}
` + ); + }); +}); diff --git a/src/js/account/verification-controller.js b/src/js/account/verification-controller.js new file mode 100644 index 000000000..afce5457b --- /dev/null +++ b/src/js/account/verification-controller.js @@ -0,0 +1,23 @@ +import * as CloudFunctions from "./cloud-functions"; +import * as Notifications from "./notifications"; +import * as Settings from "./settings"; +import * as DB from "./db"; + +export let data = null; +export function set(val) { + data = val; +} + +export function verify(user) { + Notifications.add("Verifying", 0, 3); + data.uid = user.uid; + CloudFunctions.verifyUser(data).then((data) => { + if (data.data.status === 1) { + Notifications.add(data.data.message, 1); + DB.getSnapshot().discordId = data.data.did; + Settings.updateDiscordSection(); + } else { + Notifications.add(data.data.message, -1); + } + }); +} diff --git a/src/js/db.js b/src/js/db.js index 7b6315a4e..eb179f8b6 100644 --- a/src/js/db.js +++ b/src/js/db.js @@ -1,5 +1,5 @@ import { loadTags } from "./result-filters"; -import * as AccountButton from "./account-icon"; +import * as AccountButton from "./account-button"; import * as CloudFunctions from "./cloud-functions"; import * as Notifications from "./notifications"; diff --git a/src/js/elements/account-icon.js b/src/js/elements/account-button.js similarity index 100% rename from src/js/elements/account-icon.js rename to src/js/elements/account-button.js diff --git a/src/js/exports.js b/src/js/exports.js index ee882a4e6..4df468469 100644 --- a/src/js/exports.js +++ b/src/js/exports.js @@ -10,3 +10,5 @@ global.snapshot = DB.getSnapshot; global.config = Config; // global.addnotif = Notifications.add; global.link = AccountController.linkWithGoogle; + +global.filters = ResultFilters.filters; diff --git a/src/js/global-dependencies.js b/src/js/global-dependencies.js index 9b8fe94c7..78a62abef 100644 --- a/src/js/global-dependencies.js +++ b/src/js/global-dependencies.js @@ -24,7 +24,7 @@ import * as Caret from "./caret"; import * as ManualRestart from "./manual-restart-tracker"; import Config, * as UpdateConfig from "./config"; import * as Focus from "./focus"; -import * as AccountButton from "./account-icon"; +import * as AccountButton from "./account-button"; import * as TestUI from "./test-ui"; import * as Keymap from "./keymap"; import "./caps-warning"; @@ -52,3 +52,6 @@ import * as ThemePicker from "./theme-picker"; import "./custom-theme-popup"; import "./import-settings-popup"; import * as AllTimeStats from "./all-time-stats"; +import * as PbTables from "./pb-tables"; +import * as Account from "./account"; +import * as VerificationController from "./verification-controller"; diff --git a/src/js/result-filters.js b/src/js/result-filters.js deleted file mode 100644 index 0a58a1c21..000000000 --- a/src/js/result-filters.js +++ /dev/null @@ -1,149 +0,0 @@ -import * as Misc from "./misc"; -import * as DB from "./db"; - -let defaultResultFilters = { - difficulty: { - normal: true, - expert: true, - master: true, - }, - mode: { - words: true, - time: true, - quote: true, - custom: true, - }, - words: { - 10: true, - 25: true, - 50: true, - 100: true, - 200: true, - custom: true, - }, - time: { - 15: true, - 30: true, - 60: true, - 120: true, - custom: true, - }, - quoteLength: { - short: true, - medium: true, - long: true, - thicc: true, - }, - punctuation: { - on: true, - off: true, - }, - numbers: { - on: true, - off: true, - }, - date: { - last_day: false, - last_week: false, - last_month: false, - all: true, - }, - tags: { - none: true, - }, - language: {}, - funbox: { - none: true, - }, -}; - -let filters = defaultResultFilters; - -Misc.getLanguageList().then((languages) => { - languages.forEach((language) => { - defaultResultFilters.language[language] = true; - }); -}); - -Misc.getFunboxList().then((funboxModes) => { - funboxModes.forEach((funbox) => { - defaultResultFilters.funbox[funbox.name] = true; - }); -}); - -export function getFilters() { - return filters; -} - -export function getGroup(group) { - return filters[group]; -} - -export function setFilter(group, filter, value) { - filters[group][filter] = value; -} - -export function getFilter(group, filter) { - return filters[group][filter]; -} - -export function toggleFilter(group, filter) { - filters[group][filter] = !filters[group][filter]; -} - -export function loadTags(tags) { - tags.forEach((tag) => { - defaultResultFilters.tags[tag.id] = true; - }); -} - -export function save() { - Misc.setCookie("resultFilters", JSON.stringify(filters), 365); -} - -export function load() { - // let newTags = $.cookie("activeTags"); - try { - let newResultFilters = Misc.getCookie("resultFilters"); - if (newResultFilters !== undefined && newResultFilters !== "") { - filters = JSON.parse(newResultFilters); - save(); - } else { - filters = defaultResultFilters; - save(); - } - } catch { - filters = defaultResultFilters; - save(); - } -} - -export function reset() { - filters = defaultResultFilters; - save(); -} - -load(); - -export function updateTags() { - $( - ".pageAccount .content .filterButtons .buttonsAndTitle.tags .buttons" - ).empty(); - if (DB.getSnapshot().tags.length > 0) { - $(".pageAccount .content .filterButtons .buttonsAndTitle.tags").removeClass( - "hidden" - ); - $( - ".pageAccount .content .filterButtons .buttonsAndTitle.tags .buttons" - ).append(`
no tag
`); - DB.getSnapshot().tags.forEach((tag) => { - $( - ".pageAccount .content .filterButtons .buttonsAndTitle.tags .buttons" - ).append(`
${tag.name}
`); - }); - } else { - $(".pageAccount .content .filterButtons .buttonsAndTitle.tags").addClass( - "hidden" - ); - } -} diff --git a/src/js/script.js b/src/js/script.js index af48d3a18..8a6067da0 100644 --- a/src/js/script.js +++ b/src/js/script.js @@ -1,7 +1,6 @@ //test timer //ui -let verifyUserWhenLoggedIn = null; /// @@ -19,108 +18,19 @@ let verifyUserWhenLoggedIn = null; }; })(window.history); -function changePage(page) { - if (UI.pageTransition) { - return; - } - let activePage = $(".page.active"); - $(".page").removeClass("active"); - $("#wordsInput").focusout(); - if (page == "test" || page == "") { - UI.setPageTransition(true); - UI.swapElements( - activePage, - $(".page.pageTest"), - 250, - () => { - UI.setPageTransition(false); - TestUI.focusWords(); - $(".page.pageTest").addClass("active"); - history.pushState("/", null, "/"); - }, - () => { - TestConfig.show(); - } - ); - SignOutButton.hide(); - // restartCount = 0; - // incompleteTestSeconds = 0; - TestStats.resetIncomplete(); - ManualRestart.set(); - TestLogic.restart(); - } else if (page == "about") { - UI.setPageTransition(true); - TestLogic.restart(); - UI.swapElements(activePage, $(".page.pageAbout"), 250, () => { - UI.setPageTransition(false); - history.pushState("about", null, "about"); - $(".page.pageAbout").addClass("active"); - }); - TestConfig.hide(); - SignOutButton.hide(); - } else if (page == "settings") { - UI.setPageTransition(true); - TestLogic.restart(); - UI.swapElements(activePage, $(".page.pageSettings"), 250, () => { - UI.setPageTransition(false); - history.pushState("settings", null, "settings"); - $(".page.pageSettings").addClass("active"); - }); - Settings.update(); - TestConfig.hide(); - SignOutButton.hide(); - } else if (page == "account") { - if (!firebase.auth().currentUser) { - changePage("login"); - } else { - UI.setPageTransition(true); - TestLogic.restart(); - UI.swapElements( - activePage, - $(".page.pageAccount"), - 250, - () => { - UI.setPageTransition(false); - history.pushState("account", null, "account"); - $(".page.pageAccount").addClass("active"); - }, - () => { - SignOutButton.show(); - } - ); - refreshAccountPage(); - TestConfig.hide(); - } - } else if (page == "login") { - if (firebase.auth().currentUser != null) { - changePage("account"); - } else { - UI.setPageTransition(true); - TestLogic.restart(); - UI.swapElements(activePage, $(".page.pageLogin"), 250, () => { - UI.setPageTransition(false); - history.pushState("login", null, "login"); - $(".page.pageLogin").addClass("active"); - }); - TestConfig.hide(); - SignOutButton.hide(); - } - } -} - $(window).on("popstate", (e) => { let state = e.originalEvent.state; if (state == "" || state == "/") { // show test - changePage("test"); + UI.changePage("test"); } else if (state == "about") { // show about - changePage("about"); + UI.changePage("about"); } else if (state == "account" || state == "login") { if (firebase.auth().currentUser) { - changePage("account"); + UI.changePage("account"); } else { - changePage("login"); + UI.changePage("login"); } } }); @@ -289,63 +199,8 @@ function handleTab(event) { } } } else if (Config.quickTab) { - changePage("test"); + UI.changePage("test"); } - - // } else if ( - // !event.ctrlKey && - // ( - // (!event.shiftKey && !TestLogic.hasTab) || - // (event.shiftKey && TestLogic.hasTab) || - // TestUI.resultVisible - // ) && - // Config.quickTab && - // !$(".pageLogin").hasClass("active") && - // !resultCalculating && - // $("#commandLineWrapper").hasClass("hidden") && - // $("#simplePopupWrapper").hasClass("hidden") - // ) { - // event.preventDefault(); - // if ($(".pageTest").hasClass("active")) { - // if ( - // (Config.mode === "words" && Config.words < 1000) || - // (Config.mode === "time" && Config.time < 3600) || - // Config.mode === "quote" || - // (Config.mode === "custom" && - // CustomText.isWordRandom && - // CustomText.word < 1000) || - // (Config.mode === "custom" && - // CustomText.isTimeRandom && - // CustomText.time < 3600) || - // (Config.mode === "custom" && - // !CustomText.isWordRandom && - // CustomText.text.length < 1000) - // ) { - // if (TestLogic.active) { - // let testNow = performance.now(); - // let testSeconds = Misc.roundTo2((testNow - testStart) / 1000); - // let afkseconds = keypressPerSecond.filter( - // (x) => x.count == 0 && x.mod == 0 - // ).length; - // incompleteTestSeconds += testSeconds - afkseconds; - // restartCount++; - // } - // TestLogic.restart(); - // } else { - // Notifications.add("Quick restart disabled for long tests", 0); - // } - // } else { - // changePage("test"); - // } - // } else if ( - // !Config.quickTab && - // TestLogic.hasTab && - // event.shiftKey && - // !TestUI.resultVisible - // ) { - // event.preventDefault(); - // $("#restartTestButton").focus(); - // } } function handleBackspace(event) { @@ -969,7 +824,6 @@ function handleAlpha(event) { ManualRestart.set(); UpdateConfig.loadFromCookie(); Misc.getReleasesFromGitHub(); -// getPatreonNames(); let mappedRoutes = { "/": "pageTest", @@ -1011,10 +865,10 @@ $(document).ready(() => { if (fragment.has("access_token")) { const accessToken = fragment.get("access_token"); const tokenType = fragment.get("token_type"); - verifyUserWhenLoggedIn = { + VerificationController.set({ accessToken: accessToken, tokenType: tokenType, - }; + }); history.replaceState("/", null, "/"); } } else if (window.location.pathname === "/account") { @@ -1024,23 +878,8 @@ $(document).ready(() => { // } } else if (window.location.pathname !== "/") { let page = window.location.pathname.replace("/", ""); - changePage(page); + UI.changePage(page); } }); Settings.settingsFillPromise.then(Settings.update); }); - -//TODO move after account is a module -$(document).on("click", "#top .logo", (e) => { - changePage("test"); -}); - -$(document).on("click", "#top #menu .icon-button", (e) => { - if ($(e.currentTarget).hasClass("leaderboards")) { - Leaderboards.show(); - } else { - const href = $(e.currentTarget).attr("href"); - ManualRestart.set(); - changePage(href.replace("/", "")); - } -}); diff --git a/src/js/test/test-logic.js b/src/js/test/test-logic.js index a311a3564..ad4d94a2a 100644 --- a/src/js/test/test-logic.js +++ b/src/js/test/test-logic.js @@ -22,7 +22,7 @@ import * as QuoteSearchPopup from "./quote-search-popup"; import * as PbCrown from "./pb-crown"; import * as TestTimer from "./test-timer"; import * as OutOfFocus from "./out-of-focus"; -import * as AccountButton from "./account-icon"; +import * as AccountButton from "./account-button"; import * as DB from "./db"; import * as ThemeColors from "./theme-colors"; import * as CloudFunctions from "./cloud-functions"; diff --git a/src/js/ui.js b/src/js/ui.js index bc2529e96..1b24d7417 100644 --- a/src/js/ui.js +++ b/src/js/ui.js @@ -6,6 +6,14 @@ import * as TestLogic from "./test-logic"; import * as CustomText from "./custom-text"; import * as CommandlineLists from "./commandline-lists"; import * as Commandline from "./commandline"; +import * as TestUI from "./test-ui"; +import * as TestConfig from "./test-config"; +import * as SignOutButton from "./sign-out-button"; +import * as TestStats from "./test-stats"; +import * as ManualRestart from "./manual-restart-tracker"; +import * as Settings from "./settings"; +import * as Account from "./account"; +import * as Leaderboards from "./leaderboards"; export let pageTransition = false; @@ -99,6 +107,95 @@ export function swapElements( } } +export function changePage(page) { + if (pageTransition) { + return; + } + let activePage = $(".page.active"); + $(".page").removeClass("active"); + $("#wordsInput").focusout(); + if (page == "test" || page == "") { + setPageTransition(true); + swapElements( + activePage, + $(".page.pageTest"), + 250, + () => { + setPageTransition(false); + TestUI.focusWords(); + $(".page.pageTest").addClass("active"); + history.pushState("/", null, "/"); + }, + () => { + TestConfig.show(); + } + ); + SignOutButton.hide(); + // restartCount = 0; + // incompleteTestSeconds = 0; + TestStats.resetIncomplete(); + ManualRestart.set(); + TestLogic.restart(); + } else if (page == "about") { + setPageTransition(true); + TestLogic.restart(); + swapElements(activePage, $(".page.pageAbout"), 250, () => { + setPageTransition(false); + history.pushState("about", null, "about"); + $(".page.pageAbout").addClass("active"); + }); + TestConfig.hide(); + SignOutButton.hide(); + } else if (page == "settings") { + setPageTransition(true); + TestLogic.restart(); + swapElements(activePage, $(".page.pageSettings"), 250, () => { + setPageTransition(false); + history.pushState("settings", null, "settings"); + $(".page.pageSettings").addClass("active"); + }); + Settings.update(); + TestConfig.hide(); + SignOutButton.hide(); + } else if (page == "account") { + if (!firebase.auth().currentUser) { + changePage("login"); + } else { + setPageTransition(true); + TestLogic.restart(); + swapElements( + activePage, + $(".page.pageAccount"), + 250, + () => { + setPageTransition(false); + history.pushState("account", null, "account"); + $(".page.pageAccount").addClass("active"); + }, + () => { + SignOutButton.show(); + } + ); + Account.update(); + TestConfig.hide(); + } + } else if (page == "login") { + if (firebase.auth().currentUser != null) { + changePage("account"); + } else { + setPageTransition(true); + TestLogic.restart(); + swapElements(activePage, $(".page.pageLogin"), 250, () => { + setPageTransition(false); + history.pushState("login", null, "login"); + $(".page.pageLogin").addClass("active"); + }); + TestConfig.hide(); + SignOutButton.hide(); + } + } +} + if (firebase.app().options.projectId === "monkey-type-dev-67af4") { $("#top .logo .bottom").text("monkey-dev"); $("head title").text("Monkey Dev"); @@ -191,3 +288,17 @@ window.addEventListener("beforeunload", (event) => { $(window).resize(() => { Caret.updatePosition(); }); + +$(document).on("click", "#top .logo", (e) => { + changePage("test"); +}); + +$(document).on("click", "#top #menu .icon-button", (e) => { + if ($(e.currentTarget).hasClass("leaderboards")) { + Leaderboards.show(); + } else { + const href = $(e.currentTarget).attr("href"); + ManualRestart.set(); + changePage(href.replace("/", "")); + } +});