import { createSlice, PayloadAction } from "@reduxjs/toolkit"; import { ExtendedProviderStatus, ProviderStatus } from "models/apiModel"; import { TauriLogEvent, GetSwapInfoResponse, TauriContextStatusEvent, TauriTimelockChangeEvent, } from "models/tauriModel"; import { MoneroRecoveryResponse } from "../../models/rpcModel"; import { GetSwapInfoResponseExt } from "models/tauriModelExt"; import { getLogsAndStringsFromRawFileString } from "utils/parseUtils"; import { CliLog } from "models/cliModel"; import logger from "utils/logger"; interface State { balance: number | null; withdrawTxId: string | null; rendezvous_discovered_sellers: (ExtendedProviderStatus | ProviderStatus)[]; swapInfos: { [swapId: string]: GetSwapInfoResponseExt; }; moneroRecovery: { swapId: string; keys: MoneroRecoveryResponse; } | null; moneroWalletRpc: { // TODO: Reimplement this using Tauri updateState: false; }; } export interface RPCSlice { status: TauriContextStatusEvent | null; state: State; logs: (CliLog | string)[]; } const initialState: RPCSlice = { status: null, state: { balance: null, withdrawTxId: null, rendezvous_discovered_sellers: [], swapInfos: {}, moneroRecovery: null, moneroWalletRpc: { updateState: false, }, }, logs: [], }; export const rpcSlice = createSlice({ name: "rpc", initialState, reducers: { receivedCliLog(slice, action: PayloadAction) { const buffer = action.payload.buffer; const logs = getLogsAndStringsFromRawFileString(buffer); slice.logs = slice.logs.concat(logs); }, contextStatusEventReceived( slice, action: PayloadAction, ) { slice.status = action.payload; }, timelockChangeEventReceived( slice, action: PayloadAction ) { if (slice.state.swapInfos[action.payload.swap_id]) { slice.state.swapInfos[action.payload.swap_id].timelock = action.payload.timelock; } else { logger.warn(`Received timelock change event for unknown swap ${action.payload.swap_id}`); } }, rpcSetBalance(slice, action: PayloadAction) { slice.state.balance = action.payload; }, rpcSetWithdrawTxId(slice, action: PayloadAction) { slice.state.withdrawTxId = action.payload; }, rpcSetRendezvousDiscoveredProviders( slice, action: PayloadAction<(ExtendedProviderStatus | ProviderStatus)[]>, ) { slice.state.rendezvous_discovered_sellers = action.payload; }, rpcResetWithdrawTxId(slice) { slice.state.withdrawTxId = null; }, rpcSetSwapInfo(slice, action: PayloadAction) { slice.state.swapInfos[action.payload.swap_id] = action.payload as GetSwapInfoResponseExt; }, rpcSetMoneroRecoveryKeys( slice, action: PayloadAction<[string, MoneroRecoveryResponse]>, ) { const swapId = action.payload[0]; const keys = action.payload[1]; slice.state.moneroRecovery = { swapId, keys, }; }, rpcResetMoneroRecoveryKeys(slice) { slice.state.moneroRecovery = null; }, }, }); export const { contextStatusEventReceived, receivedCliLog, rpcSetBalance, rpcSetWithdrawTxId, rpcResetWithdrawTxId, rpcSetRendezvousDiscoveredProviders, rpcSetSwapInfo, rpcSetMoneroRecoveryKeys, rpcResetMoneroRecoveryKeys, timelockChangeEventReceived } = rpcSlice.actions; export default rpcSlice.reducer;