diff --git a/src/lib/components/FireEffect.svelte b/src/lib/components/FireEffect.svelte new file mode 100644 index 0000000..481dd1f --- /dev/null +++ b/src/lib/components/FireEffect.svelte @@ -0,0 +1,376 @@ + + + +
+
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ + diff --git a/src/lib/components/StreakAura.svelte b/src/lib/components/StreakAura.svelte index c888a9e..d09d9cd 100644 --- a/src/lib/components/StreakAura.svelte +++ b/src/lib/components/StreakAura.svelte @@ -1,13 +1,21 @@
=4}> @@ -33,36 +41,13 @@ {/if} -{#if phase >= 2} -
-
- {#if phase >= 3} -
- {/if} -
-
+ {#if phase >= 2} + =4} /> + {/if} -
- {#if phase >= 3} -
- {/if} -
-
- -
- {#if phase >= 3} -
- {/if} -
-
- -
- {#if phase >= 3} -
- {/if} -
-
-{/if} + {#if burst} + =4} burst /> + {/if} {value}
diff --git a/src/lib/components/StreakCounter.svelte b/src/lib/components/StreakCounter.svelte index 8a99435..391b889 100644 --- a/src/lib/components/StreakCounter.svelte +++ b/src/lib/components/StreakCounter.svelte @@ -2,37 +2,47 @@ import { browser } from '$app/environment'; import { getRosaryStreak } from '$lib/stores/rosaryStreak.svelte'; import StreakAura from '$lib/components/StreakAura.svelte'; +import { tick, onMount } from 'svelte'; +let burst = $state(false); +let streak = $state | null>(null); interface Props { - user?: { nickname?: string } | null; + streakData?: { length: number; lastPrayed: string | null } | null; } -let { user = null }: Props = $props(); +let { streakData = null }: Props = $props(); -const streak = browser ? getRosaryStreak() : null; +// Derive display values: use store when available, fall back to server data for SSR +let displayLength = $derived(streak?.length ?? streakData?.length ?? 0); +let prayedToday = $derived(streak?.prayedToday ?? (streakData?.lastPrayed === new Date().toISOString().split('T')[0])); - -// Sync with server when user is logged in -$effect(() => { - if (browser && streak) { - streak.setLoggedIn(!!user?.nickname); - } +// Initialize store on mount (client-side only) +onMount(() => { + streak = getRosaryStreak(); + streak.initWithServerData(streakData, streakData !== null); }); + +async function pray() { + burst = true; + await tick(); + setTimeout(() => burst = false, 700); + streak?.recordPrayer(); +}
- - Tag{#if streak?.length !== 1}e{/if} + + Tag{#if displayLength !== 1}e{/if}