Skip to content

Commit 4bb431b

Browse files
authored
perf: fix account page getting slower with every load (@Miodec) (monkeytypegame#6606)
Stacking event listeners go brrrrrrr
1 parent af86a2d commit 4bb431b

File tree

3 files changed

+54
-30
lines changed

3 files changed

+54
-30
lines changed

frontend/src/html/pages/account.html

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -497,7 +497,14 @@
497497
<i class="fas fa-tag"></i>
498498
tags
499499
</div>
500-
<div class="select filterGroup" group="tags"></div>
500+
<div class="select filterGroup" group="tags">
501+
<select
502+
class="tagsSelect"
503+
group="tags"
504+
placeholder="select a tag"
505+
multiple
506+
></select>
507+
</div>
501508
</div>
502509
<div class="buttonsAndTitle funbox">
503510
<div class="title">

frontend/src/ts/elements/account/result-filters.ts

Lines changed: 45 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import {
1616
import { LocalStorageWithSchema } from "../../utils/local-storage-with-schema";
1717
import defaultResultFilters from "../../constants/default-result-filters";
1818
import { getAllFunboxes } from "@monkeytype/funbox";
19-
import { SnapshotUserTag } from "../../constants/default-snapshot";
19+
import { Snapshot, SnapshotUserTag } from "../../constants/default-snapshot";
2020
import { LanguageList } from "../../constants/languages";
2121

2222
export function mergeWithDefaultFilters(
@@ -742,9 +742,38 @@ let selectChangeCallbackFn: () => void = () => {
742742
//
743743
};
744744

745+
export function updateTagsDropdownOptions(): void {
746+
const el = document.querySelector<HTMLElement>(
747+
".pageAccount .content .filterButtons .buttonsAndTitle.tags .select select"
748+
);
749+
750+
if (!(el instanceof HTMLElement)) return;
751+
752+
const snapshot = DB.getSnapshot();
753+
754+
if (snapshot === undefined) {
755+
return;
756+
}
757+
758+
let html = "";
759+
760+
html += "<option value='all'>all</option>";
761+
html += "<option value='none'>no tag</option>";
762+
763+
for (const tag of snapshot.tags) {
764+
html += `<option value="${tag._id}" filter="${tag.name}">${tag.display}</option>`;
765+
}
766+
767+
el.innerHTML = html;
768+
}
769+
770+
let buttonsAppended = false;
771+
745772
export async function appendButtons(
746773
selectChangeCallback: () => void
747774
): Promise<void> {
775+
if (buttonsAppended) return;
776+
748777
selectChangeCallbackFn = selectChangeCallback;
749778

750779
groupSelects["language"] = new SlimSelect({
@@ -810,34 +839,24 @@ export async function appendButtons(
810839
},
811840
});
812841

813-
const snapshot = DB.getSnapshot();
814-
815-
if (snapshot !== undefined && (snapshot.tags?.length ?? 0) > 0) {
816-
$(".pageAccount .content .filterButtons .buttonsAndTitle.tags").removeClass(
817-
"hidden"
818-
);
819-
820-
let html = "";
821-
822-
html +=
823-
"<select class='tagsSelect' group='tags' placeholder='select a tag' multiple>";
842+
//snapshot at this point is guaranteed to exist
843+
const snapshot = DB.getSnapshot() as Snapshot;
824844

825-
html += "<option value='all'>all</option>";
826-
html += "<option value='none'>no tag</option>";
827-
828-
for (const tag of snapshot.tags) {
829-
html += `<option value="${tag._id}" filter="${tag.name}">${tag.display}</option>`;
830-
}
831-
832-
html += "</select>";
845+
const tagsSection = $(
846+
".pageAccount .content .filterButtons .buttonsAndTitle.tags"
847+
);
833848

834-
const el = document.querySelector(
835-
".pageAccount .content .filterButtons .buttonsAndTitle.tags .select"
849+
if (snapshot.tags.length === 0) {
850+
tagsSection.addClass("hidden");
851+
} else {
852+
tagsSection.removeClass("hidden");
853+
updateTagsDropdownOptions();
854+
const selectEl = document.querySelector(
855+
".pageAccount .content .filterButtons .buttonsAndTitle.tags .select .tagsSelect"
836856
);
837-
if (el) {
838-
el.innerHTML = html;
857+
if (selectEl) {
839858
groupSelects["tags"] = new SlimSelect({
840-
select: el.querySelector(".tagsSelect") as HTMLSelectElement,
859+
select: selectEl,
841860
settings: {
842861
showSearch: true,
843862
placeholderText: "select a tag",
@@ -861,13 +880,10 @@ export async function appendButtons(
861880
},
862881
});
863882
}
864-
} else {
865-
$(".pageAccount .content .filterButtons .buttonsAndTitle.tags").addClass(
866-
"hidden"
867-
);
868883
}
869884

870885
void updateFilterPresets();
886+
buttonsAppended = true;
871887
}
872888

873889
export function removeButtons(): void {

frontend/src/ts/pages/account.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1341,6 +1341,7 @@ export const page = new Page({
13411341
$(".pageAccount .preloader").removeClass("hidden");
13421342
await LoadingPage.showBar();
13431343
}
1344+
ResultFilters.updateTagsDropdownOptions();
13441345
await ResultFilters.appendButtons(update);
13451346
ResultFilters.updateActive();
13461347
await Misc.sleep(0);

0 commit comments

Comments
 (0)