From b34e73fa464fca4168ca9b3aa05c9ba0a62bcc23 Mon Sep 17 00:00:00 2001 From: itsscb Date: Tue, 15 Apr 2025 23:17:46 +0200 Subject: [PATCH] feat: extract logic into class --- src/lib/types/workouts.svelte.ts | 88 ++++++++++++++++++++++++++++++++ src/routes/+page.svelte | 44 ++++++++-------- 2 files changed, 109 insertions(+), 23 deletions(-) create mode 100644 src/lib/types/workouts.svelte.ts diff --git a/src/lib/types/workouts.svelte.ts b/src/lib/types/workouts.svelte.ts new file mode 100644 index 0000000..f2c1274 --- /dev/null +++ b/src/lib/types/workouts.svelte.ts @@ -0,0 +1,88 @@ +import { SvelteSet } from "svelte/reactivity"; + +export interface Workout { + id?: number; + date: string; + type: string; + duration_minutes: number; +} + + +export class WorkoutLog { + #types = new SvelteSet(['jogging', 'crosstrainer', 'bicycle', 'crossfit']); + #workouts = $state([]); + + get workouts(): Workout[] { + return Array.from(this.#workouts); + } + + get types() { + return Array.from(this.#types.values()); + } + + #load_from_storage() { + if (typeof localStorage === 'undefined') { + return; + } + + const storage = localStorage.getItem('workout_log'); + + if (!storage) { + return + } + const data: { + types: string[], + workouts: Workout[], + } = JSON.parse(storage); + + this.#types = new SvelteSet([...data.types]); + this.#workouts.length = 0; + this.#workouts.push(...data.workouts); + } + + #save_to_storage() { + if (typeof localStorage !== 'undefined') { + + localStorage.setItem('workout_log', this.#to_json()); + } + } + #to_json(): string { + return JSON.stringify({ + types: this.types, + workouts: this.workouts, + }); + } + constructor() { + this.#load_from_storage(); + } + + add_workout(workout: Workout) { + + + while (this.#workouts.indexOf(workout) !== -1) { + if (!workout.id) { + workout.id = 1; + continue + } + workout.id += 5; + } + this.#workouts.push(workout); + this.#types.add(workout.type.toLowerCase()) + this.#save_to_storage(); + } + + remove_workout(workout: Workout) { + //this.#workouts.delete(workout); + this.#workouts = this.#workouts.filter(i => i !== workout); + this.#save_to_storage(); + } + + remove_type(type: string) { + this.#types.delete(type); + this.#save_to_storage(); + } + + +} + +export default WorkoutLog; diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 0be6e89..0279eb8 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -1,10 +1,9 @@ -

FitLog (0.0.3)

+

FitLog (0.0.4)

@@ -64,12 +53,20 @@ + /> + + + {#each log.types as value} + + {/each} + + - {#if workouts.length < 1} + {#if log.workouts.length < 1} {:else} - {#each workouts as wk, i} + {#each log.workouts as wk, i} - +

No entries.. yet!

{wk.date}{wk.workout_type}{wk.type} {wk.duration_minutes} { e.stopPropagation(); e.preventDefault(); - deleteRow(i); + log.remove_workout(wk); }} >