📄 src/web3/vue/handlers/sessionRetireHandler.ts
D-OPEN SOVEREIGN
1import { sessionStore } from '../../session/store';
2import type { ChainMutation, MutationHandler } from '../MutationBus';
3
4type RetireMutation = Extract<ChainMutation, { type: 'retire' }>;
5
6interface RetireSnapshot {
7  chainId: number;
8  account: string;
9  hasAccount: boolean;
10}
11
12export const sessionRetireHandler: MutationHandler<RetireMutation> = {
13  applyOptimistic: (mutation): RetireSnapshot | null => {
14    const account = sessionStore
15      .getState()
16      .known.find((a) => a.account.toLowerCase() === mutation.account.toLowerCase() && a.chainId === mutation.chainId);
17    if (!account) return null;
18
19    const snapshot: RetireSnapshot = { chainId: mutation.chainId, account: mutation.account, hasAccount: account.hasAccount };
20    sessionStore.updateAccount(mutation.account, mutation.chainId, { hasAccount: false });
21    return snapshot;
22  },
23
24  rollback: (snapshot: RetireSnapshot | null) => {
25    if (!snapshot) return;
26    sessionStore.updateAccount(snapshot.account, snapshot.chainId, { hasAccount: snapshot.hasAccount });
27  },
28};
29