From b25bcb13e95ee3f23c7c3497c929909760b87705 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Sep 2025 16:58:43 +0200 Subject: [PATCH 1/4] build(deps-dev): bump vite from 6.3.4 to 6.3.6 in /frontend (#6948) Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 6.3.4 to 6.3.6.
Release notes

Sourced from vite's releases.

v6.3.6

Please refer to CHANGELOG.md for details.

v6.3.5

Please refer to CHANGELOG.md for details.

Changelog

Sourced from vite's changelog.

6.3.6 (2025-09-08)

6.3.5 (2025-05-05)

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=vite&package-manager=npm_and_yarn&previous-version=6.3.4&new-version=6.3.6)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/monkeytypegame/monkeytype/network/alerts).
--------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Miodec --- frontend/package.json | 2 +- pnpm-lock.yaml | 128 ++++++++++++++++++++++++++++++++---------- 2 files changed, 99 insertions(+), 31 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index a8eb0bf53..a98cb135e 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -65,7 +65,7 @@ "tsx": "4.16.2", "typescript": "5.5.4", "unplugin-inject-preload": "3.0.0", - "vite": "6.3.4", + "vite": "6.3.6", "vite-bundle-visualizer": "1.0.1", "vite-plugin-checker": "0.7.2", "vite-plugin-filter-replace": "0.1.14", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 58ac5eb86..6ad7767d5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -467,14 +467,14 @@ importers: specifier: 3.0.0 version: 3.0.0 vite: - specifier: 6.3.4 - version: 6.3.4(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0) + specifier: 6.3.6 + version: 6.3.6(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0) vite-bundle-visualizer: specifier: 1.0.1 version: 1.0.1(rollup@2.79.2) vite-plugin-checker: specifier: 0.7.2 - version: 0.7.2(eslint@8.57.1)(optionator@0.9.4)(typescript@5.5.4)(vite@6.3.4(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0)) + version: 0.7.2(eslint@8.57.1)(optionator@0.9.4)(typescript@5.5.4)(vite@6.3.6(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0)) vite-plugin-filter-replace: specifier: 0.1.14 version: 0.1.14 @@ -483,16 +483,16 @@ importers: version: 1.1.2 vite-plugin-inspect: specifier: 11.0.0 - version: 11.0.0(vite@6.3.4(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0)) + version: 11.0.0(vite@6.3.6(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0)) vite-plugin-minify: specifier: 2.1.0 - version: 2.1.0(vite@6.3.4(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0)) + version: 2.1.0(vite@6.3.6(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0)) vite-plugin-oxlint: specifier: 1.3.1 - version: 1.3.1(vite@6.3.4(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0)) + version: 1.3.1(vite@6.3.6(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0)) vite-plugin-pwa: specifier: 1.0.0 - version: 1.0.0(vite@6.3.4(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0))(workbox-build@7.1.1)(workbox-window@7.1.0) + version: 1.0.0(vite@6.3.6(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0))(workbox-build@7.1.1)(workbox-window@7.1.0) vitest: specifier: 3.2.4 version: 3.2.4(@types/node@20.14.11)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0) @@ -9447,6 +9447,46 @@ packages: yaml: optional: true + vite@6.3.6: + resolution: {integrity: sha512-0msEVHJEScQbhkbVTb/4iHZdJ6SXp/AvxL2sjwYQFfBqleHtnCqv1J3sa9zbWz/6kW1m9Tfzn92vW+kZ1WV6QA==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + vitest@3.2.4: resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} @@ -14120,10 +14160,6 @@ snapshots: dependencies: ms: 2.1.2 - debug@4.3.6: - dependencies: - ms: 2.1.2 - debug@4.3.6(supports-color@5.5.0): dependencies: ms: 2.1.2 @@ -16657,7 +16693,7 @@ snapshots: chalk: 5.2.0 cli-truncate: 3.1.0 commander: 10.0.1 - debug: 4.3.6 + debug: 4.3.6(supports-color@5.5.0) execa: 7.2.0 lilconfig: 2.1.0 listr2: 5.0.8 @@ -20055,15 +20091,15 @@ snapshots: - rollup - supports-color - vite-dev-rpc@1.0.7(vite@6.3.4(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0)): + vite-dev-rpc@1.0.7(vite@6.3.6(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0)): dependencies: birpc: 2.3.0 - vite: 6.3.4(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0) - vite-hot-client: 2.0.4(vite@6.3.4(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0)) + vite: 6.3.6(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0) + vite-hot-client: 2.0.4(vite@6.3.6(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0)) - vite-hot-client@2.0.4(vite@6.3.4(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0)): + vite-hot-client@2.0.4(vite@6.3.6(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0)): dependencies: - vite: 6.3.4(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0) + vite: 6.3.6(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0) vite-node@3.2.4(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0): dependencies: @@ -20071,7 +20107,7 @@ snapshots: debug: 4.4.1 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 6.3.4(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0) + vite: 6.3.6(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0) transitivePeerDependencies: - '@types/node' - jiti @@ -20092,7 +20128,7 @@ snapshots: debug: 4.4.1 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 6.3.4(@types/node@20.5.1)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0) + vite: 6.3.6(@types/node@20.5.1)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0) transitivePeerDependencies: - '@types/node' - jiti @@ -20107,7 +20143,7 @@ snapshots: - tsx - yaml - vite-plugin-checker@0.7.2(eslint@8.57.1)(optionator@0.9.4)(typescript@5.5.4)(vite@6.3.4(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0)): + vite-plugin-checker@0.7.2(eslint@8.57.1)(optionator@0.9.4)(typescript@5.5.4)(vite@6.3.6(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0)): dependencies: '@babel/code-frame': 7.24.7 ansi-escapes: 4.3.2 @@ -20119,7 +20155,7 @@ snapshots: npm-run-path: 4.0.1 strip-ansi: 6.0.1 tiny-invariant: 1.3.3 - vite: 6.3.4(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0) + vite: 6.3.6(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0) vscode-languageclient: 7.0.0 vscode-languageserver: 7.0.0 vscode-languageserver-textdocument: 1.0.11 @@ -20135,7 +20171,7 @@ snapshots: vite-plugin-html-inject@1.1.2: {} - vite-plugin-inspect@11.0.0(vite@6.3.4(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0)): + vite-plugin-inspect@11.0.0(vite@6.3.6(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0)): dependencies: ansis: 3.17.0 debug: 4.4.0 @@ -20145,29 +20181,29 @@ snapshots: perfect-debounce: 1.0.0 sirv: 3.0.1 unplugin-utils: 0.2.4 - vite: 6.3.4(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0) - vite-dev-rpc: 1.0.7(vite@6.3.4(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0)) + vite: 6.3.6(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0) + vite-dev-rpc: 1.0.7(vite@6.3.6(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0)) transitivePeerDependencies: - supports-color - vite-plugin-minify@2.1.0(vite@6.3.4(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0)): + vite-plugin-minify@2.1.0(vite@6.3.6(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0)): dependencies: '@types/html-minifier-terser': 7.0.2 html-minifier-terser: 7.2.0 - vite: 6.3.4(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0) + vite: 6.3.6(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0) - vite-plugin-oxlint@1.3.1(vite@6.3.4(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0)): + vite-plugin-oxlint@1.3.1(vite@6.3.6(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0)): dependencies: oxlint: 0.16.12 package-manager-detector: 1.1.0 - vite: 6.3.4(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0) + vite: 6.3.6(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0) - vite-plugin-pwa@1.0.0(vite@6.3.4(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0))(workbox-build@7.1.1)(workbox-window@7.1.0): + vite-plugin-pwa@1.0.0(vite@6.3.6(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0))(workbox-build@7.1.1)(workbox-window@7.1.0): dependencies: debug: 4.4.0 pretty-bytes: 6.1.1 tinyglobby: 0.2.12 - vite: 6.3.4(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0) + vite: 6.3.6(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0) workbox-build: 7.1.1 workbox-window: 7.1.0 transitivePeerDependencies: @@ -20205,6 +20241,38 @@ snapshots: tsx: 4.16.2 yaml: 2.5.0 + vite@6.3.6(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0): + dependencies: + esbuild: 0.25.0 + fdir: 6.4.4(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.3 + rollup: 4.40.0 + tinyglobby: 0.2.14 + optionalDependencies: + '@types/node': 20.14.11 + fsevents: 2.3.3 + sass: 1.70.0 + terser: 5.43.1 + tsx: 4.16.2 + yaml: 2.5.0 + + vite@6.3.6(@types/node@20.5.1)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0): + dependencies: + esbuild: 0.25.0 + fdir: 6.4.4(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.3 + rollup: 4.40.0 + tinyglobby: 0.2.14 + optionalDependencies: + '@types/node': 20.5.1 + fsevents: 2.3.3 + sass: 1.70.0 + terser: 5.43.1 + tsx: 4.16.2 + yaml: 2.5.0 + vitest@3.2.4(@types/node@20.14.11)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0): dependencies: '@types/chai': 5.2.2 From 1512e46dfcaf0693778a41430b9f3a6250ab7228 Mon Sep 17 00:00:00 2001 From: Miodec Date: Wed, 10 Sep 2025 12:39:29 +0200 Subject: [PATCH 2/4] chore: update debug function --- frontend/src/ts/utils/debug.ts | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/frontend/src/ts/utils/debug.ts b/frontend/src/ts/utils/debug.ts index 0cd1667e3..91f23f41f 100644 --- a/frontend/src/ts/utils/debug.ts +++ b/frontend/src/ts/utils/debug.ts @@ -52,13 +52,20 @@ function logTiming(start: number, funcName: string): void { count: arr.length, }); const endOverhead = performance.now(); - //@ts-expect-error chrome api thingy - console.timeStamp(`#${arr.length} ${funcName}`, start, end, funcName); + console.timeStamp( + `#${arr.length} ${funcName}`, + //@ts-expect-error chrome api thingy + start, + end, + funcName, + "monkeytype" + ); console.timeStamp( `#${arr.length} profiling overhead`, //@ts-expect-error chrome api thingy end, endOverhead, - funcName + funcName, + "monkeytype" ); } From 31a7a2de0814d9ab8e563805449e4b5e2fa3f389 Mon Sep 17 00:00:00 2001 From: Miodec Date: Thu, 11 Sep 2025 12:24:35 +0200 Subject: [PATCH 3/4] fix(workspace): frontend debugging not working !nuf --- monkeytype.code-workspace | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/monkeytype.code-workspace b/monkeytype.code-workspace index f2ac30042..54185a4e5 100644 --- a/monkeytype.code-workspace +++ b/monkeytype.code-workspace @@ -56,17 +56,18 @@ { "type": "node", "request": "attach", - "name": "Debug attach backend", + "name": "Backend: Attach", "port": 9229, - "skipFiles": ["/**"] + "skipFiles": ["/**", "**/node_modules/**"] }, { - "name": "Vite Debugger", "type": "chrome", "request": "launch", + "name": "Frontend: Open and Attach", "port": 9222, - "url": "http://localhost:3000", - "webRoot": "${workspaceFolder}/frontend/src" + "skipFiles": ["**/node_modules/**"], + "webRoot": "${workspaceFolder:frontend}/src", + "url": "http://localhost:3000" } ], "compounds": [] From d1e118a01d0f8cac5f089580a87add30ed9b02ec Mon Sep 17 00:00:00 2001 From: Christian Fehmer Date: Thu, 11 Sep 2025 15:56:14 +0200 Subject: [PATCH 4/4] refactor: page loadingOptions rework (@miodec, @fehmer) (#6949) Co-authored-by: Miodec --- frontend/src/ts/auth.ts | 10 ++-- .../src/ts/controllers/page-controller.ts | 48 +++++++++++-------- frontend/src/ts/pages/account.ts | 10 ++-- frontend/src/ts/pages/page.ts | 12 +++-- 4 files changed, 51 insertions(+), 29 deletions(-) diff --git a/frontend/src/ts/auth.ts b/frontend/src/ts/auth.ts index 68c159a53..04d0ec3cb 100644 --- a/frontend/src/ts/auth.ts +++ b/frontend/src/ts/auth.ts @@ -170,10 +170,14 @@ export async function onAuthStateChanged( await navigate(undefined, { force: true, loadingOptions: { - shouldLoad: () => { - return user !== null; + loadingMode: () => { + if (user !== null) { + return "sync"; + } else { + return "none"; + } }, - waitFor: async () => { + loadingPromise: async () => { await userPromise; }, style: "bar", diff --git a/frontend/src/ts/controllers/page-controller.ts b/frontend/src/ts/controllers/page-controller.ts index 8fcf84fed..90ff97724 100644 --- a/frontend/src/ts/controllers/page-controller.ts +++ b/frontend/src/ts/controllers/page-controller.ts @@ -50,7 +50,7 @@ function updateTitle(nextPage: { id: string; display?: string }): void { } } -async function showLoading({ +async function showSyncLoading({ loadingOptions, totalDuration, easingMethod, @@ -97,7 +97,7 @@ async function showLoading({ void PageLoading.updateBar(100, 125); PageLoading.updateText("Done"); } else { - await options.waitFor(); + await options.loadingPromise(); } } @@ -123,7 +123,7 @@ async function getLoadingPromiseWithBarKeyframes( fillOffset: number ): Promise { let aborted = false; - let loadingPromise = loadingOptions.waitFor(); + let loadingPromise = loadingOptions.loadingPromise(); // Animate bar keyframes, but allow aborting if loading.promise finishes first const keyframePromise = (async () => { @@ -214,28 +214,25 @@ export async function change( previousPage.element.addClass("hidden"); await previousPage?.afterHide(); + // we need to evaluate and store next page loading mode in case options.loadingOptions.loadingMode is sync + const nextPageLoadingMode = nextPage.loadingOptions?.loadingMode(); + //show loading page if needed try { - let loadingOptions: LoadingOptions[] = []; - if (options.loadingOptions) { - loadingOptions.push(options.loadingOptions); + let syncLoadingOptions: LoadingOptions[] = []; + if (options.loadingOptions?.loadingMode() === "sync") { + syncLoadingOptions.push(options.loadingOptions); } - if (nextPage.loadingOptions) { - loadingOptions.push(nextPage.loadingOptions); + if (nextPage.loadingOptions?.loadingMode() === "sync") { + syncLoadingOptions.push(nextPage.loadingOptions); } - if (loadingOptions.length > 0) { - const shouldShowLoading = - options.loadingOptions?.shouldLoad() || - nextPage.loadingOptions?.shouldLoad(); - - if (shouldShowLoading === true) { - await showLoading({ - loadingOptions, - totalDuration, - easingMethod, - }); - } + if (syncLoadingOptions.length > 0) { + await showSyncLoading({ + loadingOptions: syncLoadingOptions, + totalDuration, + easingMethod, + }); } } catch (error) { pages.loading.element.addClass("active"); @@ -263,6 +260,17 @@ export async function change( // @ts-expect-error for the future (i think) data: options.data, }); + + if ( + typeof nextPageLoadingMode === "object" && + nextPageLoadingMode.mode === "async" + ) { + nextPageLoadingMode.beforeLoading(); + void nextPage?.loadingOptions?.loadingPromise().then(() => { + nextPageLoadingMode.afterLoading(); + }); + } + nextPage.element.removeClass("hidden").css("opacity", 0); await Misc.promiseAnimation( nextPage.element, diff --git a/frontend/src/ts/pages/account.ts b/frontend/src/ts/pages/account.ts index 734985567..338c4e11c 100644 --- a/frontend/src/ts/pages/account.ts +++ b/frontend/src/ts/pages/account.ts @@ -1323,10 +1323,14 @@ export const page = new Page({ element: $(".page.pageAccount"), path: "/account", loadingOptions: { - shouldLoad: () => { - return DB.getSnapshot()?.results === undefined; + loadingMode: () => { + if (DB.getSnapshot()?.results === undefined) { + return "sync"; + } else { + return "none"; + } }, - waitFor: async () => { + loadingPromise: async () => { if (DB.getSnapshot() === null) { throw new Error( "Looks like your account data didn't download correctly. Please refresh the page.
If this error persists, please contact support." diff --git a/frontend/src/ts/pages/page.ts b/frontend/src/ts/pages/page.ts index c889dc99f..caf112b90 100644 --- a/frontend/src/ts/pages/page.ts +++ b/frontend/src/ts/pages/page.ts @@ -24,13 +24,19 @@ type Options = { export type LoadingOptions = { /** - * Should the loading screen be shown? + * Get the loading mode for this page. + * "none" - No loading screen will be shown. + * "sync" - A loading spinner or bar (depending on style) will be shown until the page is ready. + * { mode: "async", beforeLoading, afterLoading } - The loadingPromise will be executed in the background and afterLoading called after it resolves. */ - shouldLoad: () => boolean; + loadingMode: () => + | "none" + | "sync" + | { mode: "async"; beforeLoading: () => void; afterLoading: () => void }; /** * When this promise resolves, the loading screen will be hidden. */ - waitFor: () => Promise; + loadingPromise: () => Promise; } & ( | { style: "spinner";