diff --git a/frontend/src/ts/components/mount.tsx b/frontend/src/ts/components/mount.tsx new file mode 100644 index 000000000..dd7271c1a --- /dev/null +++ b/frontend/src/ts/components/mount.tsx @@ -0,0 +1,15 @@ +import { render } from "solid-js/web"; +import { qsr } from "../utils/dom"; +import { LiveStats, LiveStatsMini } from "./test/LiveStats"; +import { getAcc, getBurst, getWpm } from "../signals/test"; + +export function mountComponents(): void { + render( + () => , + qsr("#liveStatsMini").native, + ); + render( + () => , + qsr("#liveStatsTextBottom").native, + ); +} diff --git a/frontend/src/ts/components/test/LiveStats.tsx b/frontend/src/ts/components/test/LiveStats.tsx new file mode 100644 index 000000000..915c4c837 --- /dev/null +++ b/frontend/src/ts/components/test/LiveStats.tsx @@ -0,0 +1,95 @@ +import { Accessor, createSignal, JSXElement } from "solid-js"; +import { + getLiveAccStyle, + getLiveBurstStyle, + getLiveSpeedStyle, +} from "../../signals/config"; +import { isFocused } from "../../test/focus"; +import { + useVisibilityAnimation, + VisibilityAnimationOptions, +} from "../../hooks/useVisibilityAnimation"; +import { useRefWithUtils } from "../../hooks/useRefWithUtils"; + +export function Stat(props: { + value: Accessor; + visibilityOptions: Accessor; + class?: string; +}): JSXElement { + const [ref, element] = useRefWithUtils(); + + useVisibilityAnimation(element, props.visibilityOptions); + + return ( +
+ {props.value()} +
+ ); +} + +const [miniStatsVisible, setMiniStatsVisible] = + createSignal({ + visible: false, + animate: true, + }); + +const getStatsVisible = (): VisibilityAnimationOptions => { + return { + visible: miniStatsVisible().visible && isFocused(), + animate: miniStatsVisible().animate, + }; +}; + +export { setMiniStatsVisible as setStatsVisible }; + +export function LiveStatsMini(props: { + wpm: Accessor; + acc: Accessor; + burst: Accessor; +}): JSXElement { + return ( + <> + (getLiveSpeedStyle() === "mini" ? props.wpm() : "")} + visibilityOptions={getStatsVisible} + /> + (getLiveAccStyle() === "mini" ? props.acc() : "")} + visibilityOptions={getStatsVisible} + /> + (getLiveBurstStyle() === "mini" ? props.burst() : "")} + visibilityOptions={getStatsVisible} + /> + + ); +} + +export function LiveStats(props: { + wpm: Accessor; + acc: Accessor; + burst: Accessor; +}): JSXElement { + return ( + <> + (getLiveSpeedStyle() === "text" ? props.wpm() : "")} + visibilityOptions={getStatsVisible} + /> + (getLiveAccStyle() === "text" ? props.acc() : "")} + visibilityOptions={getStatsVisible} + /> + (getLiveBurstStyle() === "text" ? props.burst() : "")} + visibilityOptions={getStatsVisible} + /> + + ); +} diff --git a/frontend/src/ts/components/test/live-stats.tsx b/frontend/src/ts/components/test/live-stats.tsx deleted file mode 100644 index 290bf0d65..000000000 --- a/frontend/src/ts/components/test/live-stats.tsx +++ /dev/null @@ -1,80 +0,0 @@ -import { createSignal } from "solid-js"; -import { qsr } from "../../utils/dom"; -import { LiveCounter } from "../../test/live-counter"; -import { render } from "solid-js/web"; -import { - getLiveAccStyle, - getLiveBurstStyle, - getLiveSpeedStyle, -} from "../../signals/config"; -import { isFocused } from "../../test/focus"; -import { VisibilityAnimationOptions } from "../../hooks/useVisibilityAnimation"; - -const [getWpm, setLiveStatWpm] = createSignal("0"); -const [getAcc, setLiveStatAcc] = createSignal("100%"); -const [getBurst, setLiveStatBurst] = createSignal("0"); - -const [statsVisible, setStatsVisible] = - createSignal({ - visible: false, - animate: true, - }); - -const getStatsVisible = (): VisibilityAnimationOptions => { - return { - visible: statsVisible().visible && isFocused(), - animate: statsVisible().animate, - }; -}; - -export { setLiveStatWpm, setLiveStatAcc, setLiveStatBurst, setStatsVisible }; - -export function mountLiveCounters(): void { - const textWrapper = qsr("#liveStatsTextBottom"); - render( - () => ( - <> - (getLiveSpeedStyle() === "text" ? getWpm() : "")} - visibilityOptions={getStatsVisible} - /> - (getLiveAccStyle() === "text" ? getAcc() : "")} - visibilityOptions={getStatsVisible} - /> - (getLiveBurstStyle() === "text" ? getBurst() : "")} - visibilityOptions={getStatsVisible} - /> - - ), - textWrapper.native, - ); - - const miniWrapper = qsr("#liveStatsMini"); - render( - () => ( - <> - (getLiveSpeedStyle() === "mini" ? getWpm() : "")} - visibilityOptions={getStatsVisible} - /> - (getLiveAccStyle() === "mini" ? getAcc() : "")} - visibilityOptions={getStatsVisible} - /> - (getLiveBurstStyle() === "mini" ? getBurst() : "")} - visibilityOptions={getStatsVisible} - /> - - ), - miniWrapper.native, - ); -} diff --git a/frontend/src/ts/index.ts b/frontend/src/ts/index.ts index f74f3104e..0ad2ffc0a 100644 --- a/frontend/src/ts/index.ts +++ b/frontend/src/ts/index.ts @@ -48,6 +48,7 @@ import "./utils/url-handler"; import "./modals/last-signed-out-result"; import { applyEngineSettings } from "./anim"; import { qs, qsa, qsr } from "./utils/dom"; +import { mountComponents } from "./components/mount"; // Lock Math.random Object.defineProperty(Math, "random", { @@ -107,3 +108,5 @@ if (isDevEnvironment()) { module.appendButton(); }); } + +mountComponents(); diff --git a/frontend/src/ts/ready.ts b/frontend/src/ts/ready.ts index 1f09edde6..7c5fe24ac 100644 --- a/frontend/src/ts/ready.ts +++ b/frontend/src/ts/ready.ts @@ -11,7 +11,6 @@ import { configLoadPromise } from "./config"; import { authPromise } from "./firebase"; import { animate } from "animejs"; import { onDOMReady, qs } from "./utils/dom"; -import { mountLiveCounters } from "./components/test/live-stats"; onDOMReady(async () => { await configLoadPromise; @@ -78,6 +77,4 @@ onDOMReady(async () => { }); } } - - mountLiveCounters(); }); diff --git a/frontend/src/ts/signals/test.ts b/frontend/src/ts/signals/test.ts new file mode 100644 index 000000000..12ff6510c --- /dev/null +++ b/frontend/src/ts/signals/test.ts @@ -0,0 +1,5 @@ +import { createSignal } from "solid-js"; + +export const [getWpm, setLiveStatWpm] = createSignal("0"); +export const [getAcc, setLiveStatAcc] = createSignal("100%"); +export const [getBurst, setLiveStatBurst] = createSignal("0"); diff --git a/frontend/src/ts/test/live-counter.tsx b/frontend/src/ts/test/live-counter.tsx deleted file mode 100644 index 4d41f8a3f..000000000 --- a/frontend/src/ts/test/live-counter.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import { Accessor, JSXElement } from "solid-js"; -import { - useVisibilityAnimation, - VisibilityAnimationOptions, -} from "../hooks/useVisibilityAnimation"; -import { useRefWithUtils } from "../hooks/useRefWithUtils"; - -export function LiveCounter(props: { - value: Accessor; - visibilityOptions?: Accessor; - class?: string; -}): JSXElement { - const [ref, element] = useRefWithUtils(); - - useVisibilityAnimation(element, props.visibilityOptions); - - return ( -
- {props.value()} -
- ); -} diff --git a/frontend/src/ts/test/test-timer.ts b/frontend/src/ts/test/test-timer.ts index 89e8981cc..19ef7c74a 100644 --- a/frontend/src/ts/test/test-timer.ts +++ b/frontend/src/ts/test/test-timer.ts @@ -21,7 +21,7 @@ import { clearLowFpsMode, setLowFpsMode } from "../anim"; import { createTimer } from "animejs"; import { requestDebouncedAnimationFrame } from "../utils/debounced-animation-frame"; import Format from "../utils/format"; -import { setLiveStatWpm } from "../components/test/live-stats"; +import { setLiveStatWpm } from "../signals/test"; let lastLoop = 0; const newTimer = createTimer({ diff --git a/frontend/src/ts/test/test-ui.ts b/frontend/src/ts/test/test-ui.ts index bf1fe9451..2d78bf9d6 100644 --- a/frontend/src/ts/test/test-ui.ts +++ b/frontend/src/ts/test/test-ui.ts @@ -55,12 +55,12 @@ import * as ModesNotice from "../elements/modes-notice"; import * as Last10Average from "../elements/last-10-average"; import * as MemoryFunboxTimer from "./funbox/memory-funbox-timer"; import { qsr } from "../utils/dom"; +import { setStatsVisible } from "../components/test/LiveStats"; import { setLiveStatAcc, setLiveStatBurst, setLiveStatWpm, - setStatsVisible, -} from "../components/test/live-stats"; +} from "../signals/test"; export const updateHintsPositionDebounced = Misc.debounceUntilResolved( updateHintsPosition,