"use client"; import { useEffect, useState } from "react"; import { Permission } from "./auth-context"; import { api } from "./api"; import { layoutStyles, cardStyles, buttonStyles } from "./styles/shared"; import { Header } from "./components/Header"; import { useRequireAuth } from "./hooks/useRequireAuth"; export default function Home() { const [count, setCount] = useState(null); const { user, isLoading, isAuthorized } = useRequireAuth({ requiredPermission: Permission.VIEW_COUNTER, }); useEffect(() => { if (user && isAuthorized) { api .get<{ value: number }>("/api/counter") .then((data) => setCount(data.value)) .catch(() => setCount(null)); } }, [user, isAuthorized]); const increment = async () => { const data = await api.post<{ value: number }>("/api/counter/increment"); setCount(data.value); }; if (isLoading) { return (
Loading...
); } if (!user || !isAuthorized) { return null; } return (
Current Count

{count === null ? "..." : count}

); } // Page-specific styles only - truly unique to this page const styles: Record = { counterCard: { ...cardStyles.card, borderRadius: "32px", padding: "4rem 5rem", textAlign: "center", }, counterLabel: { fontFamily: "'DM Sans', system-ui, sans-serif", display: "block", color: "rgba(255, 255, 255, 0.4)", fontSize: "0.875rem", textTransform: "uppercase", letterSpacing: "0.1em", marginBottom: "1rem", }, counter: { fontFamily: "'Instrument Serif', Georgia, serif", fontSize: "8rem", fontWeight: 400, color: "#fff", margin: 0, lineHeight: 1, background: "linear-gradient(135deg, #fff 0%, #a78bfa 100%)", WebkitBackgroundClip: "text", WebkitTextFillColor: "transparent", backgroundClip: "text", }, incrementBtn: { ...buttonStyles.primaryButton, marginTop: "2.5rem", padding: "1rem 2.5rem", fontSize: "1.125rem", borderRadius: "16px", display: "inline-flex", alignItems: "center", gap: "0.5rem", }, plusIcon: { fontSize: "1.5rem", fontWeight: 400, }, };