import type { IdTokenClaims } from '@logto/react'; import { LogtoProvider, useLogto, Prompt, UserScope } from '@logto/react'; import { demoAppApplicationId } from '@logto/schemas'; import { 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 congratsDark from './assets/congrats-dark.svg'; import congrats from './assets/congrats.svg'; import initI18n from './i18n/init'; void initI18n(); const Main = () => { const { isAuthenticated, isLoading, getIdTokenClaims, 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')); const isDarkMode = window.matchMedia('(prefers-color-scheme: dark)').matches; const [congratsIcon, setCongratsIcon] = useState(isDarkMode ? congratsDark : congrats); useEffect(() => { if (isInCallback || isLoading) { return; } const loadIdTokenClaims = async () => { const userInfo = await getIdTokenClaims(); setUser(userInfo ?? { sub: 'N/A', username: 'N/A' }); }; // If user is authenticated but user info is not loaded yet, load it if (isAuthenticated && !user) { void loadIdTokenClaims(); } // If user is not authenticated, redirect to sign-in page if (!isAuthenticated) { void signIn({ redirectUri: window.location.origin + window.location.pathname, extraParams: Object.fromEntries(new URLSearchParams(window.location.search).entries()), }); } }, [getIdTokenClaims, isAuthenticated, isInCallback, isLoading, signIn, user]); useEffect(() => { const onThemeChange = (event: MediaQueryListEvent) => { const isDarkMode = event.matches; setCongratsIcon(isDarkMode ? congratsDark : congrats); }; window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', onThemeChange); return () => { window .matchMedia('(prefers-color-scheme: dark)') .removeEventListener('change', onThemeChange); }; }, []); if (isInCallback) { return ; } if (!isAuthenticated || !user) { return null; } return (
{congratsIcon && Congrats}
{t('title')}
{t('subtitle')}
{user.username && (
{t('username')} {user.username}
)}
{t('user_id')} {user.sub}
signOut(`${window.location.origin}/demo-app`)} onKeyDown={({ key }) => { if (key === 'Enter' || key === ' ') { void signOut(`${window.location.origin}/demo-app`); } }} > {t('sign_out')}
); }; const App = () => { return (
); }; export default App;