@@ -65,7 +67,8 @@ class Wallet extends Component {
Wallet.propTypes = {
balance: PropTypes.object.isRequired,
address: PropTypes.string.isRequired,
- info: PropTypes.object.isRequired
+ info: PropTypes.object.isRequired,
+ newAddress: PropTypes.func.isRequired
}
export default Wallet
diff --git a/app/containers/Root.js b/app/containers/Root.js
index 5200c97b..e54a8840 100644
--- a/app/containers/Root.js
+++ b/app/containers/Root.js
@@ -2,6 +2,7 @@
import React from 'react'
import { Provider, connect } from 'react-redux'
import { ConnectedRouter } from 'react-router-redux'
+import PropTypes from 'prop-types'
import { fetchBlockHeight, lndSelectors } from 'reducers/lnd'
import LoadingBolt from 'components/LoadingBolt'
import LndSyncing from 'components/LndSyncing'
@@ -22,40 +23,42 @@ type RootType = {
history: {}
};
-class Root extends React.Component {
- render() {
- const {
- store,
- history,
- lnd,
- fetchBlockHeight,
- syncPercentage
- } = this.props
-
- console.log('lnd: ', lnd)
- console.log('lnd: ', lnd)
-
- if (lnd.syncing) {
- return (
-
- )
- }
-
- if (!lnd.grpcStarted) { return
}
-
+const Root = ({
+ store,
+ history,
+ lnd,
+ fetchBlockHeight,
+ syncPercentage
+}) => {
+ // If we are syncing show the syncing screen
+ if (lnd.syncing) {
return (
-
-
-
-
-
+
)
}
-}
+
+ // Don't launch the app without gRPC connection
+ if (!lnd.grpcStarted) { return
}
+
+ return (
+
+
+
+
+
+ )
+}
+Root.propTypes = {
+ store: PropTypes.object.isRequired,
+ history: PropTypes.object.isRequired,
+ lnd: PropTypes.object.isRequired,
+ fetchBlockHeight: PropTypes.func.isRequired,
+ syncPercentage: PropTypes.number.isRequired
+}
-export default connect(mapStateToProps, mapDispatchToProps)(Root)
\ No newline at end of file
+export default connect(mapStateToProps, mapDispatchToProps)(Root)
diff --git a/app/icons/1024x1024.png b/app/icons/1024x1024.png
deleted file mode 100755
index 5940b65a..00000000
Binary files a/app/icons/1024x1024.png and /dev/null differ
diff --git a/app/icons/128x128.png b/app/icons/128x128.png
deleted file mode 100755
index 14e578d2..00000000
Binary files a/app/icons/128x128.png and /dev/null differ
diff --git a/app/icons/16x16.png b/app/icons/16x16.png
deleted file mode 100755
index 260a46cb..00000000
Binary files a/app/icons/16x16.png and /dev/null differ
diff --git a/app/icons/24x24.png b/app/icons/24x24.png
deleted file mode 100755
index 56172416..00000000
Binary files a/app/icons/24x24.png and /dev/null differ
diff --git a/app/icons/256x256.png b/app/icons/256x256.png
deleted file mode 100755
index 755a6e51..00000000
Binary files a/app/icons/256x256.png and /dev/null differ
diff --git a/app/icons/32x32.png b/app/icons/32x32.png
deleted file mode 100755
index 63423dfe..00000000
Binary files a/app/icons/32x32.png and /dev/null differ
diff --git a/app/icons/48x48.png b/app/icons/48x48.png
deleted file mode 100755
index 74d87a0c..00000000
Binary files a/app/icons/48x48.png and /dev/null differ
diff --git a/app/icons/512x512.png b/app/icons/512x512.png
deleted file mode 100755
index 313cd499..00000000
Binary files a/app/icons/512x512.png and /dev/null differ
diff --git a/app/icons/64x64.png b/app/icons/64x64.png
deleted file mode 100755
index 6de0ec0e..00000000
Binary files a/app/icons/64x64.png and /dev/null differ
diff --git a/app/icons/96x96.png b/app/icons/96x96.png
deleted file mode 100755
index 8255ab58..00000000
Binary files a/app/icons/96x96.png and /dev/null differ
diff --git a/app/icons/globe.svg b/app/icons/globe.svg
new file mode 100644
index 00000000..0a0586d3
--- /dev/null
+++ b/app/icons/globe.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/lnd/methods/index.js b/app/lnd/methods/index.js
index ca9387b6..7f4a4132 100644
--- a/app/lnd/methods/index.js
+++ b/app/lnd/methods/index.js
@@ -24,7 +24,6 @@ import * as networkController from './networkController'
export default function (lnd, event, msg, data) {
- console.log('msg: ', msg)
switch (msg) {
case 'info':
networkController.getInfo(lnd)
@@ -32,10 +31,7 @@ export default function (lnd, event, msg, data) {
event.sender.send('receiveInfo', infoData)
event.sender.send('receiveCryptocurrency', infoData.chains[0])
})
- .catch(error => {
- console.log('error: ', error)
- event.sender.send('infoFailed')
- })
+ .catch(() => event.sender.send('infoFailed'))
break
case 'describeNetwork':
networkController.describeGraph(lnd)
@@ -129,11 +125,11 @@ export default function (lnd, event, msg, data) {
// Payment looks like { payment_preimage: Buffer, payment_route: Object }
// { paymentRequest } = data
paymentsController.sendPaymentSync(lnd, data)
- .then(({ payment_route }) => event.sender.send('paymentSuccessful', Object.assign(data, { payment_route })))
- .catch((error) => {
- console.log('payinvoice error: ', error)
- event.sender.send('paymentFailed', { error: error.toString() })
+ .then(({ payment_route }) => {
+ console.log('payinvoice success: ', payment_route)
+ event.sender.send('paymentSuccessful', Object.assign(data, { payment_route }))
})
+ .catch(({ error }) => event.sender.send('paymentFailed', { error: error.toString() }))
break
case 'sendCoins':
// Transaction looks like { txid: String }
diff --git a/app/lnd/methods/paymentsController.js b/app/lnd/methods/paymentsController.js
index b59b64a7..f0f36fab 100644
--- a/app/lnd/methods/paymentsController.js
+++ b/app/lnd/methods/paymentsController.js
@@ -9,6 +9,8 @@ export function sendPaymentSync(lnd, { paymentRequest }) {
lnd.sendPaymentSync({ payment_request: paymentRequest }, (err, data) => {
if (err) { reject(err) }
+ if (!data.payment_route) { reject({ error: data.payment_error }) }
+
resolve(data)
})
})
diff --git a/app/lnd/utils/index.js b/app/lnd/utils/index.js
deleted file mode 100644
index 7662d117..00000000
--- a/app/lnd/utils/index.js
+++ /dev/null
@@ -1,42 +0,0 @@
-import zbase32 from 'zbase32'
-
-function convertBigEndianBufferToLong(longBuffer) {
- let longValue = 0
- const byteArray = Buffer.from(longBuffer).swap64()
-
- for (let i = byteArray.length - 1; i >= 0; i -= 1) {
- longValue = (longValue * 256) + byteArray[i]
- }
-
- return longValue
-}
-
-export function decodeInvoice(payreq) {
- const payreqBase32 = zbase32.decode(payreq)
-
- const bufferHexRotated = Buffer.from(payreqBase32).toString('hex')
- const bufferHex = bufferHexRotated.substr(bufferHexRotated.length - 1, bufferHexRotated.length)
- + bufferHexRotated.substr(0, bufferHexRotated.length - 1)
- const buffer = Buffer.from(bufferHex, 'hex')
-
- const pubkeyBuffer = buffer.slice(0, 33);
- const pubkey = pubkeyBuffer.toString('hex');
-
- const paymentHashBuffer = buffer.slice(33, 65)
- const paymentHashHex = paymentHashBuffer.toString('hex')
-
- const valueBuffer = buffer.slice(65, 73)
-
- const amount = convertBigEndianBufferToLong(valueBuffer)
-
- return {
- payreq,
- pubkey,
- amount,
- r_hash: paymentHashHex
- }
-}
-
-export default {
- decodeInvoice
-}
diff --git a/app/main.dev.js b/app/main.dev.js
index 431585fd..8f69f8e2 100644
--- a/app/main.dev.js
+++ b/app/main.dev.js
@@ -165,7 +165,7 @@ export const startLnd = () => {
'--bitcoin.active',
'--bitcoin.testnet',
'--neutrino.active',
- '--neutrino.connect=165.227.7.29:18333',
+ '--neutrino.connect=faucet.lightning.community:18333',
'--autopilot.active',
'--debuglevel=debug',
'--no-macaroons',
diff --git a/app/reducers/address.js b/app/reducers/address.js
index 1083c16b..7ecb63f5 100644
--- a/app/reducers/address.js
+++ b/app/reducers/address.js
@@ -28,9 +28,7 @@ export const newAddress = type => async (dispatch) => {
}
// Receive IPC event for info
-export const receiveAddress = (event, address) => dispatch => {
- dispatch({ type: RECEIVE_ADDRESS, address })
-}
+export const receiveAddress = (event, address) => dispatch => dispatch({ type: RECEIVE_ADDRESS, address })
// ------------------------------------
// Action Handlers
diff --git a/app/reducers/channels.js b/app/reducers/channels.js
index 58dfa251..0a919805 100644
--- a/app/reducers/channels.js
+++ b/app/reducers/channels.js
@@ -1,10 +1,10 @@
import { createSelector } from 'reselect'
import { ipcRenderer } from 'electron'
import { btc } from 'utils'
+import { showNotification } from 'notifications'
import { fetchDescribeNetwork } from './network'
-import { closeChannelForm } from './channelform'
+import { closeChannelForm, resetChannelForm } from './channelform'
import { setError } from './error'
-import { showNotification } from 'notifications'
// ------------------------------------
// Constants
// ------------------------------------
@@ -113,28 +113,34 @@ export const openChannel = ({ pubkey, local_amt, push_amt }) => (dispatch) => {
// TODO: Decide how to handle streamed updates for channels
// Receive IPC event for openChannel
export const channelSuccessful = () => (dispatch) => {
+ console.log('CHANNEL channelSuccessful')
dispatch(fetchChannels())
dispatch(closeChannelForm())
+ dispatch(resetChannelForm())
}
// Receive IPC event for updated channel
-export const pushchannelupdated = () => (dispatch) => {
+export const pushchannelupdated = (event, data) => (dispatch) => {
+ console.log('PUSH CHANNEL UPDATED: ', data)
dispatch(fetchChannels())
}
// Receive IPC event for channel end
export const pushchannelend = event => (dispatch) => { // eslint-disable-line
+ console.log('PUSH CHANNEL END: ')
dispatch(fetchChannels())
}
// Receive IPC event for channel error
export const pushchannelerror = (event, { error }) => (dispatch) => {
+ console.log('PUSH CHANNEL ERROR: ', error)
dispatch(openingFailure())
dispatch(setError(error))
}
// Receive IPC event for channel status
-export const pushchannelstatus = event => (dispatch) => { // eslint-disable-line
+export const pushchannelstatus = (event, data) => (dispatch) => { // eslint-disable-line
+ console.log('PUSH CHANNEL STATUS: ', data)
dispatch(fetchChannels())
}
@@ -194,18 +200,18 @@ export const channelGraphData = (event, data) => (dispatch, getState) => {
dispatch(fetchDescribeNetwork())
// loop through the channel updates
- for(let i = 0; i < channel_updates.length; i++) {
- let channel_update = channel_updates[i]
- let { advertising_node, connecting_node } = channel_update
+ for (let i = 0; i < channel_updates.length; i++) {
+ const channel_update = channel_updates[i]
+ const { advertising_node, connecting_node } = channel_update
// if our node is involved in this update we wanna show a notification
- if(info.data.identity_pubkey === advertising_node || info.data.identity_pubkey === connecting_node) {
+ if (info.data.identity_pubkey === advertising_node || info.data.identity_pubkey === connecting_node) {
// this channel has to do with the user, lets fetch a new channel list for them
// TODO: full fetch is probably not necessary
dispatch(fetchChannels())
// Construct the notification
- let otherParty = info.data.identity_pubkey === advertising_node ? connecting_node : advertising_node
+ const otherParty = info.data.identity_pubkey === advertising_node ? connecting_node : advertising_node
let notifBody = `No new friends, just new channels. Your channel with ${otherParty}` // eslint-disable-line
const notifTitle = 'New channel detected'
@@ -217,7 +223,7 @@ export const channelGraphData = (event, data) => (dispatch, getState) => {
}
// IPC event for channel graph status
-export const channelGraphStatus = (event, data) => (dispatch) => {
+export const channelGraphStatus = (event, data) => () => {
console.log('channelGraphStatus: ', data)
}
diff --git a/app/reducers/info.js b/app/reducers/info.js
index c3c0e514..0a80e8cc 100644
--- a/app/reducers/info.js
+++ b/app/reducers/info.js
@@ -19,23 +19,19 @@ export function getInfo() {
// Send IPC event for getinfo
export const fetchInfo = () => async (dispatch) => {
- console.log('fetching info')
dispatch(getInfo())
ipcRenderer.send('lnd', { msg: 'info' })
}
// Receive IPC event for info
-export const receiveInfo = (event, data) => dispatch => {
- console.log('receiving info and fetching other stuff')
+export const receiveInfo = (event, data) => (dispatch) => {
dispatch(fetchBalance())
dispatch(newAddress('p2pkh'))
dispatch({ type: RECEIVE_INFO, data })
}
// IPC info fetch failed
-export const infoFailed = (event, data) => dispatch => {
- console.log('INFO FAILED data: ', data)
-}
+// export const infoFailed = (event, data) => dispatch => {}
// ------------------------------------
// Action Handlers
diff --git a/app/reducers/lnd.js b/app/reducers/lnd.js
index ed447e88..997fec38 100644
--- a/app/reducers/lnd.js
+++ b/app/reducers/lnd.js
@@ -41,12 +41,12 @@ export const lndSynced = () => (dispatch) => {
showNotification(notifTitle, notifBody)
}
-export const grpcDisconnected = () => (dispatch) => dispatch({ type: GRPC_DISCONNECTED })
+export const grpcDisconnected = () => dispatch => dispatch({ type: GRPC_DISCONNECTED })
-export const grpcConnected = () => (dispatch) => dispatch({ type: GRPC_CONNECTED })
+export const grpcConnected = () => dispatch => dispatch({ type: GRPC_CONNECTED })
// Receive IPC event for LND streaming a line
-export const lndStdout = (event, line) => dispatch => {
+export const lndStdout = (event, line) => (dispatch) => {
let height
let trimmed
diff --git a/app/reducers/network.js b/app/reducers/network.js
index ff8417dc..28dfedaf 100644
--- a/app/reducers/network.js
+++ b/app/reducers/network.js
@@ -14,6 +14,12 @@ export const SET_CURRENT_ROUTE = 'SET_CURRENT_ROUTE'
export const SET_CURRENT_CHANNEL = 'SET_CURRENT_CHANNEL'
+export const SET_CURRENT_TAB = 'SET_CURRENT_TAB'
+
+export const SET_CURRENT_PEER = 'SET_CURRENT_PEER'
+
+export const UPDATE_PAY_REQ = 'UPDATE_PAY_REQ'
+
// ------------------------------------
// Actions
// ------------------------------------
@@ -44,6 +50,27 @@ export function setCurrentChannel(selectedChannel) {
}
}
+export function setCurrentTab(currentTab) {
+ return {
+ type: SET_CURRENT_TAB,
+ currentTab
+ }
+}
+
+export function setCurrentPeer(currentPeer) {
+ return {
+ type: SET_CURRENT_PEER,
+ currentPeer
+ }
+}
+
+export function updatePayReq(pay_req) {
+ return {
+ type: UPDATE_PAY_REQ,
+ pay_req
+ }
+}
+
// Send IPC event for describeNetwork
export const fetchDescribeNetwork = () => (dispatch) => {
dispatch(getDescribeNetwork())
@@ -83,7 +110,13 @@ const ACTION_HANDLERS = {
}
),
- [SET_CURRENT_CHANNEL]: (state, { selectedChannel }) => ({ ...state, selectedChannel })
+ [SET_CURRENT_CHANNEL]: (state, { selectedChannel }) => ({ ...state, selectedChannel }),
+
+ [SET_CURRENT_TAB]: (state, { currentTab }) => ({ ...state, currentTab }),
+
+ [SET_CURRENT_PEER]: (state, { currentPeer }) => ({ ...state, currentPeer }),
+
+ [UPDATE_PAY_REQ]: (state, { pay_req }) => ({ ...state, pay_req })
}
// ------------------------------------
@@ -115,7 +148,13 @@ const initialState = {
routes: [],
currentRoute: {}
},
- selectedChannel: {}
+ selectedChannel: {},
+
+ currentTab: 1,
+
+ currentPeer: {},
+
+ pay_req: ''
}
diff --git a/app/routes/activity/components/Activity.js b/app/routes/activity/components/Activity.js
index 6ed2af26..7326f26a 100644
--- a/app/routes/activity/components/Activity.js
+++ b/app/routes/activity/components/Activity.js
@@ -3,6 +3,7 @@ import PropTypes from 'prop-types'
import { MdSearch } from 'react-icons/lib/md'
import { FaAngleDown } from 'react-icons/lib/fa'
+import Wallet from 'components/Wallet'
import Invoice from './components/Invoice'
import Payment from './components/Payment'
import Transaction from './components/Transaction'
@@ -44,6 +45,9 @@ class Activity extends Component {
ticker,
searchInvoices,
invoice: { invoicesSearchText, invoiceLoading },
+ address: { address },
+ balance,
+ info,
payment: { paymentLoading },
currentTicker,
activity: { modal, filter, filterPulldown },
@@ -51,7 +55,8 @@ class Activity extends Component {
changeFilter,
toggleFilterPulldown,
currentActivity,
- nonActiveFilters
+ nonActiveFilters,
+ newAddress
} = this.props
if (invoiceLoading || paymentLoading) { return
Loading...
}
@@ -66,6 +71,8 @@ class Activity extends Component {
currentTicker={currentTicker}
/>
+
+
@@ -79,16 +66,9 @@ class App extends Component {
}
App.propTypes = {
- lnd: PropTypes.object.isRequired,
-
- syncPercentage: PropTypes.number.isRequired,
- fetchBlockHeight: PropTypes.func.isRequired,
-
modal: PropTypes.object.isRequired,
ticker: PropTypes.object.isRequired,
- address: PropTypes.object.isRequired,
balance: PropTypes.object.isRequired,
- info: PropTypes.object.isRequired,
form: PropTypes.object.isRequired,
formProps: PropTypes.object.isRequired,
closeForm: PropTypes.func.isRequired,
diff --git a/app/routes/channels/components/Channels.js b/app/routes/channels/components/Channels.js
index 49e4740f..4c68986d 100644
--- a/app/routes/channels/components/Channels.js
+++ b/app/routes/channels/components/Channels.js
@@ -1,24 +1,30 @@
import React, { Component } from 'react'
import PropTypes from 'prop-types'
-import { FaAlignJustify, FaGlobe, FaAngleDown, FaRepeat } from 'react-icons/lib/fa'
+import { FaAngleDown, FaRepeat } from 'react-icons/lib/fa'
import { MdSearch } from 'react-icons/lib/md'
import OpenPendingChannel from 'components/Channels/OpenPendingChannel'
import ClosedPendingChannel from 'components/Channels/ClosedPendingChannel'
import Channel from 'components/Channels/Channel'
-import NetworkChannels from 'components/Channels/NetworkChannels'
import ChannelForm from 'components/ChannelForm'
import styles from './Channels.scss'
class Channels extends Component {
- componentWillMount() {
- const { fetchChannels, fetchPeers, fetchDescribeNetwork } = this.props
+ constructor(props) {
+ super(props)
+
+ this.state = {
+ refreshing: false
+ }
+ }
+ componentWillMount() {
+ const { fetchChannels, fetchPeers } = this.props
+
fetchChannels()
fetchPeers()
- fetchDescribeNetwork()
}
render() {
@@ -36,48 +42,61 @@ class Channels extends Component {
toggleFilterPulldown,
changeFilter,
- activeChannels,
currentChannels,
- openChannels,
updateChannelSearchQuery,
- setViewType,
openChannelForm,
ticker,
currentTicker,
- channelFormProps,
-
- network,
- identity_pubkey,
- setCurrentChannel
+ channelFormProps
} = this.props
- const refreshClicked = (event) => {
+ const refreshClicked = () => {
+ // turn the spinner on
+ this.setState({ refreshing: true })
+
// store event in icon so we dont get an error when react clears it
- const icon = event.currentTarget
+ const icon = this.refs.repeat.childNodes
// fetch peers
fetchChannels()
- // clear animation after the second so we can reuse it
- setTimeout(() => { icon.style.animation = '' }, 1000)
-
- // spin icon for 1 sec
- icon.style.animation = 'spin 1000ms linear 1'
- }
+ // wait for the svg to appear as child
+ const svgTimeout = setTimeout(() => {
+ if (icon[0].tagName === 'svg') {
+ // spin icon for 1 sec
+ icon[0].style.animation = 'spin 1000ms linear 1'
+ clearTimeout(svgTimeout)
+ }
+ }, 1)
- const networkClicked = () => {
- if (!activeChannels.length) { return }
-
- setViewType(1)
+ // clear animation after the second so we can reuse it
+ const refreshTimeout = setTimeout(() => {
+ icon[0].style.animation = ''
+ this.setState({ refreshing: false })
+ clearTimeout(refreshTimeout)
+ }, 1000)
}
return (
+
+
+
+
+ Create new channel
+
+
+
+
-
@@ -122,62 +126,55 @@ class Channels extends Component {
}
-
-
+
+
+ {
+ this.state.refreshing ?
+
+ :
+ 'Refresh'
+ }
+
- {
- viewType === 0 &&
-
- {
- currentChannels.map((channel, index) => {
- if (Object.prototype.hasOwnProperty.call(channel, 'blocks_till_open')) {
- return (
-
- )
- } else if (Object.prototype.hasOwnProperty.call(channel, 'closing_txid')) {
- return (
-
- )
- }
+
+ {
+ currentChannels.map((channel, index) => {
+ if (Object.prototype.hasOwnProperty.call(channel, 'blocks_till_open')) {
return (
-
+ )
+ } else if (Object.prototype.hasOwnProperty.call(channel, 'closing_txid')) {
+ return (
+
)
- })
- }
-
- }
- { viewType === 1 &&
-
- }
+ }
+ return (
+
+ )
+ })
+ }
+
)
@@ -186,29 +183,23 @@ class Channels extends Component {
Channels.propTypes = {
fetchChannels: PropTypes.func.isRequired,
- fetchPeers: PropTypes.func.isRequired,
channels: PropTypes.object.isRequired,
currentChannels: PropTypes.array.isRequired,
- openChannels: PropTypes.array.isRequired,
nonActiveFilters: PropTypes.array.isRequired,
updateChannelSearchQuery: PropTypes.func.isRequired,
- setViewType: PropTypes.func.isRequired,
setCurrentChannel: PropTypes.func.isRequired,
openChannelForm: PropTypes.func.isRequired,
closeChannel: PropTypes.func.isRequired,
toggleFilterPulldown: PropTypes.func.isRequired,
changeFilter: PropTypes.func.isRequired,
+ fetchPeers: PropTypes.func.isRequired,
ticker: PropTypes.object.isRequired,
currentTicker: PropTypes.object.isRequired,
- channelFormProps: PropTypes.object.isRequired,
-
- network: PropTypes.object.isRequired,
- fetchDescribeNetwork: PropTypes.func.isRequired,
- identity_pubkey: PropTypes.string.isRequired
+ channelFormProps: PropTypes.object.isRequired
}
export default Channels
diff --git a/app/routes/channels/components/Channels.scss b/app/routes/channels/components/Channels.scss
index 56d354e2..f70a37c6 100644
--- a/app/routes/channels/components/Channels.scss
+++ b/app/routes/channels/components/Channels.scss
@@ -5,8 +5,9 @@
}
.search {
- height: 75px;
+ height: 55px;
padding: 2px 25px;
+ border-top: 1px solid $darkgrey;
border-bottom: 1px solid $darkgrey;
background: $white;
@@ -18,8 +19,8 @@
.label {
width: 5%;
- line-height: 70px;
- font-size: 25px;
+ line-height: 50px;
+ font-size: 20px;
text-align: center;
cursor: pointer;
}
@@ -30,8 +31,8 @@
padding: 0;
border: 0;
border-radius: 0;
- height: 68px;
- font-size: 18px;
+ height: 50px;
+ font-size: 16px;
}
}
@@ -39,6 +40,30 @@
display: flex;
flex-direction: row;
justify-content: space-between;
+ background: $lightgrey;
+
+ .titleContainer {
+ padding: 20px 40px;
+
+ .left {
+ padding: 10px 0;
+
+ h1 {
+ text-transform: uppercase;
+ font-size: 26px;
+ margin-right: 5px;
+ }
+ }
+ }
+
+ .createChannelContainer {
+ padding: 20px 40px;
+
+ .createChannelButton {
+ font-size: 14px;
+ margin-left: 10px;
+ }
+ }
}
.filtersContainer {
@@ -46,7 +71,7 @@
display: flex;
flex-direction: row;
justify-content: space-between;
- padding: 0 40px;
+ padding: 20px 40px;
h2, h2 span {
color: $bluegrey;
@@ -89,17 +114,22 @@
}
}
}
-
+
.refreshContainer {
- color: $bluegrey;
+ text-align: right;
+ cursor: pointer;
- &:hover {
- cursor: pointer;
- color: lighten($bluegrey, 10%);
+ .refresh {
+ text-decoration: underline;
+
+ svg {
+ font-size: 12px;
+ }
}
}
}
+
.layoutsContainer {
padding: 40px;
diff --git a/app/routes/peers/components/Peers.js b/app/routes/peers/components/Peers.js
index cc24f854..c8ab1c61 100644
--- a/app/routes/peers/components/Peers.js
+++ b/app/routes/peers/components/Peers.js
@@ -1,9 +1,7 @@
import React, { Component } from 'react'
import PropTypes from 'prop-types'
-import Isvg from 'react-inlinesvg'
-import userIcon from 'icons/user.svg'
-import { FaUser, FaRepeat } from 'react-icons/lib/fa'
+import { FaRepeat } from 'react-icons/lib/fa'
import { MdSearch } from 'react-icons/lib/md'
import PeerForm from 'components/Peers/PeerForm'
@@ -13,6 +11,14 @@ import Peer from 'components/Peers/Peer'
import styles from './Peers.scss'
class Peers extends Component {
+ constructor(props) {
+ super(props)
+
+ this.state = {
+ refreshing: false
+ }
+ }
+
componentWillMount() {
this.props.fetchPeers()
}
@@ -28,22 +34,34 @@ class Peers extends Component {
peerModalOpen,
filteredPeers,
- peers: { peer, searchQuery },
- info: { data: { identity_pubkey } }
+ peers: { peer, searchQuery }
} = this.props
- const refreshClicked = event => {
+ const refreshClicked = () => {
+ // turn the spinner on
+ this.setState({ refreshing: true })
+
// store event in icon so we dont get an error when react clears it
- const icon = event.currentTarget
+ const icon = this.refs.repeat.childNodes
// fetch peers
fetchPeers()
- // clear animation after the second so we can reuse it
- setTimeout(() => { icon.style.animation = '' }, 1000)
+ // wait for the svg to appear as child
+ const svgTimeout = setTimeout(() => {
+ if (icon[0].tagName === 'svg') {
+ // spin icon for 1 sec
+ icon[0].style.animation = 'spin 1000ms linear 1'
+ clearTimeout(svgTimeout)
+ }
+ }, 1)
- // spin icon for 1 sec
- icon.style.animation = 'spin 1000ms linear 1'
+ // clear animation after the second so we can reuse it
+ const refreshTimeout = setTimeout(() => {
+ icon[0].style.animation = ''
+ this.setState({ refreshing: false })
+ clearTimeout(refreshTimeout)
+ }, 1000)
}
return (
@@ -55,15 +73,7 @@ class Peers extends Component {
-
-
-
- Your node public key
- {identity_pubkey}
-
-
+
Peers
@@ -74,7 +84,6 @@ class Peers extends Component {
-
@@ -89,10 +98,13 @@ class Peers extends Component {
-
-
+
+ {
+ this.state.refreshing ?
+
+ :
+ 'Refresh'
+ }
@@ -107,7 +119,18 @@ class Peers extends Component {
}
Peers.propTypes = {
-
+ fetchPeers: PropTypes.func.isRequired,
+ peerFormProps: PropTypes.object.isRequired,
+ setPeerForm: PropTypes.func.isRequired,
+ setPeer: PropTypes.func.isRequired,
+ updateSearchQuery: PropTypes.func.isRequired,
+ disconnectRequest: PropTypes.func.isRequired,
+
+ peerModalOpen: PropTypes.bool.isRequired,
+ filteredPeers: PropTypes.array.isRequired,
+ peers: PropTypes.object.isRequired,
+ peer: PropTypes.object,
+ searchQuery: PropTypes.string
}
export default Peers
diff --git a/app/routes/peers/components/Peers.scss b/app/routes/peers/components/Peers.scss
index 79e15e8a..ad152ccd 100644
--- a/app/routes/peers/components/Peers.scss
+++ b/app/routes/peers/components/Peers.scss
@@ -1,7 +1,7 @@
@import '../../../variables.scss';
.search {
- height: 75px;
+ height: 55px;
padding: 2px 25px;
border-top: 1px solid $darkgrey;
border-bottom: 1px solid $darkgrey;
@@ -15,8 +15,8 @@
.label {
width: 5%;
- line-height: 70px;
- font-size: 25px;
+ line-height: 50px;
+ font-size: 20px;
text-align: center;
cursor: pointer;
}
@@ -27,8 +27,8 @@
padding: 0;
border: 0;
border-radius: 0;
- height: 68px;
- font-size: 18px;
+ height: 50px;
+ font-size: 16px;
}
}
@@ -36,58 +36,43 @@
display: flex;
flex-direction: row;
justify-content: space-between;
+ background: $lightgrey;
.titleContainer {
- padding: 40px;
+ padding: 20px 40px;
.left {
padding: 10px 0;
- }
-
- .left, span {
- display: inline-block;
- }
-
- .identityPubkey {
- font-size: 30px;
- margin-right: 10px;
- display: flex;
- flex-direction: row;
- .userIcon {
- margin-right: 10px;
- }
-
- section h4 {
- font-size: 10px;
+ h1 {
text-transform: uppercase;
- letter-spacing: 1.2px;
- }
-
- section h2 {
- font-size: 14px;
- margin-top: 5px;
+ font-size: 26px;
+ margin-right: 5px;
}
}
}
.addPeerContainer {
- padding: 40px;
+ padding: 20px 40px;
.newPeerButton {
font-size: 14px;
+ margin-left: 10px;
}
}
}
.refreshContainer {
- display: flex;
- flex-direction: row;
- padding: 20px 40px 0px 40px;
+ padding: 20px 40px 0 40px;
+ text-align: right;
+ cursor: pointer;
.refresh {
- cursor: pointer;
- color: $bluegrey;
+ text-decoration: underline;
+
+ svg {
+ font-size: 12px;
+ }
}
}
diff --git a/app/routes/peers/containers/PeersContainer.js b/app/routes/peers/containers/PeersContainer.js
index a436c812..7fed1220 100644
--- a/app/routes/peers/containers/PeersContainer.js
+++ b/app/routes/peers/containers/PeersContainer.js
@@ -1,7 +1,7 @@
import { withRouter } from 'react-router'
import { connect } from 'react-redux'
-import {
+import {
fetchPeers,
setPeer,
setPeerForm,
diff --git a/app/variables.scss b/app/variables.scss
index 4948c218..214d8b7e 100644
--- a/app/variables.scss
+++ b/app/variables.scss
@@ -11,6 +11,7 @@ $darkestgrey: #999999;
$bluegrey: #555459;
$green: #0bb634;
+$terminalgreen: #00FF00;
$red: #ff0b00;
$blue: #007bb6;
$curve: cubic-bezier(0.650, 0.000, 0.450, 1.000);
\ No newline at end of file
diff --git a/package.json b/package.json
index f1bc3739..e6aea68b 100644
--- a/package.json
+++ b/package.json
@@ -202,7 +202,6 @@
"prop-types": "^15.5.10",
"qrcode.react": "^0.7.1",
"react": "^15.6.1",
- "react-addons-css-transition-group": "^15.6.0",
"react-dom": "^15.6.1",
"react-hot-loader": "3.0.0-beta.6",
"react-inlinesvg": "^0.6.2",
@@ -212,18 +211,13 @@
"react-router": "^4.1.1",
"react-router-dom": "^4.1.1",
"react-router-redux": "^5.0.0-alpha.6",
- "react-svg": "^2.1.21",
- "react-svg-morph": "^0.1.10",
- "react-vis-force": "^0.3.1",
- "react-websocket": "^1.1.7",
"redux": "^3.7.1",
"redux-electron-ipc": "^1.1.10",
"redux-thunk": "^2.2.0",
"reselect": "^3.0.1",
"satoshi-bitcoin": "^1.0.4",
"source-map-support": "^0.4.15",
- "xtend": "^4.0.1",
- "zbase32": "^0.0.2"
+ "xtend": "^4.0.1"
},
"devEngines": {
"node": ">=7.x",
diff --git a/resources/bin/darwin/lnd b/resources/bin/darwin/lnd
index a00c31f5..2d40c9b0 100755
Binary files a/resources/bin/darwin/lnd and b/resources/bin/darwin/lnd differ
diff --git a/resources/bin/linux/lnd b/resources/bin/linux/lnd
deleted file mode 100755
index 242db514..00000000
Binary files a/resources/bin/linux/lnd and /dev/null differ
diff --git a/resources/zap_2.svg b/resources/zap_2.svg
deleted file mode 100644
index 8db8e7de..00000000
--- a/resources/zap_2.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-
-
diff --git a/yarn.lock b/yarn.lock
index 35894bd7..08ae9c50 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1837,10 +1837,6 @@ center-align@^0.1.1:
align-text "^0.1.3"
lazy-cache "^1.0.3"
-chain-function@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/chain-function/-/chain-function-1.0.0.tgz#0d4ab37e7e18ead0bdc47b920764118ce58733dc"
-
chainsaw@~0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/chainsaw/-/chainsaw-0.1.0.tgz#5eab50b28afe58074d0d58291388828b5e5fbc98"
@@ -2532,31 +2528,6 @@ currently-unhandled@^0.4.1:
dependencies:
array-find-index "^1.0.1"
-d3-collection@1:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/d3-collection/-/d3-collection-1.0.4.tgz#342dfd12837c90974f33f1cc0a785aea570dcdc2"
-
-d3-dispatch@1:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-1.0.3.tgz#46e1491eaa9b58c358fce5be4e8bed626e7871f8"
-
-d3-force@^1.0.2:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/d3-force/-/d3-force-1.1.0.tgz#cebf3c694f1078fcc3d4daf8e567b2fbd70d4ea3"
- dependencies:
- d3-collection "1"
- d3-dispatch "1"
- d3-quadtree "1"
- d3-timer "1"
-
-d3-quadtree@1:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-1.0.3.tgz#ac7987e3e23fe805a990f28e1b50d38fcb822438"
-
-d3-timer@1:
- version "1.0.7"
- resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-1.0.7.tgz#df9650ca587f6c96607ff4e60cc38229e8dd8531"
-
d@1:
version "1.0.0"
resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f"
@@ -2778,10 +2749,6 @@ dom-converter@~0.1:
dependencies:
utila "~0.3"
-dom-helpers@^3.2.0:
- version "3.2.1"
- resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.2.1.tgz#3203e07fed217bd1f424b019735582fc37b2825a"
-
dom-serializer@0, dom-serializer@~0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82"
@@ -5603,7 +5570,7 @@ lodash.range@^3.2.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/lodash.range/-/lodash.range-3.2.0.tgz#f461e588f66683f7eadeade513e38a69a565a15d"
-lodash.reduce@^4.4.0, lodash.reduce@^4.6.0:
+lodash.reduce@^4.4.0:
version "4.6.0"
resolved "https://registry.yarnpkg.com/lodash.reduce/-/lodash.reduce-4.6.0.tgz#f1ab6b839299ad48f784abbf476596f03b914d3b"
@@ -6973,7 +6940,7 @@ promise@^7.1.1:
dependencies:
asap "~2.0.3"
-prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.6, prop-types@^15.5.8:
+prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.8:
version "15.5.10"
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.5.10.tgz#2797dfc3126182e3a95e3dfbb2e893ddd7456154"
dependencies:
@@ -7096,12 +7063,6 @@ rc@^1.0.1, rc@^1.1.2, rc@^1.1.6, rc@^1.1.7, rc@^1.2.1:
minimist "^1.2.0"
strip-json-comments "~2.0.1"
-react-addons-css-transition-group@^15.6.0:
- version "15.6.0"
- resolved "https://registry.yarnpkg.com/react-addons-css-transition-group/-/react-addons-css-transition-group-15.6.0.tgz#69887cf6e4874d25cd66e22a699e29f0d648aba0"
- dependencies:
- react-transition-group "^1.2.0"
-
react-addons-test-utils@^15.6.0:
version "15.6.0"
resolved "https://registry.yarnpkg.com/react-addons-test-utils/-/react-addons-test-utils-15.6.0.tgz#062d36117fe8d18f3ba5e06eb33383b0b85ea5b9"
@@ -7182,10 +7143,6 @@ react-redux@^5.0.5:
loose-envify "^1.1.0"
prop-types "^15.5.10"
-react-render-to-json@0.0.4:
- version "0.0.4"
- resolved "https://registry.yarnpkg.com/react-render-to-json/-/react-render-to-json-0.0.4.tgz#0db588e2952cea05a66a3390554c46c3ea74d006"
-
react-router-dom@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-4.1.1.tgz#3021ade1f2c160af97cf94e25594c5f294583025"
@@ -7215,19 +7172,6 @@ react-router@^4.1.1:
prop-types "^15.5.4"
warning "^3.0.0"
-react-svg-morph@^0.1.10:
- version "0.1.10"
- resolved "https://registry.yarnpkg.com/react-svg-morph/-/react-svg-morph-0.1.10.tgz#780cf6823a6ab640a1367e43b7c9509d68157bf3"
- dependencies:
- react-render-to-json "0.0.4"
- svgpath "^2.1.0"
-
-react-svg@^2.1.21:
- version "2.1.21"
- resolved "https://registry.yarnpkg.com/react-svg/-/react-svg-2.1.21.tgz#0caf34002649542967f04e197480d784768e914c"
- dependencies:
- svg-injector "^1.1.3"
-
react-test-renderer@^15.6.1:
version "15.6.1"
resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-15.6.1.tgz#026f4a5bb5552661fd2cc4bbcd0d4bc8a35ebf7e"
@@ -7246,29 +7190,6 @@ react-transform-hmr@^1.0.3:
global "^4.3.0"
react-proxy "^1.1.7"
-react-transition-group@^1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-1.2.0.tgz#b51fc921b0c3835a7ef7c571c79fc82c73e9204f"
- dependencies:
- chain-function "^1.0.0"
- dom-helpers "^3.2.0"
- loose-envify "^1.3.1"
- prop-types "^15.5.6"
- warning "^3.0.0"
-
-react-vis-force@^0.3.1:
- version "0.3.1"
- resolved "https://registry.yarnpkg.com/react-vis-force/-/react-vis-force-0.3.1.tgz#c7bc96a4e872409f5d4c0fa93fe89c94554d47b7"
- dependencies:
- d3-force "^1.0.2"
- global "^4.3.0"
- lodash.reduce "^4.6.0"
- prop-types "^15.5.10"
-
-react-websocket@^1.1.7:
- version "1.1.7"
- resolved "https://registry.yarnpkg.com/react-websocket/-/react-websocket-1.1.7.tgz#0a761f3de354d4731f55343456e03b1f6005b492"
-
react@^15.6.1:
version "15.6.1"
resolved "https://registry.yarnpkg.com/react/-/react-15.6.1.tgz#baa8434ec6780bde997cdc380b79cd33b96393df"
@@ -8388,10 +8309,6 @@ supports-color@^4.2.1:
dependencies:
has-flag "^2.0.0"
-svg-injector@^1.1.3:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/svg-injector/-/svg-injector-1.1.3.tgz#8fba18d7419e5f818e712c4f82d83ee357610e61"
-
svg-tags@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764"
@@ -8408,10 +8325,6 @@ svgo@^0.7.0:
sax "~1.2.1"
whet.extend "~0.9.9"
-svgpath@^2.1.0:
- version "2.2.1"
- resolved "https://registry.yarnpkg.com/svgpath/-/svgpath-2.2.1.tgz#0834bb67c89a76472b2bd06cc101fa7b517b222c"
-
symbol-observable@^1.0.3:
version "1.0.4"
resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.4.tgz#29bf615d4aa7121bdd898b22d4b3f9bc4e2aa03d"
@@ -9376,10 +9289,6 @@ yauzl@2.4.1:
dependencies:
fd-slicer "~1.0.1"
-zbase32@^0.0.2:
- version "0.0.2"
- resolved "https://registry.yarnpkg.com/zbase32/-/zbase32-0.0.2.tgz#169c6f2130a6c27a84247017538b56826a54b283"
-
zip-stream@^1.1.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-1.1.1.tgz#5216b48bbb4d2651f64d5c6e6f09eb4a7399d557"