From bc26331a8e0a5017bc3fd95c19e8294574079c5b Mon Sep 17 00:00:00 2001 From: Miodec Date: Wed, 18 Mar 2026 15:59:57 +0100 Subject: [PATCH 1/7] chore: import via alias instead of using relative path --- frontend/src/ts/db.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/ts/db.ts b/frontend/src/ts/db.ts index 3a1515cd62f1..8ecb8255327d 100644 --- a/frontend/src/ts/db.ts +++ b/frontend/src/ts/db.ts @@ -26,7 +26,6 @@ import { SnapshotResult, SnapshotUserTag, } from "./constants/default-snapshot"; -import { FunboxMetadata } from "../../../packages/funbox/src/types"; import { getFirstDayOfTheWeek } from "./utils/date-and-time"; import { Language } from "@monkeytype/schemas/languages"; import * as AuthEvent from "./observables/auth-event"; @@ -41,6 +40,7 @@ import { } from "./states/snapshot"; import { XpBreakdown } from "@monkeytype/schemas/results"; import { setXpBarData } from "./states/header"; +import { FunboxMetadata } from "@monkeytype/funbox"; let dbSnapshot: Snapshot | undefined; const firstDayOfTheWeek = getFirstDayOfTheWeek(); From 950eca550896ade6a4d54a707b5a871a9ad7fc0f Mon Sep 17 00:00:00 2001 From: Miodec Date: Wed, 18 Mar 2026 16:08:17 +0100 Subject: [PATCH 2/7] event rewrite --- .../components/layout/header/AccountXpBar.tsx | 23 ++++--- .../src/ts/components/layout/header/Logo.tsx | 4 +- .../src/ts/components/layout/header/Nav.tsx | 4 +- frontend/src/ts/hooks/createEvent.ts | 68 ++++++++++++------- frontend/src/ts/states/core.ts | 2 +- frontend/src/ts/states/header.ts | 2 +- frontend/src/ts/test/test-logic.ts | 5 +- frontend/src/ts/test/test-ui.ts | 4 +- 8 files changed, 69 insertions(+), 43 deletions(-) diff --git a/frontend/src/ts/components/layout/header/AccountXpBar.tsx b/frontend/src/ts/components/layout/header/AccountXpBar.tsx index 0e95cd5e84e7..06988455bb60 100644 --- a/frontend/src/ts/components/layout/header/AccountXpBar.tsx +++ b/frontend/src/ts/components/layout/header/AccountXpBar.tsx @@ -1,7 +1,6 @@ import { XpBreakdown } from "@monkeytype/schemas/results"; import { isSafeNumber } from "@monkeytype/util/numbers"; import { - createMemo, createSignal, For, JSXElement, @@ -14,7 +13,7 @@ import { createSignalWithSetters } from "../../../hooks/createSignalWithSetters" import { createEffectOn } from "../../../hooks/effects"; import { getFocus } from "../../../states/core"; import { - getSkipBreakdownEvent, + skipBreakdownEvent, getXpBarData, setAnimatedLevel, } from "../../../states/header"; @@ -38,11 +37,11 @@ export function AccountXpBar(): JSXElement { const [getBarAnimationDuration, setBarAnimationDuration] = createSignal(0); const [getBarAnimationEase, setBarAnimationEase] = createSignal("out(5)"); - const [getAnimationEvent, fireAnimationEvent] = createEvent(); + const animationEvent = createEvent(); const [getTotal, { setTotal }] = createSignalWithSetters(0)({ setTotal: (set, value: number) => { set(value); - fireAnimationEvent(); + animationEvent.dispatch(); }, }); @@ -54,23 +53,29 @@ export function AccountXpBar(): JSXElement { let skipped = false; let runId = 0; - const flashAnimation = createMemo(() => { - getAnimationEvent(); // trigger on every total update, even if value unchanged + const [flashAnimation, setFlashAnimation] = createSignal({ + scale: [1, 1], + rotate: [0, 0], + duration: 2000, + ease: "out(5)", + }); + + animationEvent.useListener(() => { const rand = (Math.random() * 2 - 1) / 4; const rand2 = (Math.random() + 1) / 2; - return { + setFlashAnimation({ scale: [1 + 0.5 * rand2, 1], rotate: [10 * rand, 0], duration: 2000, ease: "out(5)", - }; + }); }); const addItem = (label: string, amount: number | string): void => { setBreakdownItems((items) => [...items, { label, amount }]); }; - createEffectOn(getSkipBreakdownEvent, async () => { + skipBreakdownEvent.useListener(async () => { if (skipped || !canSkip) return; const myId = runId; // capture before first await diff --git a/frontend/src/ts/components/layout/header/Logo.tsx b/frontend/src/ts/components/layout/header/Logo.tsx index bc838e360b53..41127879c8c2 100644 --- a/frontend/src/ts/components/layout/header/Logo.tsx +++ b/frontend/src/ts/components/layout/header/Logo.tsx @@ -1,7 +1,7 @@ import { JSXElement } from "solid-js"; import { - dispatchRestartTest, + restartTestEvent, getActivePage, getFocus, } from "../../../states/core"; @@ -21,7 +21,7 @@ export function Logo(): JSXElement { }} data-ui-element="logo" onClick={() => { - if (getActivePage() === "test") dispatchRestartTest(); + if (getActivePage() === "test") restartTestEvent.dispatch(); }} > { - if (getActivePage() === "test") dispatchRestartTest(); + if (getActivePage() === "test") restartTestEvent.dispatch(); }} />