diff --git a/e2e/landing.spec.js b/e2e/landing.spec.js index b2be7233..8c51dbab 100644 --- a/e2e/landing.spec.js +++ b/e2e/landing.spec.js @@ -33,11 +33,5 @@ test("landing has dashboard link", async ({ page }) => { test("landing shows footer", async ({ page }) => { await page.goto("/"); - await expect(page.getByRole("contentinfo")).toBeVisible(); -}); - -test("landing has dashboard link", async ({ page }) => { - await page.goto("/"); - - await expect(page.getByRole("link", { name: "Dashboard" })).toBeVisible(); + await expect(page.getByRole("contentinfo").first()).toBeVisible(); }); diff --git a/src/components/StreakTracker.tsx b/src/components/StreakTracker.tsx index 03ef1aa1..a7b39f5d 100644 --- a/src/components/StreakTracker.tsx +++ b/src/components/StreakTracker.tsx @@ -155,6 +155,35 @@ export default function StreakTracker() { return () => clearInterval(interval); }, [lastUpdated]); + async function handleApplyFreeze() { + setFreezeLoading(true); + try { + const res = await fetch("/api/streak/freeze", { method: "POST" }); + if (!res.ok) throw new Error("Failed to apply freeze"); + + const streakUrl = + selectedAccount !== null + ? `/api/metrics/streak?accountId=${encodeURIComponent(selectedAccount)}` + : "/api/metrics/streak"; + const [streakRes, freezeRes] = await Promise.all([ + fetch(streakUrl), + fetch("/api/streak/freeze"), + ]); + const [streakData, freezeData] = await Promise.all([ + streakRes.json() as Promise, + freezeRes.json() as Promise, + ]); + setData(streakData); + setFreeze(freezeData); + toast.success("Streak freeze activated for today!"); + } catch { + toast.error("Failed to activate streak freeze."); + fetchFreeze(); + } finally { + setFreezeLoading(false); + } + } + async function handleCancelFreeze() { if (!confirmCancel) { setConfirmCancel(true); @@ -574,6 +603,34 @@ export default function StreakTracker() { )} + {!freezeLoading && !freeze?.hasFreeze && ( +
+
+ Streak Freeze +
+ + ? + +
+ A streak freeze protects your streak for one missed day. You can only use one freeze at a time. +
+
+
+
+ +
+ )} + {/* Streak Calendar Section */} {contributionData ? ( <>