diff options
Diffstat (limited to 'src/state/session/reducer.ts')
-rw-r--r-- | src/state/session/reducer.ts | 42 |
1 files changed, 40 insertions, 2 deletions
diff --git a/src/state/session/reducer.ts b/src/state/session/reducer.ts index 22ba47162..f6452a391 100644 --- a/src/state/session/reducer.ts +++ b/src/state/session/reducer.ts @@ -1,8 +1,8 @@ -import {AtpSessionEvent} from '@atproto/api' +import {type AtpSessionEvent, type BskyAgent} from '@atproto/api' import {createPublicAgent} from './agent' import {wrapSessionReducerForLogging} from './logging' -import {SessionAccount} from './types' +import {type SessionAccount} from './types' // A hack so that the reducer can't read anything from the agent. // From the reducer's point of view, it should be a completely opaque object. @@ -52,6 +52,11 @@ export type Action = syncedAccounts: SessionAccount[] syncedCurrentDid: string | undefined } + | { + type: 'partial-refresh-session' + accountDid: string + patch: Pick<SessionAccount, 'emailConfirmed' | 'emailAuthFactor'> + } function createPublicAgentState(): AgentState { return { @@ -180,6 +185,39 @@ let reducer = (state: State, action: Action): State => { needsPersist: false, // Synced from another tab. Don't persist to avoid cycles. } } + case 'partial-refresh-session': { + const {accountDid, patch} = action + const agent = state.currentAgentState.agent as BskyAgent + + /* + * Only mutating values that are safe. Be very careful with this. + */ + if (agent.session) { + agent.session.emailConfirmed = + patch.emailConfirmed ?? agent.session.emailConfirmed + agent.session.emailAuthFactor = + patch.emailAuthFactor ?? agent.session.emailAuthFactor + } + + return { + ...state, + currentAgentState: { + ...state.currentAgentState, + agent, + }, + accounts: state.accounts.map(a => { + if (a.did === accountDid) { + return { + ...a, + emailConfirmed: patch.emailConfirmed ?? a.emailConfirmed, + emailAuthFactor: patch.emailAuthFactor ?? a.emailAuthFactor, + } + } + return a + }), + needsPersist: true, + } + } } } reducer = wrapSessionReducerForLogging(reducer) |