You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
RTL/src/app/eclair/store/ecl.reducers.ts

220 lines
7.3 KiB
TypeScript

import { SelNodeChild } from '../../shared/models/RTLconfig';
import { GetInfo, Channel, ChannelStats, Fees, OnChainBalance, LightningBalance, Peer, ChannelsStatus, Payments, Transaction, Invoice } from '../../shared/models/eclModels';
import { ErrorPayload } from '../../shared/models/errorPayload';
import { UserPersonaEnum } from '../../shared/services/consts-enums-functions';
import * as ECLActions from './ecl.actions';
export interface ECLState {
initialAPIResponseStatus: String[];
effectErrors: ErrorPayload[];
nodeSettings: SelNodeChild;
information: GetInfo;
fees: Fees;
activeChannels: Channel[];
pendingChannels: Channel[];
inactiveChannels: Channel[];
channelsStatus: ChannelsStatus;
channelStats: ChannelStats[];
onchainBalance: OnChainBalance;
lightningBalance: LightningBalance;
peers: Peer[];
payments: Payments;
transactions: Transaction[];
invoices: Invoice[];
}
export const initECLState: ECLState = {
initialAPIResponseStatus: ['INCOMPLETE'], //[0] for All Data Status
effectErrors: [],
nodeSettings: { userPersona: UserPersonaEnum.OPERATOR, selCurrencyUnit: 'USD', fiatConversion: false, channelBackupPath: '', currencyUnits: [] },
information: {},
fees: {},
activeChannels: [],
pendingChannels: [],
inactiveChannels: [],
channelsStatus: {},
channelStats: [],
onchainBalance: { total: 0, confirmed: 0, unconfirmed: 0 },
lightningBalance: { localBalance: -1, remoteBalance: -1 },
peers: [],
payments: {},
transactions: [],
invoices: []
}
export function ECLReducer(state = initECLState, action: ECLActions.ECLActions) {
let newAPIStatus = state.initialAPIResponseStatus;
switch (action.type) {
case ECLActions.CLEAR_EFFECT_ERROR_ECL:
const clearedEffectErrors = [...state.effectErrors];
const removeEffectIdx = state.effectErrors.findIndex(err => {
return err.action === action.payload;
});
if (removeEffectIdx > -1) {
clearedEffectErrors.splice(removeEffectIdx, 1);
}
return {
...state,
effectErrors: clearedEffectErrors
};
case ECLActions.EFFECT_ERROR_ECL:
return {
...state,
effectErrors: [...state.effectErrors, action.payload]
};
case ECLActions.SET_CHILD_NODE_SETTINGS_ECL:
return {
...state,
nodeSettings: action.payload
}
case ECLActions.RESET_ECL_STORE:
return {
...initECLState,
nodeSettings: action.payload,
};
case ECLActions.SET_INFO_ECL:
return {
...state,
information: action.payload
};
case ECLActions.SET_FEES_ECL:
newAPIStatus = [...state.initialAPIResponseStatus, 'FEES'];
return {
...state,
initialAPIResponseStatus: newAPIStatus,
fees: action.payload
};
case ECLActions.SET_ACTIVE_CHANNELS_ECL:
return {
...state,
activeChannels: action.payload,
};
case ECLActions.SET_PENDING_CHANNELS_ECL:
return {
...state,
pendingChannels: action.payload,
};
case ECLActions.SET_INACTIVE_CHANNELS_ECL:
return {
...state,
inactiveChannels: action.payload,
};
case ECLActions.SET_CHANNELS_STATUS_ECL:
newAPIStatus = [...state.initialAPIResponseStatus, 'CHANNELS'];
return {
...state,
initialAPIResponseStatus: newAPIStatus,
channelsStatus: action.payload,
};
case ECLActions.SET_CHANNEL_STATS_ECL:
return {
...state,
channelStats: action.payload,
};
case ECLActions.SET_ONCHAIN_BALANCE_ECL:
newAPIStatus = [...state.initialAPIResponseStatus, 'ONCHAINBALANCE'];
return {
...state,
initialAPIResponseStatus: newAPIStatus,
onchainBalance: action.payload
};
case ECLActions.SET_LIGHTNING_BALANCE_ECL:
return {
...state,
lightningBalance: action.payload
};
case ECLActions.SET_PEERS_ECL:
newAPIStatus = [...state.initialAPIResponseStatus, 'PEERS'];
return {
...state,
initialAPIResponseStatus: newAPIStatus,
peers: action.payload
};
case ECLActions.REMOVE_PEER_ECL:
const modifiedPeers = [...state.peers];
const removePeerIdx = state.peers.findIndex(peer => {
return peer.nodeId === action.payload.nodeId;
});
if (removePeerIdx > -1) {
modifiedPeers.splice(removePeerIdx, 1);
}
return {
...state,
peers: modifiedPeers
};
case ECLActions.REMOVE_CHANNEL_ECL:
const modifiedChannels = [...state.activeChannels];
const removeChannelIdx = state.activeChannels.findIndex(channel => {
return channel.channelId === action.payload.channelId;
});
if (removeChannelIdx > -1) {
modifiedChannels.splice(removeChannelIdx, 1);
}
return {
...state,
activeChannels: modifiedChannels
};
case ECLActions.SET_PAYMENTS_ECL:
if (action.payload && action.payload.relayed) {
const storedChannels = [...state.activeChannels, ...state.pendingChannels, ...state.inactiveChannels];
action.payload.relayed.forEach(event => {
if (storedChannels && storedChannels.length > 0) {
for (let idx = 0; idx < storedChannels.length; idx++) {
if (storedChannels[idx].channelId.toString() === event.fromChannelId) {
event.fromChannelAlias = storedChannels[idx].alias ? storedChannels[idx].alias : event.fromChannelId;
event.fromShortChannelId = storedChannels[idx].shortChannelId ? storedChannels[idx].shortChannelId : '';
if (event.toChannelAlias) { return; }
}
if (storedChannels[idx].channelId.toString() === event.toChannelId) {
event.toChannelAlias = storedChannels[idx].alias ? storedChannels[idx].alias : event.toChannelId;
event.toShortChannelId = storedChannels[idx].shortChannelId ? storedChannels[idx].shortChannelId : '';
if (event.fromChannelAlias) { return; }
}
if (idx === storedChannels.length-1) {
if (!event.fromChannelAlias) {
event.fromChannelAlias = event.fromChannelId.substring(0, 17) + '...';
event.fromShortChannelId = '';
}
if (!event.toChannelAlias) {
event.toChannelAlias = event.toChannelId.substring(0, 17) + '...';
event.toShortChannelId = '';
}
}
}
} else {
event.fromChannelAlias = event.fromChannelId.substring(0, 17) + '...';
event.fromShortChannelId = '';
event.toChannelAlias = event.toChannelId.substring(0, 17) + '...';
event.toShortChannelId = '';
}
});
}
return {
...state,
initialAPIResponseStatus: newAPIStatus,
payments: action.payload
};
case ECLActions.SET_TRANSACTIONS_ECL:
return {
...state,
transactions: action.payload
};
case ECLActions.ADD_INVOICE_ECL:
const newInvoices = state.invoices;
newInvoices.unshift(action.payload);
return {
...state,
invoices: newInvoices
};
case ECLActions.SET_INVOICES_ECL:
return {
...state,
invoices: action.payload
};
default:
return state;
}
}