From 7fd218c97de0e03e64b998bc0c26444a2885c465 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Wed, 4 Mar 2026 18:27:12 -0600 Subject: [PATCH] Update API package to fix stale session issues (#9998) --- package.json | 2 +- .../EmailDialog/data/useConfirmEmail.ts | 6 +++--- .../EmailDialog/data/useManageEmail2FA.ts | 6 +++--- .../EmailDialog/data/useUpdateEmail.ts | 20 ++++--------------- src/screens/Deactivated.tsx | 8 +++----- src/state/session/index.tsx | 1 - src/state/session/reducer.ts | 7 +------ yarn.lock | 8 ++++---- 8 files changed, 19 insertions(+), 39 deletions(-) diff --git a/package.json b/package.json index 83d5b6ec26..48c3a01336 100644 --- a/package.json +++ b/package.json @@ -80,7 +80,7 @@ "icons:optimize": "svgo -f ./assets/icons" }, "dependencies": { - "@atproto/api": "^0.19.1", + "@atproto/api": "^0.19.3", "@bitdrift/react-native": "^0.6.8", "@braintree/sanitize-url": "^6.0.2", "@bsky.app/alf": "^0.1.7", diff --git a/src/components/dialogs/EmailDialog/data/useConfirmEmail.ts b/src/components/dialogs/EmailDialog/data/useConfirmEmail.ts index c767697f52..67466be926 100644 --- a/src/components/dialogs/EmailDialog/data/useConfirmEmail.ts +++ b/src/components/dialogs/EmailDialog/data/useConfirmEmail.ts @@ -1,6 +1,6 @@ import {useMutation} from '@tanstack/react-query' -import {useAgent, useSession, useSessionApi} from '#/state/session' +import {useAgent, useSession} from '#/state/session' export function useConfirmEmail({ onSuccess, @@ -8,7 +8,6 @@ export function useConfirmEmail({ }: {onSuccess?: () => void; onError?: () => void} = {}) { const agent = useAgent() const {currentAccount} = useSession() - const {partialRefreshSession} = useSessionApi() return useMutation({ mutationFn: async ({token}: {token: string}) => { @@ -20,7 +19,8 @@ export function useConfirmEmail({ email: currentAccount.email.trim(), token: token.trim(), }) - await partialRefreshSession() + // will update session state at root of app + await agent.resumeSession(agent.session!) }, onSuccess, onError, diff --git a/src/components/dialogs/EmailDialog/data/useManageEmail2FA.ts b/src/components/dialogs/EmailDialog/data/useManageEmail2FA.ts index 4c1420847d..358bf86544 100644 --- a/src/components/dialogs/EmailDialog/data/useManageEmail2FA.ts +++ b/src/components/dialogs/EmailDialog/data/useManageEmail2FA.ts @@ -1,11 +1,10 @@ import {useMutation} from '@tanstack/react-query' -import {useAgent, useSession, useSessionApi} from '#/state/session' +import {useAgent, useSession} from '#/state/session' export function useManageEmail2FA() { const agent = useAgent() const {currentAccount} = useSession() - const {partialRefreshSession} = useSessionApi() return useMutation({ mutationFn: async ({ @@ -23,7 +22,8 @@ export function useManageEmail2FA() { emailAuthFactor: enabled, token, }) - await partialRefreshSession() + // will update session state at root of app + await agent.resumeSession(agent.session!) }, }) } diff --git a/src/components/dialogs/EmailDialog/data/useUpdateEmail.ts b/src/components/dialogs/EmailDialog/data/useUpdateEmail.ts index 1f81801a76..2ec1eb6dc2 100644 --- a/src/components/dialogs/EmailDialog/data/useUpdateEmail.ts +++ b/src/components/dialogs/EmailDialog/data/useUpdateEmail.ts @@ -1,21 +1,19 @@ import {useMutation} from '@tanstack/react-query' -import {useAgent, useSessionApi} from '#/state/session' +import {useAgent} from '#/state/session' import {useRequestEmailUpdate} from '#/components/dialogs/EmailDialog/data/useRequestEmailUpdate' async function updateEmailAndRefreshSession( agent: ReturnType, - partialRefreshSession: () => Promise, email: string, token?: string, ) { await agent.com.atproto.server.updateEmail({email: email.trim(), token}) - await partialRefreshSession() + await agent.resumeSession(agent.session!) } export function useUpdateEmail() { const agent = useAgent() - const {partialRefreshSession} = useSessionApi() const {mutateAsync: requestEmailUpdate} = useRequestEmailUpdate() return useMutation< @@ -25,12 +23,7 @@ export function useUpdateEmail() { >({ mutationFn: async ({email, token}: {email: string; token?: string}) => { if (token) { - await updateEmailAndRefreshSession( - agent, - partialRefreshSession, - email, - token, - ) + await updateEmailAndRefreshSession(agent, email, token) return { status: 'success', } @@ -41,12 +34,7 @@ export function useUpdateEmail() { status: 'tokenRequired', } } else { - await updateEmailAndRefreshSession( - agent, - partialRefreshSession, - email, - token, - ) + await updateEmailAndRefreshSession(agent, email, token) return { status: 'success', } diff --git a/src/screens/Deactivated.tsx b/src/screens/Deactivated.tsx index 363151bd80..9500f27a2b 100644 --- a/src/screens/Deactivated.tsx +++ b/src/screens/Deactivated.tsx @@ -14,7 +14,6 @@ import { useSession, useSessionApi, } from '#/state/session' -import {agentToSessionAccountOrThrow} from '#/state/session/agent' import {useLoggedOutViewControls} from '#/state/shell/logged-out' import {Logo} from '#/view/icons/Logo' import {atoms as a, useTheme} from '#/alf' @@ -37,7 +36,7 @@ export function Deactivated() { const {onPressSwitchAccount, pendingDid} = useAccountSwitcher() const {setShowLoggedOut} = useLoggedOutViewControls() const hasOtherAccounts = accounts.length > 1 - const {logoutCurrentAccount, resumeSession} = useSessionApi() + const {logoutCurrentAccount} = useSessionApi() const agent = useAgent() const [pending, setPending] = React.useState(false) const [error, setError] = React.useState() @@ -73,8 +72,7 @@ export function Deactivated() { setPending(true) await agent.com.atproto.server.activateAccount() await queryClient.resetQueries() - const account = agentToSessionAccountOrThrow(agent) - await resumeSession({...account, active: true, status: undefined}) + await agent.resumeSession(agent.session!) } catch (e: any) { switch (e.message) { case 'Bad token scope': @@ -95,7 +93,7 @@ export function Deactivated() { } finally { setPending(false) } - }, [_, agent, queryClient, resumeSession]) + }, [_, agent, setPending, setError, queryClient]) return ( diff --git a/src/state/session/index.tsx b/src/state/session/index.tsx index fc08f70d7f..e63e180a4e 100644 --- a/src/state/session/index.tsx +++ b/src/state/session/index.tsx @@ -284,7 +284,6 @@ export function Provider({children}: React.PropsWithChildren<{}>) { type: 'partial-refresh-session', accountDid: agent.session!.did, patch: { - email: data.email, emailConfirmed: data.emailConfirmed, emailAuthFactor: data.emailAuthFactor, }, diff --git a/src/state/session/reducer.ts b/src/state/session/reducer.ts index 79fffb6c59..d22dd4a021 100644 --- a/src/state/session/reducer.ts +++ b/src/state/session/reducer.ts @@ -58,10 +58,7 @@ export type Action = | { type: 'partial-refresh-session' accountDid: string - patch: Pick< - SessionAccount, - 'email' | 'emailConfirmed' | 'emailAuthFactor' - > + patch: Pick } function createPublicAgentState(): AgentState { @@ -242,7 +239,6 @@ let reducer = (state: State, action: Action): State => { * Only mutating values that are safe. Be very careful with this. */ if (agent.session) { - agent.session.email = patch.email ?? agent.session.email agent.session.emailConfirmed = patch.emailConfirmed ?? agent.session.emailConfirmed agent.session.emailAuthFactor = @@ -259,7 +255,6 @@ let reducer = (state: State, action: Action): State => { if (a.did === accountDid) { return { ...a, - email: patch.email ?? a.email, emailConfirmed: patch.emailConfirmed ?? a.emailConfirmed, emailAuthFactor: patch.emailAuthFactor ?? a.emailAuthFactor, } diff --git a/yarn.lock b/yarn.lock index 3f8eb9f723..6baf6dfaf8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -110,10 +110,10 @@ tlds "^1.234.0" zod "^3.23.8" -"@atproto/api@^0.19.1": - version "0.19.1" - resolved "https://registry.yarnpkg.com/@atproto/api/-/api-0.19.1.tgz#62c48595def4c968d94a96f83ed9ee369768de5d" - integrity sha512-GE94kx6PBsBAUcFne+cX3c77ZVr3/pvfeeG+GtZ1QFE8U9brrXoCoN6qwtOg6PfZk8UvpyCxLyWNfiC2GfCSJg== +"@atproto/api@^0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@atproto/api/-/api-0.19.3.tgz#61de8d2e31abe9eb2b4c8f4ad124ed79d4a77e89" + integrity sha512-G8YpBpRouHdTAIagi/QQIUZOhGd1jfBQWkJy9QfxAzjjEpPvaVOSk4e1S85QzGLm/xbzVONzGkmdtiOSfP6wVg== dependencies: "@atproto/common-web" "^0.4.18" "@atproto/lexicon" "^0.6.2"