diff --git a/app/components/site-header/mobile-menu.tsx b/app/components/site-header/mobile-menu.tsx
index 37e28e9..02f17ba 100644
--- a/app/components/site-header/mobile-menu.tsx
+++ b/app/components/site-header/mobile-menu.tsx
@@ -5,6 +5,7 @@ import { signOut } from "@/actions/auth";
interface MobileMenuProps {
user: User | null;
+ isRecovery?: boolean;
open: boolean;
onClose: () => void;
}
@@ -12,7 +13,7 @@ interface MobileMenuProps {
const mobileLinkClass =
"block text-left text-base font-medium text-white/90 hover:text-white";
-export function MobileMenu({ user, open, onClose }: MobileMenuProps) {
+export function MobileMenu({ user, isRecovery = false, open, onClose }: MobileMenuProps) {
if (!open) return null;
return (
@@ -22,7 +23,7 @@ export function MobileMenu({ user, open, onClose }: MobileMenuProps) {
- {user ? (
+ {user && !isRecovery ? (
<>
Dashboard
diff --git a/app/components/site-header/site-header.tsx b/app/components/site-header/site-header.tsx
index 75cf04d..318a167 100644
--- a/app/components/site-header/site-header.tsx
+++ b/app/components/site-header/site-header.tsx
@@ -11,12 +11,13 @@ import { MobileMenu } from "./mobile-menu";
interface SiteHeaderProps {
user: User | null;
+ isRecovery?: boolean;
}
const headerCtaClass =
"inline-flex items-center gap-1.5 rounded-full bg-white px-4 text-xs font-medium uppercase tracking-wide text-neutral-950 cursor-pointer hover:bg-primary/80";
-export function SiteHeader({ user }: SiteHeaderProps) {
+export function SiteHeader({ user, isRecovery = false }: SiteHeaderProps) {
const [mobileOpen, setMobileOpen] = useState(false);
const [displayText, setDisplayText] = useState(".");
const [isTyping, setIsTyping] = useState(false);
@@ -110,18 +111,7 @@ export function SiteHeader({ user }: SiteHeaderProps) {
- {!user ? (
-
- ) : (
+ {user && !isRecovery ? (
<>
>
+ ) : (
+
)}
@@ -159,6 +160,7 @@ export function SiteHeader({ user }: SiteHeaderProps) {
setMobileOpen(false)}
/>
diff --git a/app/layout.tsx b/app/layout.tsx
index 3be9642..17ead93 100644
--- a/app/layout.tsx
+++ b/app/layout.tsx
@@ -2,6 +2,7 @@ import type { Metadata } from "next";
import { SpeedInsights } from "@vercel/speed-insights/next";
import { Analytics } from "@vercel/analytics/next";
import { createClient } from "@/lib/supabase/server";
+import { isRecoverySession } from "@/lib/auth";
import { SiteHeader } from "@/components/site-header";
import { Footer } from "@/components/footer";
import { SiteBackground } from "@/components/site-background";
@@ -50,11 +51,17 @@ export default async function RootLayout({ children }: LayoutProps) {
data: { user },
} = await supabase.auth.getUser();
+ const {
+ data: { session },
+ } = await supabase.auth.getSession();
+
+ const isRecovery = session ? isRecoverySession(session.access_token) : false;
+
return (
-
+
{children}
diff --git a/lib/auth.ts b/lib/auth.ts
new file mode 100644
index 0000000..9b7f84a
--- /dev/null
+++ b/lib/auth.ts
@@ -0,0 +1,10 @@
+export function isRecoverySession(accessToken: string): boolean {
+ try {
+ const base64 = accessToken.split(".")[1].replace(/-/g, "+").replace(/_/g, "/");
+ const payload = JSON.parse(atob(base64));
+ const amr: { method: string }[] = payload.amr ?? [];
+ return amr.length === 1 && amr[0].method === "recovery";
+ } catch {
+ return false;
+ }
+}
diff --git a/proxy.ts b/proxy.ts
index d6b138e..4bd1ceb 100644
--- a/proxy.ts
+++ b/proxy.ts
@@ -1,20 +1,10 @@
import { type NextRequest, NextResponse } from "next/server";
import { createMiddlewareClient } from "@/lib/supabase/middleware";
+import { isRecoverySession } from "@/lib/auth";
const AUTH_ROUTES = ["/login", "/signup"];
const RESET_PASSWORD_PATH = "/reset-password";
-function isRecoverySession(accessToken: string): boolean {
- try {
- const base64 = accessToken.split(".")[1].replace(/-/g, "+").replace(/_/g, "/");
- const payload = JSON.parse(atob(base64));
- const amr: { method: string }[] = payload.amr ?? [];
- return amr.length === 1 && amr[0].method === "recovery";
- } catch {
- return false;
- }
-}
-
export async function proxy(request: NextRequest) {
const { supabase, response } = createMiddlewareClient(request);
const pathname = request.nextUrl.pathname;