import {useCallback, useState} from 'react' import {View} from 'react-native' import {msg} from '@lingui/core/macro' import {useLingui} from '@lingui/react' import {Trans} from '@lingui/react/macro' import {logger} from '#/logger' import {type SessionAccount, useSession, useSessionApi} from '#/state/session' import {useLoggedOutViewControls} from '#/state/shell/logged-out' import {atoms as a, web} from '#/alf' import {AccountList} from '#/components/AccountList' import {Button, ButtonText} from '#/components/Button' import * as TextField from '#/components/forms/TextField' import * as Toast from '#/components/Toast' import {useAnalytics} from '#/analytics' import {IS_WEB} from '#/env' import {FormContainer} from './FormContainer' export const ChooseAccountForm = ({ onSelectAccount, onPressBack, }: { onSelectAccount: (account?: SessionAccount) => void onPressBack: () => void }) => { const [pendingDid, setPendingDid] = useState(null) const {_} = useLingui() const ax = useAnalytics() const {currentAccount} = useSession() const {resumeSession} = useSessionApi() const {setShowLoggedOut} = useLoggedOutViewControls() const onSelect = useCallback( async (account: SessionAccount) => { if (pendingDid) { // The session API isn't resilient to race conditions so let's just ignore this. return } if (!account.accessJwt) { // Move to login form. onSelectAccount(account) return } if (account.did === currentAccount?.did) { setShowLoggedOut(false) Toast.show(_(msg`Already signed in as @${account.handle}`)) return } try { setPendingDid(account.did) await resumeSession(account, true) ax.metric('account:loggedIn', { logContext: 'ChooseAccountForm', withPassword: false, }) Toast.show(_(msg`Signed in as @${account.handle}`)) } catch (e: any) { logger.error('choose account: initSession failed', { message: e instanceof Error ? e.message : 'Unknown error', }) // Move to login form. onSelectAccount(account) } finally { setPendingDid(null) } }, [ currentAccount, resumeSession, pendingDid, onSelectAccount, setShowLoggedOut, _, ax, ], ) return ( Select account} style={web([a.py_2xl])}> {IS_WEB && ( Sign in as... )} onSelectAccount()} pendingDid={pendingDid} /> {IS_WEB && ( )} ) }