import { createClient } from "@/lib/supabase/server"; import { redirect } from "next/navigation"; import { createClient as createAdminClient } from "@supabase/supabase-js"; import { cookies } from "next/headers"; import { createOrganization } from "./actions"; import { Suspense } from "react"; async function OnboardingContent() { const supabase = await createClient(); const { data } = await supabase.auth.getUser(); if (!data?.user) { redirect("/auth/login"); } // If already in an org, redirect to dashboard const { data: profile } = await supabase .from("profiles") .select("organization_id") .eq("id", data.user.id) .single(); if (profile?.organization_id) { redirect("/dashboard"); } // Check for invite token cookie const cookieStore = await cookies(); const token = cookieStore.get("invite_token")?.value; if (token) { const supabaseAdmin = createAdminClient( process.env.NEXT_PUBLIC_SUPABASE_URL!, process.env.SUPABASE_SERVICE_ROLE_KEY! ); // Attempt to redeem it automatically const { data: invite } = await supabaseAdmin .from("invitations") .select("*") .eq("token", token) .eq("status", "pending") .single(); if (invite && new Date(invite.expires_at) > new Date()) { await supabase.from("profiles").update({ organization_id: invite.organization_id, role: "member" }).eq("id", data.user.id); await supabaseAdmin.from("invitations").update({ status: "accepted" }).eq("id", invite.id); // Optional: Clear the cookie, but next redirect will naturally ignore it since organization_id is set redirect("/dashboard"); } } return (

Welcome

Let's get started by creating an organization for your team.

Waiting for an invite? Ask your team owner to send you a link.
); } export default function OnboardingPage() { return ( Loading...}> ); }