You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

312 lines
10 KiB

import { withRouter } from 'react-router'
import { connect } from 'react-redux'
import get from 'lodash.get'
import { btc } from 'lib/utils'
import { themeSelectors } from 'reducers/theme'
import { setCurrency, tickerSelectors } from 'reducers/ticker'
import { closeWalletModal } from 'reducers/address'
import { fetchInfo, infoSelectors } from 'reducers/info'
import { setFormType } from 'reducers/form'
import { createInvoice, fetchInvoice } from 'reducers/invoice'
import { lndSelectors } from 'reducers/lnd'
import {
fetchChannels,
fetchSuggestedNodes,
openChannel,
closeChannel,
channelsSelectors,
currentChannels,
toggleFilterPulldown,
changeFilter,
updateChannelSearchQuery,
setSelectedChannel
} from 'reducers/channels'
import {
openContactsForm,
closeContactsForm,
setChannelFormType,
openManualForm,
closeManualForm,
openSubmitChannelForm,
closeSubmitChannelForm,
updateContactFormSearchQuery,
updateManualFormSearchQuery,
updateContactCapacity,
setNode,
contactFormSelectors,
updateManualFormErrors
} from 'reducers/contactsform'
import { fetchBalance } from 'reducers/balance'
import { fetchDescribeNetwork } from 'reducers/network'
import { clearError } from 'reducers/error'
import { hideActivityModal, activitySelectors } from 'reducers/activity'
import App from 'components/App'
import withLoading from 'components/withLoading'
const mapDispatchToProps = {
setCurrency,
closeWalletModal,
fetchInfo,
setFormType,
createInvoice,
fetchInvoice,
clearError,
fetchBalance,
fetchChannels,
fetchSuggestedNodes,
openChannel,
closeChannel,
toggleFilterPulldown,
changeFilter,
updateChannelSearchQuery,
setSelectedChannel,
openContactsForm,
closeContactsForm,
openSubmitChannelForm,
closeSubmitChannelForm,
openManualForm,
closeManualForm,
updateContactFormSearchQuery,
updateManualFormSearchQuery,
updateContactCapacity,
setNode,
contactFormSelectors,
updateManualFormErrors,
setChannelFormType,
fetchDescribeNetwork,
hideActivityModal
}
const mapStateToProps = state => ({
activity: state.activity,
lnd: state.lnd,
ticker: state.ticker,
address: state.address,
info: state.info,
payment: state.payment,
transaction: state.transaction,
peers: state.peers,
channels: state.channels,
contactsform: state.contactsform,
balance: state.balance,
form: state.form,
requestform: state.requestform,
invoice: state.invoice,
error: state.error,
network: state.network,
settings: state.settings,
isLoading:
infoSelectors.infoLoading(state) ||
tickerSelectors.tickerLoading(state) ||
!tickerSelectors.currencyName(state) ||
state.balance.channelBalance === null ||
state.balance.walletBalance === null,
activityModalItem: activitySelectors.activityModalItem(state),
currentTheme: themeSelectors.currentTheme(state),
currentTicker: tickerSelectors.currentTicker(state),
currencyFilters: tickerSelectors.currencyFilters(state),
currencyName: tickerSelectors.currencyName(state),
syncPercentage: lndSelectors.syncPercentage(state),
filteredNetworkNodes: contactFormSelectors.filteredNetworkNodes(state),
showManualForm: contactFormSelectors.showManualForm(state),
manualFormIsValid: contactFormSelectors.manualFormIsValid(state),
contactFormFiatAmount: contactFormSelectors.contactFormFiatAmount(state),
dupeChanInfo: contactFormSelectors.dupeChanInfo(state),
currentChannels: currentChannels(state),
activeChannelPubkeys: channelsSelectors.activeChannelPubkeys(state),
nonActiveChannelPubkeys: channelsSelectors.nonActiveChannelPubkeys(state),
pendingOpenChannelPubkeys: channelsSelectors.pendingOpenChannelPubkeys(state),
nonActiveFilters: channelsSelectors.nonActiveFilters(state),
channelNodes: channelsSelectors.channelNodes(state)
})
const mergeProps = (stateProps, dispatchProps, ownProps) => {
const formProps = formType => {
if (!formType) {
return {}
}
return {}
}
const networkTabProps = {
currentChannels: stateProps.currentChannels,
channels: stateProps.channels,
balance: stateProps.balance,
currentTicker: stateProps.currentTicker,
contactsform: stateProps.contactsform,
nodes: stateProps.network.nodes,
nonActiveFilters: stateProps.nonActiveFilters,
ticker: stateProps.ticker,
network: stateProps.info.network,
currencyName: stateProps.currencyName,
fetchChannels: dispatchProps.fetchChannels,
openContactsForm: dispatchProps.openContactsForm,
contactFormSelectors: dispatchProps.contactFormSelectors,
updateManualFormError: dispatchProps.updateManualFormErrors,
toggleFilterPulldown: dispatchProps.toggleFilterPulldown,
changeFilter: dispatchProps.changeFilter,
updateChannelSearchQuery: dispatchProps.updateChannelSearchQuery,
setSelectedChannel: dispatchProps.setSelectedChannel,
closeChannel: dispatchProps.closeChannel,
suggestedNodesProps: {
suggestedNodesLoading: stateProps.channels.suggestedNodesLoading,
suggestedNodes: stateProps.info.data.testnet
? stateProps.channels.suggestedNodes.testnet
: stateProps.channels.suggestedNodes.mainnet,
setNode: dispatchProps.setNode,
openSubmitChannelForm: () => dispatchProps.setChannelFormType('SUBMIT_CHANNEL_FORM')
}
}
const contactsFormProps = {
closeContactsForm: dispatchProps.closeContactsForm,
openSubmitChannelForm: () => dispatchProps.setChannelFormType('SUBMIT_CHANNEL_FORM'),
updateContactFormSearchQuery: dispatchProps.updateContactFormSearchQuery,
updateManualFormSearchQuery: dispatchProps.updateManualFormSearchQuery,
updateContactCapacity: dispatchProps.updateContactCapacity,
setNode: dispatchProps.setNode,
openChannel: dispatchProps.openChannel,
updateManualFormErrors: dispatchProps.updateManualFormErrors,
openManualForm: () => dispatchProps.setChannelFormType('MANUAL_FORM'),
contactsform: stateProps.contactsform,
filteredNetworkNodes: stateProps.filteredNetworkNodes,
loadingChannelPubkeys: stateProps.channels.loadingChannelPubkeys,
showManualForm: stateProps.showManualForm,
manualFormIsValid: stateProps.manualFormIsValid,
activeChannelPubkeys: stateProps.activeChannelPubkeys,
nonActiveChannelPubkeys: stateProps.nonActiveChannelPubkeys,
pendingOpenChannelPubkeys: stateProps.pendingOpenChannelPubkeys
}
const activityModalProps = {
itemType: stateProps.activity.modal.itemType,
itemId: stateProps.activity.modal.itemId,
item: stateProps.activityModalItem,
ticker: stateProps.ticker,
currentTicker: stateProps.currentTicker,
network: stateProps.info.network,
hideActivityModal: dispatchProps.hideActivityModal,
toggleCurrencyProps: {
currencyFilters: stateProps.currencyFilters,
currencyName: stateProps.currencyName,
setCurrency: dispatchProps.setCurrency
}
}
const receiveModalProps = {
isOpen: stateProps.address.walletModal,
network: stateProps.info.network,
pubkey: get(stateProps.info, 'data.uris[0]') || get(stateProps.info, 'data.identity_pubkey'),
address: stateProps.address.address,
alias: stateProps.info.data.alias,
closeReceiveModal: dispatchProps.closeWalletModal
}
const submitChannelFormProps = {
submitChannelFormOpen: stateProps.contactsform.submitChannelFormOpen,
node: stateProps.contactsform.node,
contactCapacity: stateProps.contactsform.contactCapacity,
fiatTicker: stateProps.ticker.fiatTicker,
dupeChanInfo: stateProps.dupeChanInfo,
updateContactCapacity: dispatchProps.updateContactCapacity,
closeChannelForm: () => dispatchProps.setChannelFormType(null),
closeContactsForm: dispatchProps.closeContactsForm,
openChannel: dispatchProps.openChannel,
ticker: stateProps.ticker,
toggleCurrencyProps: {
currencyFilters: stateProps.currencyFilters,
currencyName: stateProps.currencyName,
contactFormFiatAmount: stateProps.contactFormFiatAmount,
setCurrency: dispatchProps.setCurrency,
onCurrencyFilterClick: currency => {
dispatchProps.updateContactCapacity(
btc.convert(stateProps.ticker.currency, currency, stateProps.contactsform.contactCapacity)
)
dispatchProps.setCurrency(currency)
}
}
}
const connectManuallyProps = {
closeManualForm: dispatchProps.closeManualForm,
updateManualFormSearchQuery: dispatchProps.updateManualFormSearchQuery,
updateManualFormErrors: dispatchProps.updateManualFormErrors,
setNode: dispatchProps.setNode,
openSubmitChannelForm: () => dispatchProps.setChannelFormType('SUBMIT_CHANNEL_FORM'),
manualFormOpen: stateProps.contactsform.manualFormOpen,
manualSearchQuery: stateProps.contactsform.manualSearchQuery,
manualFormIsValid: stateProps.manualFormIsValid,
showErrors: stateProps.contactsform.showErrors
}
const calcChannelFormProps = formType => {
if (formType === 'MANUAL_FORM') {
return connectManuallyProps
}
if (formType === 'SUBMIT_CHANNEL_FORM') {
return submitChannelFormProps
}
return {}
}
const channelFormProps = {
formType: stateProps.contactsform.formType,
formProps: calcChannelFormProps(stateProps.contactsform.formType),
closeForm: () => dispatchProps.setChannelFormType(null)
}
return {
...stateProps,
...dispatchProps,
...ownProps,
// props for the network sidebar
networkTabProps,
// props for the contacts form
contactsFormProps,
// props for the receive modal
receiveModalProps,
// props for the activity modals
activityModalProps,
// props for the form to open a channel
submitChannelFormProps,
// props for the form to connect manually to a peer
connectManuallyProps,
// props for the channel form wrapper
channelFormProps,
// Props to pass to the request form
formProps: formProps(stateProps.form.formType),
// action to close form
closeForm: () => dispatchProps.setFormType(null)
}
}
export default withRouter(
connect(
mapStateToProps,
mapDispatchToProps,
mergeProps
)(withLoading(App))
)