From fc177c16a58662be91bca4070be803df46a08c11 Mon Sep 17 00:00:00 2001 From: Stian Fredrik Aune Date: Mon, 3 Apr 2023 23:05:32 +0200 Subject: [PATCH] =?UTF-8?q?Statistikkblokk=20p=C3=A5=20Venstre/h=C3=B8yre?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- webui-react/src/hooks/storage.ts | 31 +++++++++++++++++++++++++++++ webui-react/src/pages/IndexPage.tsx | 14 +++++++++++++ webui-react/src/pages/PlayPage.tsx | 4 +++- 3 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 webui-react/src/hooks/storage.ts diff --git a/webui-react/src/hooks/storage.ts b/webui-react/src/hooks/storage.ts new file mode 100644 index 0000000..9630dd9 --- /dev/null +++ b/webui-react/src/hooks/storage.ts @@ -0,0 +1,31 @@ +import {Dispatch, SetStateAction, useEffect, useState} from "react"; + +function loadData(key: string, defValue: T): T { + const newData = window.localStorage.getItem(`ykonsole2.${key}`); + if (newData === null) { + return defValue; + } + + return JSON.parse(newData) as T; +} + +export default function useLocalStorage(key: string, defValue: T): [T, Dispatch>] { + const [data, setData] = useState(() => loadData(key, defValue)); + + useEffect(() => { + window.localStorage.setItem(`ykonsole2.${key}`, JSON.stringify(data)); + }, [key, data]); + + useEffect(() => { + const callback = () => { + setData(loadData(key, defValue)); + }; + + window.addEventListener("storage", callback); + return () => { + window.removeEventListener("storage", callback); + }; + }, [key, defValue]); + + return [data, setData]; +} \ No newline at end of file diff --git a/webui-react/src/pages/IndexPage.tsx b/webui-react/src/pages/IndexPage.tsx index 205d212..1f002bf 100644 --- a/webui-react/src/pages/IndexPage.tsx +++ b/webui-react/src/pages/IndexPage.tsx @@ -17,12 +17,14 @@ import {colorOf, WorkoutStatus} from "../models/Workouts"; import {faSpinner} from "@fortawesome/free-solid-svg-icons/faSpinner"; import {useKey} from "../hooks/keyboard"; import {Boi} from "../primitives/boi/Boi"; +import useLocalStorage from "../hooks/storage"; export default function IndexPage(): JSX.Element { const {devices} = useContext(DeviceContext); const {programs} = useContext(ProgramContext); const {workouts, loadingWorkouts, expanded, showMoreWorkouts, refreshWorkouts} = useContext(WorkoutContext); const navigate = useNavigate(); + const [statPos, setStatPos] = useLocalStorage<"left" | "right">("stats.position", "left"); const isRunning = useMemo(() => workouts.some(w => w.status !== WorkoutStatus.Disconnected), [workouts]); @@ -112,6 +114,18 @@ export default function IndexPage(): JSX.Element { Legg til + + Plassering på statistikblokk + setStatPos("left")} color={statPos === "left" ? "blue" : "gray"}> + + Til venstre + + + setStatPos("right")} color={statPos === "right" ? "blue" : "gray"}> + + Til høyre + + diff --git a/webui-react/src/pages/PlayPage.tsx b/webui-react/src/pages/PlayPage.tsx index 044826c..5f2fb03 100644 --- a/webui-react/src/pages/PlayPage.tsx +++ b/webui-react/src/pages/PlayPage.tsx @@ -20,6 +20,7 @@ import MessageBoi from "./runtime/MessageBoi"; import ProgramBoi from "./runtime/ProgramBoi"; import MilestoneBoi from "./runtime/MilestoneBoi"; import {useKpm} from "../hooks/kpm"; +import useLocalStorage from "../hooks/storage"; function PlayPage(): JSX.Element { const {active, ready, ended, workout, reset, resume} = useContext(RuntimeContext); @@ -178,6 +179,7 @@ function RunPlayPage(): JSX.Element { const {workout} = useContext(RuntimeContext); const lastState = useLastState(); const kpm = useKpm(); + const [statPos] = useLocalStorage<"left" | "right">("stats.position", "left"); if (!workout || workout.status === WorkoutStatus.Created) { return ; @@ -187,7 +189,7 @@ function RunPlayPage(): JSX.Element { {lastState && ( - +