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 (
);
}
return (
);
};
export default AuthLayout;