mirror of https://git.lenooby09.tech/LeNooby09/social-app.git
at tooltip 2.2 kB view raw
1import {useCallback, useEffect, useState} from 'react' 2import {useQuery, useQueryClient} from '@tanstack/react-query' 3 4import {useAgent} 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 useInvalidateAccountEmailState() { 15 const qc = useQueryClient() 16 17 return useCallback(() => { 18 return qc.invalidateQueries({ 19 queryKey: accountEmailStateQueryKey, 20 }) 21 }, [qc]) 22} 23 24export function useUpdateAccountEmailStateQueryCache() { 25 const qc = useQueryClient() 26 27 return useCallback( 28 (data: AccountEmailState) => { 29 return qc.setQueriesData( 30 { 31 queryKey: accountEmailStateQueryKey, 32 }, 33 data, 34 ) 35 }, 36 [qc], 37 ) 38} 39 40export function useAccountEmailState() { 41 const agent = useAgent() 42 const [prevIsEmailVerified, setPrevEmailIsVerified] = useState( 43 !!agent.session?.emailConfirmed, 44 ) 45 const fallbackData: AccountEmailState = { 46 isEmailVerified: !!agent.session?.emailConfirmed, 47 email2FAEnabled: !!agent.session?.emailAuthFactor, 48 } 49 const query = useQuery<AccountEmailState>({ 50 enabled: !!agent.session, 51 refetchOnWindowFocus: true, 52 queryKey: accountEmailStateQueryKey, 53 queryFn: async () => { 54 // will also trigger updates to `#/state/session` data 55 const {data} = await agent.resumeSession(agent.session!) 56 return { 57 isEmailVerified: !!data.emailConfirmed, 58 email2FAEnabled: !!data.emailAuthFactor, 59 } 60 }, 61 }) 62 63 const state = query.data ?? fallbackData 64 65 /* 66 * This will emit `n` times for each instance of this hook. So the listeners 67 * all use `once` to prevent multiple handlers firing. 68 */ 69 useEffect(() => { 70 if (state.isEmailVerified && !prevIsEmailVerified) { 71 setPrevEmailIsVerified(true) 72 emitEmailVerified() 73 } else if (!state.isEmailVerified && prevIsEmailVerified) { 74 setPrevEmailIsVerified(false) 75 } 76 }, [state, prevIsEmailVerified]) 77 78 return state 79}