|
|
|
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;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|