import { FunctionComponentWithChildren } from '../../../../common/types'; import React, { createContext, useMemo } from 'react'; import { env } from '../../../../common/env/env'; import { useAuthenticatedUserQuery } from '../../hooks/queries/useAuthenticatedUserQuery/useAuthenticatedUserQuery'; import { FullScreenLoader } from '../../../../common/components/molecules/FullScreenLoader/FullScreenLoader'; import { useRedirectToRootUrl } from '@/common/hooks/useRedirectToRootUrl/useRedirectToRootUrl'; import { useLocation } from 'react-router-dom'; import { useLocale } from '@/common/hooks/useLocale/useLocale'; export const AuthContext = createContext<{ redirectAuthenticatedTo?: string; redirectUnauthenticatedTo?: string; signInOptions?: { redirect: boolean; callbackUrl: string; }; signOutOptions?: { redirect: boolean; callbackUrl: string; }; }>(undefined); export const AuthProvider: FunctionComponentWithChildren = ({ children }) => { const { isLoading } = useAuthenticatedUserQuery(); const urlToRoot = useRedirectToRootUrl(); const { state } = useLocation(); const locale = useLocale(); const contextValues = useMemo( () => ({ redirectAuthenticatedTo: urlToRoot, redirectUnauthenticatedTo: `/${locale}/auth/sign-in`, signInOptions: { redirect: env.VITE_AUTH_ENABLED, callbackUrl: state?.from ? `${state?.from?.pathname}${state?.from?.search}` : urlToRoot, }, signOutOptions: { redirect: env.VITE_AUTH_ENABLED, callbackUrl: `/${locale}/auth/sign-in`, }, }), [locale, state?.from, urlToRoot], ); // Don't render the children to avoid a flash of wrong state (i.e. authenticated layout). if (isLoading && env.VITE_AUTH_ENABLED) return ; return {children}; };