diff --git a/gulpfile.js b/gulpfile.js
index d58d77182..417f2c1db 100644
--- a/gulpfile.js
+++ b/gulpfile.js
@@ -87,7 +87,6 @@ let eslintConfig = {
//once all files are moved here, then can we use a bundler to its full potential
const refactoredSrc = [
"./src/js/db.js",
- "./src/js/dom-util.js",
"./src/js/cloud-functions.js",
"./src/js/misc.js",
"./src/js/layouts.js",
@@ -133,6 +132,7 @@ const refactoredSrc = [
"./src/js/challenge-controller.js",
"./src/js/custom-mode2-popup.js",
"./src/js/test/test-config.js",
+ "./src/js/loader.js",
];
//legacy files
diff --git a/src/js/account.js b/src/js/account.js
index 706a43c91..f48c45d6b 100644
--- a/src/js/account.js
+++ b/src/js/account.js
@@ -1275,13 +1275,13 @@ function refreshGlobalStats() {
function updateAccountLoginButton() {
if (firebase.auth().currentUser != null) {
- swapElements(
+ UI.swapElements(
$("#menu .icon-button.login"),
$("#menu .icon-button.account"),
250
);
} else {
- swapElements(
+ UI.swapElements(
$("#menu .icon-button.account"),
$("#menu .icon-button.login"),
250
@@ -1776,7 +1776,11 @@ function refreshAccountPage() {
ChartController.accountHistory.update({ duration: 0 });
ChartController.accountActivity.update({ duration: 0 });
- swapElements($(".pageAccount .preloader"), $(".pageAccount .content"), 250);
+ UI.swapElements(
+ $(".pageAccount .preloader"),
+ $(".pageAccount .content"),
+ 250
+ );
}
if (DB.getSnapshot() === null) {
Notifications.add(`Missing account data. Please refresh.`, -1);
@@ -1890,14 +1894,14 @@ $("#resultEditTagsPanel .confirmButton").click((e) => {
newtags.push(tagid);
}
});
- showBackgroundLoader();
+ Loader.show();
hideResultEditTagsPanel();
CloudFunctions.updateResultTags({
uid: firebase.auth().currentUser.uid,
tags: newtags,
resultid: resultid,
}).then((r) => {
- hideBackgroundLoader();
+ Loader.hide();
if (r.data.resultCode === 1) {
Notifications.add("Tags updated.", 1, 2);
DB.getSnapshot().results.forEach((result) => {
diff --git a/src/js/commandline.js b/src/js/commandline.js
index bf68daf69..02e87c27a 100644
--- a/src/js/commandline.js
+++ b/src/js/commandline.js
@@ -1,9 +1,9 @@
-import { focusWords } from "./dom-util";
import * as Leaderboards from "./leaderboards";
import * as ThemeController from "./theme-controller";
import Config, * as UpdateConfig from "./config";
import * as Focus from "./focus";
import * as CommandlineLists from "./commandline-lists";
+import * as TestUI from "./test-ui";
let commandLineMouseMode = false;
@@ -127,10 +127,10 @@ function hide() {
() => {
$("#commandLineWrapper").addClass("hidden");
$("#commandLine").removeClass("allCommands");
- focusWords();
+ TestUI.focusWords();
}
);
- focusWords();
+ TestUI.focusWords();
}
function trigger(command) {
diff --git a/src/js/config.js b/src/js/config.js
index a2859184b..5af9326ee 100644
--- a/src/js/config.js
+++ b/src/js/config.js
@@ -15,7 +15,7 @@ import * as Keymap from "./keymap";
import * as LanguagePicker from "./language-picker";
import * as TestLogic from "./test-logic";
import * as PaceCaret from "./pace-caret";
-import { updateKeytips } from "./dom-util";
+import * as UI from "./ui";
export let cookieConfig = null;
export let dbConfigLoaded = false;
@@ -454,7 +454,7 @@ export function setShowOutOfFocusWarning(val, nosave) {
export function toggleSwapEscAndTab() {
config.swapEscAndTab = !config.swapEscAndTab;
saveToCookie();
- updateKeytips();
+ UI.updateKeytips();
}
export function setSwapEscAndTab(val, nosave) {
@@ -462,7 +462,7 @@ export function setSwapEscAndTab(val, nosave) {
val = false;
}
config.swapEscAndTab = val;
- updateKeytips();
+ UI.updateKeytips();
if (!nosave) saveToCookie();
}
diff --git a/src/js/dom-util.js b/src/js/dom-util.js
deleted file mode 100644
index 4b4776dbf..000000000
--- a/src/js/dom-util.js
+++ /dev/null
@@ -1,97 +0,0 @@
-import Config from "./config";
-
-export function showBackgroundLoader() {
- $("#backgroundLoader").stop(true, true).fadeIn(125);
-}
-
-export function hideBackgroundLoader() {
- $("#backgroundLoader").stop(true, true).fadeOut(125);
-}
-
-export function swapElements(
- el1,
- el2,
- totalDuration,
- callback = function () {
- return;
- }
-) {
- if (
- (el1.hasClass("hidden") && !el2.hasClass("hidden")) ||
- (!el1.hasClass("hidden") && el2.hasClass("hidden"))
- ) {
- //one of them is hidden and the other is visible
- if (el1.hasClass("hidden")) {
- callback();
- return false;
- }
- $(el1)
- .removeClass("hidden")
- .css("opacity", 1)
- .animate(
- {
- opacity: 0,
- },
- totalDuration / 2,
- () => {
- $(el1).addClass("hidden");
- $(el2)
- .removeClass("hidden")
- .css("opacity", 0)
- .animate(
- {
- opacity: 1,
- },
- totalDuration / 2,
- () => {
- callback();
- }
- );
- }
- );
- } else if (el1.hasClass("hidden") && el2.hasClass("hidden")) {
- //both are hidden, only fade in the second
- $(el2)
- .removeClass("hidden")
- .css("opacity", 0)
- .animate(
- {
- opacity: 1,
- },
- totalDuration,
- () => {
- callback();
- }
- );
- } else {
- callback();
- }
-}
-
-export function focusWords() {
- if (!$("#wordsWrapper").hasClass("hidden")) {
- $("#wordsInput").focus();
- }
-}
-
-export function updateKeytips() {
- if (Config.swapEscAndTab) {
- $(".pageSettings .tip").html(`
- tip: You can also change all these settings quickly using the
- command line (
- tab
- )`);
- $("#bottom .keyTips").html(`
- esc - restart test
- tab - command line`);
- } else {
- $(".pageSettings .tip").html(`
- tip: You can also change all these settings quickly using the
- command line (
- esc
- )`);
- $("#bottom .keyTips").html(`
- tab - restart test
- esc - command line`);
- }
-}
diff --git a/src/js/global-dependencies.js b/src/js/global-dependencies.js
index 82559df72..1b1e14e67 100644
--- a/src/js/global-dependencies.js
+++ b/src/js/global-dependencies.js
@@ -8,12 +8,6 @@ Chart.plugins.register(chartTrendline);
Chart.plugins.register(chartAnnotation);
import * as DB from "./db";
-import {
- showBackgroundLoader,
- hideBackgroundLoader,
- swapElements,
- focusWords,
-} from "./dom-util";
import * as Misc from "./misc";
import * as CloudFunctions from "./cloud-functions";
import layouts from "./layouts";
@@ -56,3 +50,4 @@ import * as CommandlineLists from "./commandline-lists";
import * as ChallengeController from "./challenge-controller";
import * as CustomMode2Popup from "./custom-mode2-popup";
import * as TestConfig from "./test-config";
+import * as Loader from "./loader";
diff --git a/src/js/leaderboards.js b/src/js/leaderboards.js
index d63a2ada9..43c384efe 100644
--- a/src/js/leaderboards.js
+++ b/src/js/leaderboards.js
@@ -1,5 +1,5 @@
import * as CloudFunctions from "./cloud-functions";
-import { showBackgroundLoader, hideBackgroundLoader } from "./dom-util";
+import * as Loader from "./loader";
import * as Notifications from "./notification-center";
let currentLeaderboard = "time_15";
@@ -17,7 +17,6 @@ export function hide() {
$("#leaderboardsWrapper").addClass("hidden");
}
);
- // focusWords();
}
function update() {
@@ -33,7 +32,7 @@ function update() {
uid = firebase.auth().currentUser.uid;
}
- showBackgroundLoader();
+ Loader.show();
Promise.all([
CloudFunctions.getLeaderboard({
mode: boardinfo[0],
@@ -49,7 +48,7 @@ function update() {
}),
])
.then((lbdata) => {
- hideBackgroundLoader();
+ Loader.hide();
let dailyData = lbdata[0].data;
let globalData = lbdata[1].data;
@@ -245,7 +244,7 @@ function update() {
}
})
.catch((e) => {
- hideBackgroundLoader();
+ Loader.hide();
Notifications.add("Something went wrong: " + e.message, -1);
});
}
diff --git a/src/js/loader.js b/src/js/loader.js
new file mode 100644
index 000000000..a8150d109
--- /dev/null
+++ b/src/js/loader.js
@@ -0,0 +1,7 @@
+export function show() {
+ $("#backgroundLoader").stop(true, true).fadeIn(125);
+}
+
+export function hide() {
+ $("#backgroundLoader").stop(true, true).fadeOut(125);
+}
diff --git a/src/js/misc.js b/src/js/misc.js
index 6f3138c65..813d103d6 100644
--- a/src/js/misc.js
+++ b/src/js/misc.js
@@ -1,4 +1,4 @@
-import { showBackgroundLoader, hideBackgroundLoader } from "./dom-util";
+import * as Loader from "./loader";
function hexToHSL(H) {
// Convert hex to RGB first
@@ -105,10 +105,10 @@ export async function getFunboxList() {
let quotes = null;
export async function getQuotes(language) {
if (quotes === null || quotes.language !== language.replace(/_\d*k$/g, "")) {
- showBackgroundLoader();
+ Loader.show();
try {
let data = await $.getJSON(`quotes/${language}.json`);
- hideBackgroundLoader();
+ Loader.hide();
if (data.quotes === undefined || data.quotes.length === 0) {
quotes = {
quotes: [],
@@ -132,7 +132,7 @@ export async function getQuotes(language) {
});
return quotes;
} catch {
- hideBackgroundLoader();
+ Loader.hide();
quotes = {
quotes: [],
length: 0,
@@ -305,15 +305,15 @@ export function getCookie(cname) {
}
export function sendVerificationEmail() {
- showBackgroundLoader();
+ Loader.show();
let cu = firebase.auth().currentUser;
cu.sendEmailVerification()
.then(() => {
- hideBackgroundLoader();
+ Loader.hide();
showNotification("Email sent to " + cu.email, 4000);
})
.catch((e) => {
- hideBackgroundLoader();
+ Loader.hide();
showNotification("Error: " + e.message, 3000);
console.error(e.message);
});
diff --git a/src/js/script.js b/src/js/script.js
index 2a60b7ff5..d043f9f16 100644
--- a/src/js/script.js
+++ b/src/js/script.js
@@ -181,9 +181,9 @@ function changePage(page) {
$("#wordsInput").focusout();
if (page == "test" || page == "") {
UI.setPageTransition(true);
- swapElements(activePage, $(".page.pageTest"), 250, () => {
+ UI.swapElements(activePage, $(".page.pageTest"), 250, () => {
UI.setPageTransition(false);
- focusWords();
+ TestUI.focusWords();
$(".page.pageTest").addClass("active");
history.pushState("/", null, "/");
});
@@ -197,7 +197,7 @@ function changePage(page) {
} else if (page == "about") {
UI.setPageTransition(true);
TestLogic.restart();
- swapElements(activePage, $(".page.pageAbout"), 250, () => {
+ UI.swapElements(activePage, $(".page.pageAbout"), 250, () => {
UI.setPageTransition(false);
history.pushState("about", null, "about");
$(".page.pageAbout").addClass("active");
@@ -207,7 +207,7 @@ function changePage(page) {
} else if (page == "settings") {
UI.setPageTransition(true);
TestLogic.restart();
- swapElements(activePage, $(".page.pageSettings"), 250, () => {
+ UI.swapElements(activePage, $(".page.pageSettings"), 250, () => {
UI.setPageTransition(false);
history.pushState("settings", null, "settings");
$(".page.pageSettings").addClass("active");
@@ -221,7 +221,7 @@ function changePage(page) {
} else {
UI.setPageTransition(true);
TestLogic.restart();
- swapElements(activePage, $(".page.pageAccount"), 250, () => {
+ UI.swapElements(activePage, $(".page.pageAccount"), 250, () => {
UI.setPageTransition(false);
history.pushState("account", null, "account");
$(".page.pageAccount").addClass("active");
@@ -236,7 +236,7 @@ function changePage(page) {
} else {
UI.setPageTransition(true);
TestLogic.restart();
- swapElements(activePage, $(".page.pageLogin"), 250, () => {
+ UI.swapElements(activePage, $(".page.pageLogin"), 250, () => {
UI.setPageTransition(false);
history.pushState("login", null, "login");
$(".page.pageLogin").addClass("active");
@@ -321,12 +321,12 @@ function tagsEdit() {
let tagid = $("#tagsWrapper #tagsEdit").attr("tagid");
hideEditTags();
if (action === "add") {
- showBackgroundLoader();
+ Loader.show();
CloudFunctions.addTag({
uid: firebase.auth().currentUser.uid,
name: inputVal,
}).then((e) => {
- hideBackgroundLoader();
+ Loader.hide();
let status = e.data.resultCode;
if (status === 1) {
Notifications.add("Tag added", 1, 2);
@@ -344,13 +344,13 @@ function tagsEdit() {
}
});
} else if (action === "edit") {
- showBackgroundLoader();
+ Loader.show();
CloudFunctions.editTag({
uid: firebase.auth().currentUser.uid,
name: inputVal,
tagid: tagid,
}).then((e) => {
- hideBackgroundLoader();
+ Loader.hide();
let status = e.data.resultCode;
if (status === 1) {
Notifications.add("Tag updated", 1);
@@ -369,12 +369,12 @@ function tagsEdit() {
}
});
} else if (action === "remove") {
- showBackgroundLoader();
+ Loader.show();
CloudFunctions.removeTag({
uid: firebase.auth().currentUser.uid,
tagid: tagid,
}).then((e) => {
- hideBackgroundLoader();
+ Loader.hide();
let status = e.data.resultCode;
if (status === 1) {
Notifications.add("Tag removed", 1);
@@ -398,7 +398,7 @@ $(document).on("click", "#top .logo", (e) => {
});
$("#wordsWrapper").on("click", () => {
- focusWords();
+ TestUI.focusWords();
});
$(document).on("click", "#top #menu .icon-button", (e) => {
@@ -655,7 +655,7 @@ $(document).keydown(function (event) {
!wordsFocused &&
event.key !== "Enter"
) {
- focusWords();
+ TestUI.focusWords();
wordsFocused = true;
// if (Config.showOutOfFocusWarning) return;
}
diff --git a/src/js/settings.js b/src/js/settings.js
index 7f444183a..b63fb2072 100644
--- a/src/js/settings.js
+++ b/src/js/settings.js
@@ -861,10 +861,10 @@ $(document).on(
$(
".pageSettings .section.discordIntegration .buttons .generateCodeButton"
).click((e) => {
- showBackgroundLoader();
+ Loader.show();
CloudFunctions.generatePairingCode({ uid: firebase.auth().currentUser.uid })
.then((ret) => {
- hideBackgroundLoader();
+ Loader.hide();
if (ret.data.status === 1 || ret.data.status === 2) {
DB.getSnapshot().pairingCode = ret.data.pairingCode;
$(".pageSettings .section.discordIntegration .code .bottom").text(
@@ -877,7 +877,7 @@ $(
}
})
.catch((e) => {
- hideBackgroundLoader();
+ Loader.hide();
Notifications.add("Something went wrong. Error: " + e.message, -1);
});
});
@@ -885,11 +885,11 @@ $(
$(".pageSettings .section.discordIntegration #unlinkDiscordButton").click(
(e) => {
if (confirm("Are you sure?")) {
- showBackgroundLoader();
+ Loader.show();
CloudFunctions.unlinkDiscord({
uid: firebase.auth().currentUser.uid,
}).then((ret) => {
- hideBackgroundLoader();
+ Loader.hide();
console.log(ret);
if (ret.data.status === 1) {
DB.getSnapshot().discordId = null;
@@ -971,7 +971,7 @@ $(".pageSettings .section.themes .tabs .button").click((e) => {
UpdateConfig.setCustomTheme(false);
ThemeController.set(Config.theme);
// applyCustomThemeColors();
- swapElements(
+ UI.swapElements(
$('.pageSettings .section.themes .tabContainer [tabContent="custom"]'),
$('.pageSettings .section.themes .tabContainer [tabContent="preset"]'),
250
@@ -980,7 +980,7 @@ $(".pageSettings .section.themes .tabs .button").click((e) => {
UpdateConfig.setCustomTheme(true);
ThemeController.set("custom");
// applyCustomThemeColors();
- swapElements(
+ UI.swapElements(
$('.pageSettings .section.themes .tabContainer [tabContent="preset"]'),
$('.pageSettings .section.themes .tabContainer [tabContent="custom"]'),
250
diff --git a/src/js/simple-popups.js b/src/js/simple-popups.js
index 2485c17f9..f30bba8a5 100644
--- a/src/js/simple-popups.js
+++ b/src/js/simple-popups.js
@@ -143,13 +143,13 @@ simplePopups.updateEmail = new SimplePopup(
"Update",
(previousEmail, newEmail) => {
try {
- showBackgroundLoader();
+ Loader.show();
CloudFunctions.updateEmail({
uid: firebase.auth().currentUser.uid,
previousEmail: previousEmail,
newEmail: newEmail,
}).then((data) => {
- hideBackgroundLoader();
+ Loader.hide();
if (data.data.resultCode === 1) {
Notifications.add("Email updated", 0);
setTimeout(() => {
@@ -180,13 +180,13 @@ simplePopups.clearTagPb = new SimplePopup(
"Clear",
() => {
let tagid = eval("this.parameters[0]");
- showBackgroundLoader();
+ Loader.show();
CloudFunctions.clearTagPb({
uid: firebase.auth().currentUser.uid,
tagid: tagid,
})
.then((res) => {
- hideBackgroundLoader();
+ Loader.hide();
if (res.data.resultCode === 1) {
let tag = DB.getSnapshot().tags.filter((t) => t.id === tagid)[0];
tag.pb = 0;
@@ -199,7 +199,7 @@ simplePopups.clearTagPb = new SimplePopup(
}
})
.catch((e) => {
- hideBackgroundLoader();
+ Loader.hide();
Notifications.add(
"Something went wrong while clearing tag pb " + e,
-1
@@ -237,13 +237,13 @@ simplePopups.resetPersonalBests = new SimplePopup(
"Reset",
() => {
try {
- showBackgroundLoader();
+ Loader.show();
CloudFunctions.resetPersonalBests({
uid: firebase.auth().currentUser.uid,
}).then((res) => {
if (res) {
- hideBackgroundLoader();
+ Loader.hide();
Notifications.add(
"Personal bests removed, refreshing the page...",
0
diff --git a/src/js/test/test-logic.js b/src/js/test/test-logic.js
index 4981080f7..44a4ea1cc 100644
--- a/src/js/test/test-logic.js
+++ b/src/js/test/test-logic.js
@@ -17,7 +17,6 @@ import * as LiveWpm from "./live-wpm";
import * as LiveAcc from "./live-acc";
import * as TimerProgress from "./timer-progress";
import * as ChartController from "./chart-controller";
-import { focusWords } from "./dom-util";
import * as UI from "./ui";
import * as QuoteSearchPopup from "./quote-search-popup";
import * as PbCrown from "./pb-crown";
@@ -28,7 +27,6 @@ import * as DB from "./db";
import * as ThemeColors from "./theme-colors";
import * as CloudFunctions from "./cloud-functions";
import * as TestLeaderboards from "./test-leaderboards";
-import { swapElements } from "./dom-util";
export let notSignedInLastResult = null;
@@ -611,7 +609,7 @@ export function restart(withSameWordset = false, nosave = false, event) {
setBailout(false);
PaceCaret.reset();
$("#showWordHistoryButton").removeClass("loaded");
- focusWords();
+ TestUI.focusWords();
Funbox.resetMemoryTimer();
TestUI.reset();
@@ -729,7 +727,8 @@ export function restart(withSameWordset = false, nosave = false, event) {
// resetPaceCaret();
PbCrown.hide();
TestTimer.clear();
- if ($("#commandLineWrapper").hasClass("hidden")) focusWords();
+ if ($("#commandLineWrapper").hasClass("hidden"))
+ TestUI.focusWords();
ChartController.result.update();
TestUI.updateModesNotice();
UI.setPageTransition(false);
@@ -1691,7 +1690,7 @@ export function finish(difficultyFailed = false) {
ChartController.result.update({ duration: 0 });
ChartController.result.resize();
- swapElements($("#typingTest"), $("#result"), 250, () => {
+ UI.swapElements($("#typingTest"), $("#result"), 250, () => {
TestUI.setResultCalculating(false);
$("#words").empty();
ChartController.result.resize();
diff --git a/src/js/test/test-ui.js b/src/js/test/test-ui.js
index 088929dec..b2a04dbe7 100644
--- a/src/js/test/test-ui.js
+++ b/src/js/test/test-ui.js
@@ -42,6 +42,12 @@ export function reset() {
currentWordElementIndex = 0;
}
+export function focusWords() {
+ if (!$("#wordsWrapper").hasClass("hidden")) {
+ $("#wordsInput").focus();
+ }
+}
+
export function updateActiveElement(backspace) {
let active = document.querySelector("#words .active");
if (Config.mode == "zen" && backspace) {
diff --git a/src/js/theme-controller.js b/src/js/theme-controller.js
index a4ba84304..33a353249 100644
--- a/src/js/theme-controller.js
+++ b/src/js/theme-controller.js
@@ -3,7 +3,7 @@ import * as ChartController from "./chart-controller";
import * as Misc from "./misc";
import * as Notifications from "./notification-center";
import Config from "./config";
-import { swapElements } from "./dom-util";
+import * as UI from "./ui";
let isPreviewingTheme = false;
let randomTheme = null;
@@ -67,14 +67,14 @@ export function apply(themeName) {
let name = "serika_dark";
if (themeName !== "custom") {
name = themeName;
- swapElements(
+ UI.swapElements(
$('.pageSettings [tabContent="custom"]'),
$('.pageSettings [tabContent="preset"]'),
250
);
} else {
//is custom
- swapElements(
+ UI.swapElements(
$('.pageSettings [tabContent="preset"]'),
$('.pageSettings [tabContent="custom"]'),
250
diff --git a/src/js/ui.js b/src/js/ui.js
index 8fec116bb..e605fb56f 100644
--- a/src/js/ui.js
+++ b/src/js/ui.js
@@ -1,5 +1,89 @@
+import Config from "./config";
+
export let pageTransition = false;
export function setPageTransition(val) {
pageTransition = val;
}
+
+export function updateKeytips() {
+ if (Config.swapEscAndTab) {
+ $(".pageSettings .tip").html(`
+ tip: You can also change all these settings quickly using the
+ command line (
+ tab
+ )`);
+ $("#bottom .keyTips").html(`
+ esc - restart test
+ tab - command line`);
+ } else {
+ $(".pageSettings .tip").html(`
+ tip: You can also change all these settings quickly using the
+ command line (
+ esc
+ )`);
+ $("#bottom .keyTips").html(`
+ tab - restart test
+ esc - command line`);
+ }
+}
+
+export function swapElements(
+ el1,
+ el2,
+ totalDuration,
+ callback = function () {
+ return;
+ }
+) {
+ if (
+ (el1.hasClass("hidden") && !el2.hasClass("hidden")) ||
+ (!el1.hasClass("hidden") && el2.hasClass("hidden"))
+ ) {
+ //one of them is hidden and the other is visible
+ if (el1.hasClass("hidden")) {
+ callback();
+ return false;
+ }
+ $(el1)
+ .removeClass("hidden")
+ .css("opacity", 1)
+ .animate(
+ {
+ opacity: 0,
+ },
+ totalDuration / 2,
+ () => {
+ $(el1).addClass("hidden");
+ $(el2)
+ .removeClass("hidden")
+ .css("opacity", 0)
+ .animate(
+ {
+ opacity: 1,
+ },
+ totalDuration / 2,
+ () => {
+ callback();
+ }
+ );
+ }
+ );
+ } else if (el1.hasClass("hidden") && el2.hasClass("hidden")) {
+ //both are hidden, only fade in the second
+ $(el2)
+ .removeClass("hidden")
+ .css("opacity", 0)
+ .animate(
+ {
+ opacity: 1,
+ },
+ totalDuration,
+ () => {
+ callback();
+ }
+ );
+ } else {
+ callback();
+ }
+}