diff --git a/app/components/Channels/NetworkChannels.js b/app/components/Channels/NetworkChannels.js deleted file mode 100644 index 5689fa9d..00000000 --- a/app/components/Channels/NetworkChannels.js +++ /dev/null @@ -1,133 +0,0 @@ -import React, { Component } from 'react' -import PropTypes from 'prop-types' -import { ForceGraph, ForceGraphNode, ForceGraphLink } from 'react-vis-force' -import { FaCircle } from 'react-icons/lib/fa' -import styles from './NetworkChannels.scss' - -class NetworkChannels extends Component { - constructor(props) { - super(props) - this.state = { - ready: false - } - } - - componentWillMount() { - setTimeout(() => { - this.setState({ ready: true }) - }, 1000) - - this.props.setCurrentChannel(this.props.channels[0]) - } - - render() { - const { ready } = this.state - const { - channels, - network: { nodes, edges, selectedChannel, networkLoading }, - identity_pubkey, - setCurrentChannel - } = this.props - - if (!ready || networkLoading) { - return ( -
-

loading network graph

-
- ) - } - - return ( -
-
- - { - nodes.map(node => ( - - )) - } - { - edges.map(edge => ( - - )) - } - -
-
- -
-
- ) - } -} - -NetworkChannels.propTypes = { - channels: PropTypes.array.isRequired, - network: PropTypes.object.isRequired, - identity_pubkey: PropTypes.string.isRequired, - setCurrentChannel: PropTypes.func.isRequired -} - -export default NetworkChannels diff --git a/app/components/Channels/NetworkChannels.scss b/app/components/Channels/NetworkChannels.scss deleted file mode 100644 index 6febd4db..00000000 --- a/app/components/Channels/NetworkChannels.scss +++ /dev/null @@ -1,114 +0,0 @@ -@import '../../variables.scss'; - -@keyframes dash { - to { - stroke-dashoffset: 1000; - } -} - -.networkLoading { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100vh; - background: $black; - - h1 { - font-size: 22px; - color: $green; - font-family: 'courier'; - text-align: center; - margin-top: 25%; - } -} - -.networkchannels { - position: relative; -} - -.network, .channels { - display: inline-block; - vertical-align: top; -} - -.network { - width: 70%; -} - -.channels { - width: calc(30% - 2px); - border: 1px solid $darkestgrey; - border-radius: 5px; -} - -.node { - r: 15; - fill: $darkestgrey; - - .active { - r: 25; - fill: $green; - stroke: $green; - } -} - -.line.active { - stroke-width: 10; - opacity: 1; - stroke: $green; - stroke-dasharray: 100; - animation: dash 2.5s infinite linear; -} - -.channel { - padding: 10px; - background: rgba(0, 0, 0, 0.7); - cursor: pointer; - transition: all 0.25s; - border-bottom: 1px solid $white; - - &.active, &:hover { - background: rgba(255, 255, 255, 0.4); - } - - header { - margin-bottom: 10px; - - .active { - color: $green; - } - - .notactive { - color: $green; - } - - span svg { - font-size: 10px; - } - - i { - text-transform: uppercase; - font-size: 10px; - margin-left: 5px; - } - } - - .content { - div { - margin-bottom: 5px; - } - - h4 { - text-transform: uppercase; - margin-bottom: 5px; - font-size: 10px; - color: $main; - } - - h2 { - font-size: 14px; - color: $white; - } - } -} \ No newline at end of file diff --git a/app/components/LndSyncing/LndSyncing.js b/app/components/LndSyncing/LndSyncing.js index e38bf4fb..176a9c27 100644 --- a/app/components/LndSyncing/LndSyncing.js +++ b/app/components/LndSyncing/LndSyncing.js @@ -21,7 +21,7 @@ class LndSyncing extends Component { }, { title: 'Onion Routing', - description: 'Onion routing is a technique for anonymous communication over a computer network. In an onion network, messages are encapsulated in layers of encryption, analogous to layers of an onion.' // eslint-diabale-line + description: 'Onion routing is a technique for anonymous communication over a computer network. In an onion network, messages are encapsulated in layers of encryption, analogous to layers of an onion.' // eslint-disable-line } ], currentFact: 0 @@ -41,7 +41,7 @@ class LndSyncing extends Component {

zap

- {!fetchingBlockHeight &&

{syncPercentage}%

} + {!fetchingBlockHeight &&

{syncPercentage > 0 && `${syncPercentage}%`}

}

syncing your lightning node to the blockchain

diff --git a/app/components/Nav/Nav.js b/app/components/Nav/Nav.js index 849bb874..26f5587f 100644 --- a/app/components/Nav/Nav.js +++ b/app/components/Nav/Nav.js @@ -6,7 +6,6 @@ import Isvg from 'react-inlinesvg' import walletIcon from 'icons/wallet.svg' import peersIcon from 'icons/peers.svg' import channelsIcon from 'icons/channels.svg' -import settingsIcon from 'icons/settings.svg' import styles from './Nav.scss' diff --git a/app/components/Peers/Peers.js b/app/components/Peers/Peers.js deleted file mode 100644 index 4bff0b77..00000000 --- a/app/components/Peers/Peers.js +++ /dev/null @@ -1,86 +0,0 @@ -import React from 'react' -import PropTypes from 'prop-types' -import { TiPlus } from 'react-icons/lib/ti' -import { FaRepeat } from 'react-icons/lib/fa' -import PeerModal from './PeerModal' -import PeerForm from './PeerForm' -import Peer from './Peer' -import styles from './Peers.scss' - -const Peers = ({ - fetchPeers, - peersLoading, - peers, - setPeer, - modalPeer, - peerModalOpen, - peerForm, - setPeerForm, - connect, - disconnect -}) => { - const refreshClicked = (event) => { - // store event in icon so we dont get an error when react clears it - const icon = event.currentTarget - - // fetch peers - fetchPeers() - - // 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' - } - - return ( -
- - - -
-

Peers

- - - -
setPeerForm({ isOpen: true })} - > - -
-
-
    - { - !peersLoading ? - peers.map(peer => ) - : - 'Loading...' - } -
-
- ) -} - -Peers.propTypes = { - fetchPeers: PropTypes.func.isRequired, - peersLoading: PropTypes.bool.isRequired, - peers: PropTypes.array.isRequired, - setPeer: PropTypes.func.isRequired, - modalPeer: PropTypes.object, - peerModalOpen: PropTypes.bool.isRequired, - peerForm: PropTypes.object.isRequired, - setPeerForm: PropTypes.func.isRequired, - connect: PropTypes.func.isRequired, - disconnect: PropTypes.func.isRequired -} - -export default Peers diff --git a/app/components/Peers/Peers.scss b/app/components/Peers/Peers.scss deleted file mode 100644 index 613ce641..00000000 --- a/app/components/Peers/Peers.scss +++ /dev/null @@ -1,59 +0,0 @@ -@import '../../variables.scss'; - -.peers { - width: 75%; - margin: 50px auto; - - .header { - margin-bottom: 10px; - - h3, .connectPeer { - display: inline-block; - } - - h3 { - text-align: left; - } - - .refresh { - cursor: pointer; - margin-left: 5px; - font-size: 12px; - vertical-align: top; - color: $darkestgrey; - line-height: 14px; - transition: color 0.25s; - - &:hover { - color: $main; - } - } - - .connectPeer { - float: right; - cursor: pointer; - - svg { - padding: 3px; - border-radius: 50%; - border: 1px solid $main; - color: $main; - transition: all 0.25s; - - &:hover { - border-color: darken($main, 10%); - color: darken($main, 10%); - } - } - } - } - - h3 { - text-transform: uppercase; - color: $darkestgrey; - letter-spacing: 1.6px; - font-size: 14px; - font-weight: 400; - margin-bottom: 10px; - } -} diff --git a/app/components/Wallet/ReceiveModal.js b/app/components/Wallet/ReceiveModal.js index 30707465..761f4e36 100644 --- a/app/components/Wallet/ReceiveModal.js +++ b/app/components/Wallet/ReceiveModal.js @@ -6,7 +6,7 @@ import QRCode from 'qrcode.react' import { showNotification } from 'notifications' import styles from './ReceiveModal.scss' -const ReceiveModal = ({ isOpen, hideActivityModal, pubkey, address }) => { +const ReceiveModal = ({ isOpen, hideActivityModal, pubkey, address, newAddress }) => { const customStyles = { overlay: { cursor: 'pointer' @@ -16,7 +16,7 @@ const ReceiveModal = ({ isOpen, hideActivityModal, pubkey, address }) => { left: '20%', right: '0', bottom: 'auto', - width: '40%', + width: '60%', margin: '50px auto' } } @@ -43,8 +43,12 @@ const ReceiveModal = ({ isOpen, hideActivityModal, pubkey, address }) => {
-

Deposit Address ( copyOnClick(address)}>Copy)

+
+

Deposit Address ( copyOnClick(address)}>Copy)

+ newAddress('p2pkh')}>New Address +

{address}

+
@@ -58,7 +62,8 @@ ReceiveModal.propTypes = { isOpen: PropTypes.bool.isRequired, hideActivityModal: PropTypes.func.isRequired, pubkey: PropTypes.string.isRequired, - address: PropTypes.string.isRequired + address: PropTypes.string.isRequired, + newAddress: PropTypes.func.isRequired } export default ReceiveModal diff --git a/app/components/Wallet/ReceiveModal.scss b/app/components/Wallet/ReceiveModal.scss index 960969aa..50c32dc6 100644 --- a/app/components/Wallet/ReceiveModal.scss +++ b/app/components/Wallet/ReceiveModal.scss @@ -35,4 +35,15 @@ padding: 10px; } } -} \ No newline at end of file +} + +.addressHeader { + display: flex; + flex-direction: row; + justify-content: space-between; + + .newAddress { + text-decoration: underline; + font-size: 12px; + } +} diff --git a/app/components/Wallet/Wallet.js b/app/components/Wallet/Wallet.js index 19019995..10130a5e 100644 --- a/app/components/Wallet/Wallet.js +++ b/app/components/Wallet/Wallet.js @@ -21,7 +21,8 @@ class Wallet extends Component { const { balance, address, - info + info, + newAddress } = this.props const { modalOpen } = this.state @@ -35,6 +36,7 @@ class Wallet extends Component { hideActivityModal={() => this.setState({ modalOpen: false })} pubkey={info.data.identity_pubkey} address={address} + newAddress={newAddress} />) }
@@ -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 (
+
+
+
+

Channels

+
+
+
+
+ Create new channel +
+
+
+
-
-
- setViewType(0)}> - - - - - -
-
-
- 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"