diff options
Diffstat (limited to 'src/components/dialogs/EmailDialog/data/useAccountEmailState.ts')
-rw-r--r-- | src/components/dialogs/EmailDialog/data/useAccountEmailState.ts | 65 |
1 files changed, 22 insertions, 43 deletions
diff --git a/src/components/dialogs/EmailDialog/data/useAccountEmailState.ts b/src/components/dialogs/EmailDialog/data/useAccountEmailState.ts index 377411107..f25369f8d 100644 --- a/src/components/dialogs/EmailDialog/data/useAccountEmailState.ts +++ b/src/components/dialogs/EmailDialog/data/useAccountEmailState.ts @@ -1,7 +1,7 @@ -import {useCallback, useEffect, useState} from 'react' -import {useQuery, useQueryClient} from '@tanstack/react-query' +import {useEffect, useMemo, useState} from 'react' +import {useQuery} from '@tanstack/react-query' -import {useAgent} from '#/state/session' +import {useAgent, useSessionApi} from '#/state/session' import {emitEmailVerified} from '#/components/dialogs/EmailDialog/events' export type AccountEmailState = { @@ -11,57 +11,36 @@ export type AccountEmailState = { export const accountEmailStateQueryKey = ['accountEmailState'] as const -export function useInvalidateAccountEmailState() { - const qc = useQueryClient() - - return useCallback(() => { - return qc.invalidateQueries({ - queryKey: accountEmailStateQueryKey, - }) - }, [qc]) -} - -export function useUpdateAccountEmailStateQueryCache() { - const qc = useQueryClient() - - return useCallback( - (data: AccountEmailState) => { - return qc.setQueriesData( - { - queryKey: accountEmailStateQueryKey, - }, - data, - ) - }, - [qc], - ) -} - export function useAccountEmailState() { const agent = useAgent() + const {partialRefreshSession} = useSessionApi() const [prevIsEmailVerified, setPrevEmailIsVerified] = useState( !!agent.session?.emailConfirmed, ) - const fallbackData: AccountEmailState = { - isEmailVerified: !!agent.session?.emailConfirmed, - email2FAEnabled: !!agent.session?.emailAuthFactor, - } - const query = useQuery<AccountEmailState>({ + 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, - refetchOnWindowFocus: true, + /** + * Only refetch if the email verification s incomplete. + */ + refetchOnWindowFocus: !prevIsEmailVerified, queryKey: accountEmailStateQueryKey, queryFn: async () => { - // will also trigger updates to `#/state/session` data - const {data} = await agent.resumeSession(agent.session!) - return { - isEmailVerified: !!data.emailConfirmed, - email2FAEnabled: !!data.emailAuthFactor, - } + await partialRefreshSession() + return null }, }) - const state = query.data ?? fallbackData - /* * This will emit `n` times for each instance of this hook. So the listeners * all use `once` to prevent multiple handlers firing. |