import type { PayloadAction } from "@reduxjs/toolkit"; import { createSlice } from "@reduxjs/toolkit"; import type { Account, Balance, SessionInfo, VaultInfo } from "../../types"; import { MAIN_WALLET_ID } from "../../utils"; interface AddSessionPayload { accountId: number; sessionInfo: SessionInfo; } interface RemoveSessionPayload { accountId: number; sessionId: string; } export interface WalletState { isAuthorized: boolean; selectedAccount: number; accounts: Record; vaults: Record; sync: boolean; initLoad: boolean; txUpdateTrigger: number; nftsUpdateTrigger: number; tokensUpdateTrigger: number; } const initialState: WalletState = { isAuthorized: false, selectedAccount: MAIN_WALLET_ID, accounts: { "-1": { id: MAIN_WALLET_ID, name: 'Main Wallet', address: '', balance: {confirmed: "0", unconfirmed: "0"}, tokensBalance: {}, sessions: {} } }, vaults: {}, sync: false, initLoad: true, txUpdateTrigger: 0, nftsUpdateTrigger: 0, tokensUpdateTrigger: 0 } const walletSlice = createSlice({ name: 'wallet', initialState, reducers: { setInitLoad: (state, action: PayloadAction) => { state.initLoad = action.payload; }, setSelectedAccount: (state, action: PayloadAction) => { state.selectedAccount = action.payload; }, setSync: (state, action: PayloadAction) => { state.sync = action.payload; }, setVault: (state, action: PayloadAction) => { state.vaults[action.payload.address] = action.payload; }, setVaultBalance: (state, action: PayloadAction<{ address: string, balance: Balance }>) => { state.vaults[action.payload.address].balance = action.payload.balance; }, setAccount: (state, action: PayloadAction) => { state.accounts[action.payload.id] = action.payload; }, setMainAddress: (state, action: PayloadAction) => { state.accounts[MAIN_WALLET_ID].address = action.payload; }, setAccountBalance: (state, action: PayloadAction<{ id: number, balance: Balance, tokensBalance: Record }>) => { state.accounts[action.payload.id].balance = action.payload.balance; state.accounts[action.payload.id].tokensBalance = action.payload.tokensBalance; }, setAccountName: (state, action: PayloadAction<{ id: number, name: string }>) => { state.accounts[action.payload.id].name = action.payload.name; }, refreshTxs: (state) => { state.txUpdateTrigger++; }, refreshNfts: (state) => { state.nftsUpdateTrigger++; }, refreshTokens: (state) => { state.tokensUpdateTrigger++; }, addSession(state, action: PayloadAction) { const { accountId, sessionInfo } = action.payload; state.accounts[accountId].sessions[sessionInfo.details.sessionId] = sessionInfo; }, removeSession(state, action: PayloadAction) { const { accountId, sessionId } = action.payload; if (state.accounts[accountId].sessions[sessionId]) { delete state.accounts[accountId].sessions[sessionId]; } }, clearSessions(state, action: PayloadAction<{ accountId: number }>) { state.accounts[action.payload.accountId].sessions = {}; } } }); export const walletActions = walletSlice.actions; export const walletReducer = walletSlice.reducer;