forked from
jollywhoppers.com/witchsky.app
Bluesky app fork with some witchin' additions 馃挮
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}