Bluesky app fork with some witchin' additions 馃挮
at post-text-option 57 lines 1.9 kB view raw
1import {useCallback, useState} from 'react' 2import {msg} from '@lingui/macro' 3import {useLingui} from '@lingui/react' 4 5import {logger} from '#/logger' 6import {type SessionAccount, useSessionApi} from '#/state/session' 7import {useLoggedOutViewControls} from '#/state/shell/logged-out' 8import * as Toast from '#/view/com/util/Toast' 9import {logEvent} from '../statsig/statsig' 10import {type LogEvents} from '../statsig/statsig' 11 12export function useAccountSwitcher() { 13 const [pendingDid, setPendingDid] = useState<string | null>(null) 14 const {_} = useLingui() 15 const {resumeSession} = useSessionApi() 16 const {requestSwitchToAccount} = useLoggedOutViewControls() 17 18 const onPressSwitchAccount = useCallback( 19 async ( 20 account: SessionAccount, 21 logContext: LogEvents['account:loggedIn']['logContext'], 22 ) => { 23 if (pendingDid) { 24 // The session API isn't resilient to race conditions so let's just ignore this. 25 return 26 } 27 try { 28 setPendingDid(account.did) 29 if (account.accessJwt) { 30 await resumeSession(account, true) 31 logEvent('account:loggedIn', {logContext, withPassword: false}) 32 Toast.show(_(msg`Signed in as @${account.handle}`)) 33 } else { 34 requestSwitchToAccount({requestedAccount: account.did}) 35 Toast.show( 36 _(msg`Please sign in as @${account.handle}`), 37 'circle-exclamation', 38 ) 39 } 40 } catch (e: any) { 41 logger.error(`switch account: selectAccount failed`, { 42 message: e.message, 43 }) 44 requestSwitchToAccount({requestedAccount: account.did}) 45 Toast.show( 46 _(msg`Please sign in as @${account.handle}`), 47 'circle-exclamation', 48 ) 49 } finally { 50 setPendingDid(null) 51 } 52 }, 53 [_, resumeSession, requestSwitchToAccount, pendingDid], 54 ) 55 56 return {onPressSwitchAccount, pendingDid} 57}