import { useDbStore } from "@/store/db"; import { useAuth } from "@/store/auth"; import { useEffect, useMemo } from "react"; import { Navigate, Outlet, useLocation, useNavigate, useSearchParams, } from "react-router"; import BackgroundLayout from "./BackgroundLayout"; import { useOAuth } from "@/store/oauth"; const AuthLayout = () => { const { connecting, db, connect } = useDbStore(); const [searchParams] = useSearchParams(); const parseSearchParams = useOAuth((state) => state.parseSearchParams); const dbConnected = useMemo(() => !!db, [db]); const loadingAccounts = useAuth((state) => state.loadingAccounts); const loadAccounts = useAuth((state) => state.loadAccounts); const hasLoadedAccounts = useAuth((state) => state.hasLoadedAccounts); const activeAccount = useAuth((state) => state.activeAccount); const hasAccounts = useAuth((state) => state.accounts.length > 0); const authenticating = useAuth((state) => state.authenticating); const authenticate = useAuth((state) => state.authenticate); const hasAuthenticated = useAuth((state) => state.hasAuthenticated); const signInRequired = useAuth((state) => state.signInRequired); const location = useLocation(); const navigate = useNavigate(); const isAuthPage = useMemo(() => { const pathname = location.pathname.replace(/\/$/i, ""); return pathname !== "/auth" && pathname.startsWith("/auth"); }, [location.pathname]); const loading = useMemo(() => { if (isAuthPage) { return connecting; } return ( !hasAuthenticated || !hasLoadedAccounts || loadingAccounts || authenticating || connecting ); }, [ isAuthPage, hasAuthenticated, hasLoadedAccounts, loadingAccounts, authenticating, connecting, ]); // OAuth useEffect(() => { console.log( "parsing url search params:", Object.fromEntries(searchParams.entries()), ); parseSearchParams(searchParams); }, [parseSearchParams, searchParams]); // Database useEffect(() => { connect(); }, [connect]); // Account Manager useEffect(() => { if (dbConnected) { loadAccounts(); } }, [dbConnected, loadAccounts]); // Fetch Profile useEffect(() => { if (dbConnected && !loadingAccounts && activeAccount) { authenticate(); } }, [activeAccount, dbConnected, authenticate, loadingAccounts]); useEffect(() => { if (!signInRequired && isAuthPage) { const to = location.state?.from ?? "/"; navigate(to, { state: { reset: true } }); } }, [isAuthPage, location.state?.from, navigate, signInRequired]); if (signInRequired && !isAuthPage) { return ( ); } if (loading) { return (
Loading...

Loading...

); } return ( ); }; export default AuthLayout;