Files
drive/apps/drive-web/src/routes/_authenticated.tsx

72 lines
1.8 KiB
TypeScript
Raw Normal View History

2025-09-14 23:23:15 +00:00
import {
createFileRoute,
Navigate,
Outlet,
useLocation,
} from "@tanstack/react-router"
import {
Authenticated,
AuthLoading,
Unauthenticated,
useConvexAuth,
} from "convex/react"
import { useEffect, useState } from "react"
import { authClient, SessionContext } from "@/auth"
2025-09-14 23:23:15 +00:00
import { LoadingSpinner } from "@/components/ui/loading-spinner"
2025-09-14 21:46:38 +00:00
export const Route = createFileRoute("/_authenticated")({
component: AuthenticatedLayout,
})
function AuthenticatedLayout() {
2025-09-14 23:23:15 +00:00
const { search } = useLocation()
const { isLoading, isAuthenticated } = useConvexAuth()
const { data: session, isPending: sessionLoading } = authClient.useSession()
2025-09-14 23:23:15 +00:00
const [hasProcessedAuth, setHasProcessedAuth] = useState(false)
// Check if we're in the middle of processing an auth code
const hasAuthCode = search && typeof search === "object" && "code" in search
// Track when auth processing is complete
useEffect(() => {
if (!sessionLoading && !isLoading) {
2025-09-14 23:23:15 +00:00
// Delay to ensure auth state is fully synchronized
const timer = setTimeout(() => {
setHasProcessedAuth(true)
}, 0)
2025-09-14 23:23:15 +00:00
return () => clearTimeout(timer)
}
}, [sessionLoading, isLoading])
2025-09-14 23:23:15 +00:00
// Show loading during auth code processing or while auth state is syncing
if (hasAuthCode || sessionLoading || isLoading || !hasProcessedAuth) {
2025-09-14 23:23:15 +00:00
return (
<div className="flex h-screen w-full items-center justify-center">
<LoadingSpinner className="size-10" />
</div>
)
}
2025-09-14 21:46:38 +00:00
return (
<>
<Authenticated>
{session ? (
<SessionContext value={session}>
<Outlet />
</SessionContext>
) : (
<Outlet />
)}
2025-09-14 21:46:38 +00:00
</Authenticated>
<Unauthenticated>
<Navigate replace to="/login" />
2025-09-14 21:46:38 +00:00
</Unauthenticated>
2025-09-14 23:23:15 +00:00
<AuthLoading>
<div className="flex h-screen w-full items-center justify-center">
<LoadingSpinner className="size-10" />
</div>
</AuthLoading>
2025-09-14 21:46:38 +00:00
</>
)
}