{{={= =}=}} import { useState } from "react"; import { Navigate, useLocation } from 'react-router' import { useAuth } from "../../auth"; import { api } from "../../../api"; import { initSession } from "../../../auth/helpers/user"; import { useEffectOnce } from "../../hooks"; import { MessageLoading, MessageError } from "../components/Message"; import { FullPageWrapper } from "../components/FullPageWrapper"; const oAuthCallbackWrapperClassName = "wasp-oauth-callback-wrapper"; export function OAuthCallbackPage() { const { error, user } = useOAuthCallbackHandler(); if (user !== undefined && user !== null) { return ; } if (error) { return ( {error} ); } return ( Please wait a moment while we log you in. ); } function useOAuthCallbackHandler() { const { data: user, isLoading: isUserLoading } = useAuth(); const [isCallbackLoading, setisCallbackLoading] = useState(true); const [error, setError] = useState(null); const location = useLocation(); async function handleCallback() { try { setisCallbackLoading(true); const query = new URLSearchParams(location.search); // If we got redirect with an error, display it to the user // and don't continue with the login process. const errorFromRedirect = query.get('error'); if (errorFromRedirect !== null) { setError(errorFromRedirect); return; } const code = location.hash.slice(1); const data = await exchangeOAuthCodeForToken({ code }); if (!isDataWithSessionId(data)) { setError("Unable to login with the OAuth provider."); return; } await initSession(data.sessionId); } catch (e: unknown) { console.error(e); setError("Unable to login with the OAuth provider."); } finally { setisCallbackLoading(false); } } useEffectOnce(() => { handleCallback(); }); return { user, error, isCallbackLoading, isUserLoading, }; } async function exchangeOAuthCodeForToken(data: { code: string }): Promise { return api.post('/auth/exchange-code', { json: data, }).json() } function isDataWithSessionId( data: unknown ): data is { sessionId: string } { const obj = data as any; return !!obj && typeof obj.sessionId === 'string' }