Bluesky app fork with some witchin' additions 馃挮
witchsky.app
bluesky
fork
client
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}