Bluesky app fork with some witchin' additions 馃挮
at main 1.6 kB view raw
1import {useEffect, useMemo, useState} from 'react' 2import {useQuery} from '@tanstack/react-query' 3 4import {useAgent, useSessionApi} from '#/state/session' 5import {emitEmailVerified} from '#/components/dialogs/EmailDialog/events' 6 7export type AccountEmailState = { 8 isEmailVerified: boolean 9 email2FAEnabled: boolean 10} 11 12export const accountEmailStateQueryKey = ['accountEmailState'] as const 13 14export function useAccountEmailState() { 15 const agent = useAgent() 16 const {partialRefreshSession} = useSessionApi() 17 const [prevIsEmailVerified, setPrevEmailIsVerified] = useState( 18 !!agent.session?.emailConfirmed, 19 ) 20 const state: AccountEmailState = useMemo( 21 () => ({ 22 isEmailVerified: !!agent.session?.emailConfirmed, 23 email2FAEnabled: !!agent.session?.emailAuthFactor, 24 }), 25 [agent.session], 26 ) 27 28 /** 29 * Only here to refetch on focus, when necessary 30 */ 31 useQuery({ 32 enabled: !!agent.session, 33 /** 34 * Only refetch if the email verification s incomplete. 35 */ 36 refetchOnWindowFocus: !prevIsEmailVerified, 37 queryKey: accountEmailStateQueryKey, 38 queryFn: async () => { 39 await partialRefreshSession() 40 return null 41 }, 42 }) 43 44 /* 45 * This will emit `n` times for each instance of this hook. So the listeners 46 * all use `once` to prevent multiple handlers firing. 47 */ 48 useEffect(() => { 49 if (state.isEmailVerified && !prevIsEmailVerified) { 50 setPrevEmailIsVerified(true) 51 emitEmailVerified() 52 } else if (!state.isEmailVerified && prevIsEmailVerified) { 53 setPrevEmailIsVerified(false) 54 } 55 }, [state, prevIsEmailVerified]) 56 57 return state 58}