import { createServerClient } from "@supabase/ssr"; import { NextResponse, type NextRequest } from "next/server"; const PUBLIC_PATHS = [ "/", "/login", "/signup", "/auth/callback", "/console", "/admin", "/api/payments/mpesa/callback", ]; const API_ADMIN_PATHS = ["/api/admin"]; function isPublic(pathname: string) { // API routes that use their own auth (header-based) should pass through if (pathname.startsWith("/api/")) return true; return PUBLIC_PATHS.some( (p) => pathname === p || pathname.startsWith(p + "/") ); } export async function proxy(request: NextRequest) { const { pathname } = request.nextUrl; if (isPublic(pathname)) { return NextResponse.next(); } let response = NextResponse.next({ request }); const supabase = createServerClient( process.env.NEXT_PUBLIC_SUPABASE_URL!, process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!, { cookies: { getAll() { return request.cookies.getAll(); }, setAll(tokens) { for (const { name, value, options } of tokens) { request.cookies.set(name, value); response = NextResponse.next({ request }); response.cookies.set(name, value, options); } }, }, } ); const { data: { user }, } = await supabase.auth.getUser(); if (!user) { const loginUrl = new URL("/login", request.url); loginUrl.searchParams.set("redirect", pathname); return NextResponse.redirect(loginUrl); } return response; } export const config = { matcher: [ "/((?!_next/static|_next/image|favicon.ico|manifest.json|sw.js|icons/).*)", ], };