"use client" import { useEffect } from "react" import { usePathname, useRouter, useSearchParams } from "next/navigation" import { useAuth } from "@lib/auth-context" import { Loader2 } from "lucide-react" function WorkspaceLoadingShell() { return (
) } export function EnsureWorkspace({ children }: { children: React.ReactNode }) { const pathname = usePathname() const router = useRouter() const searchParams = useSearchParams() const { session, organizations, isRestoring, isSessionPending } = useAuth() const isPublicAppPage = pathname === "/integrations" || pathname === "/integrations/mcp" || (pathname === "/" && ["integrations", "mcp"].includes(searchParams.get("view") ?? "")) const isGuestPublicAppPage = isPublicAppPage && !session && !isSessionPending // /brain is the Slack-first Company Brain entry: it creates the org itself. const isOnboarding = pathname.startsWith("/onboarding") || pathname === "/brain" || pathname.startsWith("/brain/") useEffect(() => { if (isGuestPublicAppPage) return if (isRestoring) return if (!session) { router.replace( `/login?redirect=${encodeURIComponent(window.location.href)}`, ) return } if (organizations === null) return if (organizations.length > 0) return if (isOnboarding) return router.replace("/onboarding") }, [ session, organizations, isRestoring, isOnboarding, router, isGuestPublicAppPage, ]) const showLoading = !isGuestPublicAppPage && (isRestoring || (!session && !isRestoring) || (session && organizations === null) || (session && organizations !== null && organizations.length === 0 && !isOnboarding)) if (showLoading) { return } return children }