refactor: store selected week in a cookie, not the URL
Build and Deploy / Build & Push (push) Successful in 1m7s
Build and Deploy / Build & Push (push) Successful in 1m7s
The home page no longer reads ?week=YYYY-MM-DD from the URL. Selected week lives in the tcWeek cookie, set via a server action that revalidates the home page so the next render reflects it. The URL stays at "/" regardless of which week the user is viewing. WeekNav prev/next/today buttons (and the arrow-key bindings) call the server action directly — no router.refresh dance, no client-side cookie write. BackToCalendarLink drops its localStorage-based href reconstruction and just links to "/" since the cookie already remembers the right week across navigations. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,29 @@
|
||||
"use server";
|
||||
|
||||
import { cookies } from "next/headers";
|
||||
import { revalidatePath } from "next/cache";
|
||||
|
||||
const WEEK_COOKIE = "tcWeek";
|
||||
const MAX_AGE = 60 * 60 * 24 * 30; // 30 days
|
||||
|
||||
/**
|
||||
* Persist the selected week start (YYYY-MM-DD) in a server-readable cookie
|
||||
* and revalidate the home page so the new week renders.
|
||||
*/
|
||||
export async function setWeek(weekStart: string): Promise<void> {
|
||||
if (!/^\d{4}-\d{2}-\d{2}$/.test(weekStart)) return;
|
||||
const cookieStore = await cookies();
|
||||
cookieStore.set(WEEK_COOKIE, weekStart, {
|
||||
path: "/",
|
||||
maxAge: MAX_AGE,
|
||||
sameSite: "lax",
|
||||
});
|
||||
revalidatePath("/");
|
||||
}
|
||||
|
||||
/** Clear the saved week — used by the "Today" button to jump back to current. */
|
||||
export async function clearWeek(): Promise<void> {
|
||||
const cookieStore = await cookies();
|
||||
cookieStore.delete(WEEK_COOKIE);
|
||||
revalidatePath("/");
|
||||
}
|
||||
+8
-9
@@ -1,15 +1,14 @@
|
||||
import { cookies } from "next/headers";
|
||||
import { HomePageClient } from "@/components/HomePageClient";
|
||||
import { getTodayLocal, formatDateLocal } from "@/lib/env";
|
||||
|
||||
const BACKEND_URL = process.env.BACKEND_URL ?? "http://localhost:3001";
|
||||
|
||||
interface PageProps {
|
||||
searchParams: Promise<{ week?: string }>;
|
||||
}
|
||||
const WEEK_COOKIE = "tcWeek";
|
||||
|
||||
function getWeekStart(param: string | undefined): string {
|
||||
if (param && /^\d{4}-\d{2}-\d{2}$/.test(param)) {
|
||||
const d = new Date(param + "T00:00:00");
|
||||
function getWeekStart(saved: string | undefined): string {
|
||||
if (saved && /^\d{4}-\d{2}-\d{2}$/.test(saved)) {
|
||||
const d = new Date(saved + "T00:00:00");
|
||||
if (!isNaN(d.getTime())) {
|
||||
d.setDate(d.getDate() - d.getDay());
|
||||
return formatDateLocal(d);
|
||||
@@ -21,9 +20,9 @@ function getWeekStart(param: string | undefined): string {
|
||||
return formatDateLocal(d);
|
||||
}
|
||||
|
||||
export default async function HomePage({ searchParams }: PageProps) {
|
||||
const params = await searchParams;
|
||||
const weekStart = getWeekStart(params.week);
|
||||
export default async function HomePage() {
|
||||
const saved = (await cookies()).get(WEEK_COOKIE)?.value;
|
||||
const weekStart = getWeekStart(saved);
|
||||
|
||||
const data = await fetch(
|
||||
`${BACKEND_URL}/api/calendar/week?start=${weekStart}`,
|
||||
|
||||
Reference in New Issue
Block a user