import React from 'react'; import { useNavigate } from 'react-router-dom'; import { useTranslation } from 'react-i18next'; import { Card } from '@tamagui/card'; import { YStack } from '@tamagui/stacks'; import { SizableText as Text } from '@tamagui/text'; import { Spinner } from 'tamagui'; import { useAuth } from '../auth/context'; import { ADMIN_DEFAULT_AFTER_LOGIN_PATH } from '../constants'; import { decodeReturnTo, resolveReturnTarget } from '../lib/returnTo'; import { useAdminTheme } from './theme'; import { useDocumentTitle } from './hooks/useDocumentTitle'; export default function AuthCallbackPage(): React.ReactElement { const { status } = useAuth(); const navigate = useNavigate(); const { t } = useTranslation('auth'); const [redirected, setRedirected] = React.useState(false); const { textStrong, muted, border, surface, shadow, appBackground } = useAdminTheme(); const safeAreaStyle: React.CSSProperties = { paddingTop: 'calc(env(safe-area-inset-top, 0px) + 16px)', paddingBottom: 'calc(env(safe-area-inset-bottom, 0px) + 16px)', }; useDocumentTitle(t('processing.title', 'Signing you in …')); const searchParams = React.useMemo(() => new URLSearchParams(window.location.search), []); const rawReturnTo = searchParams.get('return_to'); const fallback = ADMIN_DEFAULT_AFTER_LOGIN_PATH; const destination = React.useMemo(() => { if (rawReturnTo) { const decoded = decodeReturnTo(rawReturnTo); if (decoded) { return decoded; } } return resolveReturnTarget(null, fallback).finalTarget; }, [fallback, rawReturnTo]); React.useEffect(() => { if (status !== 'authenticated' || redirected) { return; } setRedirected(true); navigate(destination, { replace: true }); }, [destination, navigate, redirected, status]); return ( {t('processing.title', 'Signing you in …')} {t('processing.copy', 'One moment please while we prepare your dashboard.')} ); }