mirror of https://git.lenooby09.tech/LeNooby09/social-app.git
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}