Bluesky app fork with some witchin' additions 馃挮 witchsky.app
bluesky fork client
at main 61 lines 2.2 kB view raw
1import {useCallback, useState} from 'react' 2import {msg} from '@lingui/core/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 {useAnalytics} from '#/analytics' 10import {type Metrics} from '#/analytics/metrics' 11import {storeNavigationStateForAccountSwitch} from '#/Navigation' 12 13export function useAccountSwitcher() { 14 const ax = useAnalytics() 15 const [pendingDid, setPendingDid] = useState<string | null>(null) 16 const {_} = useLingui() 17 const {resumeSession} = useSessionApi() 18 const {requestSwitchToAccount} = useLoggedOutViewControls() 19 20 const onPressSwitchAccount = useCallback( 21 async ( 22 account: SessionAccount, 23 logContext: Metrics['account:loggedIn']['logContext'], 24 ) => { 25 if (pendingDid) { 26 // The session API isn't resilient to race conditions so let's just ignore this. 27 return 28 } 29 try { 30 setPendingDid(account.did) 31 if (account.accessJwt) { 32 // Store navigation state before switching so user stays on the same page 33 storeNavigationStateForAccountSwitch() 34 await resumeSession(account, true) 35 ax.metric('account:loggedIn', {logContext, withPassword: false}) 36 Toast.show(_(msg`Signed in as @${account.handle}`)) 37 } else { 38 requestSwitchToAccount({requestedAccount: account.did}) 39 Toast.show( 40 _(msg`Please sign in as @${account.handle}`), 41 'circle-exclamation', 42 ) 43 } 44 } catch (e: any) { 45 logger.error(`switch account: selectAccount failed`, { 46 message: e.message, 47 }) 48 requestSwitchToAccount({requestedAccount: account.did}) 49 Toast.show( 50 _(msg`Please sign in as @${account.handle}`), 51 'circle-exclamation', 52 ) 53 } finally { 54 setPendingDid(null) 55 } 56 }, 57 [_, ax, resumeSession, requestSwitchToAccount, pendingDid], 58 ) 59 60 return {onPressSwitchAccount, pendingDid} 61}