Something went wrong. Try again.
Bluesky app fork with some witchin' additions 💫 forked from jollywhoppers.com/witchsky.app
Something went wrong. Try again.
1.6 kB · 58 lines
TypeScript
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859import {useEffect, useMemo, useState} from 'react'import {useQuery} from '@tanstack/react-query'
import {useAgent, useSessionApi} from '#/state/session'import {emitEmailVerified} from '#/components/dialogs/EmailDialog/events'
export type AccountEmailState = { isEmailVerified: boolean email2FAEnabled: boolean}
export const accountEmailStateQueryKey = ['accountEmailState'] as const
export function useAccountEmailState() { const agent = useAgent() const {partialRefreshSession} = useSessionApi() const [prevIsEmailVerified, setPrevEmailIsVerified] = useState( !!agent.session?.emailConfirmed, ) const state: AccountEmailState = useMemo( () => ({ isEmailVerified: !!agent.session?.emailConfirmed, email2FAEnabled: !!agent.session?.emailAuthFactor, }), [agent.session], )
/** * Only here to refetch on focus, when necessary */ useQuery({ enabled: !!agent.session, /** * Only refetch if the email verification s incomplete. */ refetchOnWindowFocus: !prevIsEmailVerified, queryKey: accountEmailStateQueryKey, queryFn: async () => { await partialRefreshSession() return null }, })
/* * This will emit `n` times for each instance of this hook. So the listeners * all use `once` to prevent multiple handlers firing. */ useEffect(() => { if (state.isEmailVerified && !prevIsEmailVerified) { setPrevEmailIsVerified(true) emitEmailVerified() } else if (!state.isEmailVerified && prevIsEmailVerified) { setPrevEmailIsVerified(false) } }, [state, prevIsEmailVerified])
return state}