import { LogtoProvider, useLogto, UserInfoResponse } from '@logto/react'; import { signInNotificationStorageKey } from '@logto/schemas'; import { demoAppApplicationId } from '@logto/schemas/lib/seeds'; import React, { useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; import '@/scss/normalized.scss'; import * as styles from './App.module.scss'; import Callback from './Callback'; import congrats from './assets/congrats.svg'; import initI18n from './i18n/init'; void initI18n(); const Main = () => { const { isAuthenticated, fetchUserInfo, signIn, signOut } = useLogto(); const [user, setUser] = useState(); const { t } = useTranslation(undefined, { keyPrefix: 'demo_app' }); const isInCallback = Boolean(new URL(window.location.href).searchParams.get('code')); useEffect(() => { if (!isAuthenticated && !isInCallback) { sessionStorage.setItem(signInNotificationStorageKey, t('notification')); void signIn(window.location.href); } }, [isAuthenticated, isInCallback, signIn, t]); useEffect(() => { (async () => { if (isAuthenticated) { const userInfo = await fetchUserInfo(); setUser(userInfo); } })(); }, [isAuthenticated, fetchUserInfo]); if (isInCallback) { return ; } if (!isAuthenticated || !user) { return null; } return (
Congrats
{t('title')}
{t('subtitle')}
{t('username')} {user.username}
{t('user_id')} {user.sub}
signOut(`${window.location.origin}/demo-app`)} > {t('sign_out')}
); }; const App = () => { return (
); }; export default App;