diff --git a/app/reducers/channels.js b/app/reducers/channels.js index a8a5d1d2..fd808432 100644 --- a/app/reducers/channels.js +++ b/app/reducers/channels.js @@ -1,4 +1,5 @@ import { createSelector } from 'reselect' +import { usd, btc } from '../utils' import { callApi, callApis } from '../api' // ------------------------------------ // Constants @@ -65,19 +66,33 @@ export function openingChannel() { } } +export function openingSuccessful() { + return { + type: OPENING_SUCCESSFUL + } +} + +export function openingFailure() { + return { + type: OPENING_FAILURE + } +} + export const fetchChannels = () => async (dispatch) => { dispatch(getChannels()) const channels = await callApis(['channels', 'pending_channels']) dispatch(receiveChannels(channels)) } -export const openChannel = () => async (dispatch) => { - const payload = {} - console.log('payload: ', payload) - return +export const openChannel = ({ pubkey, localamt, pushamt }) => async (dispatch) => { + const payload = { pubkey, localamt, pushamt } dispatch(openingChannel()) - // const channel = await callApi('addchannel', 'post', payload) - // dispatch(openingSuccessful(channel)) + const channel = await callApi('addchannel', 'post', payload) + console.log('channel: ', channel) + + channel.data ? dispatch(openingSuccessful()) : dispatch(openingFailure()) + + return channel } // ------------------------------------ diff --git a/app/routes/activity/components/Activity.js b/app/routes/activity/components/Activity.js index 56c71b96..38c025e5 100644 --- a/app/routes/activity/components/Activity.js +++ b/app/routes/activity/components/Activity.js @@ -67,32 +67,26 @@ class Activity extends Component {
- - { - tab === 1 ? - - : - - } - + { + tab === 1 ? + + : + + }
diff --git a/app/routes/app/components/App.js b/app/routes/app/components/App.js index eb7238ce..8fe4b10a 100644 --- a/app/routes/app/components/App.js +++ b/app/routes/app/components/App.js @@ -1,10 +1,15 @@ // @flow import React, { Component } from 'react' -import Websocket from 'react-websocket' import Form from './components/Form' import Nav from './components/Nav.js' +import Socket from './components/Socket.js' import styles from './App.scss' +export const CHANNEL_DATA = 'CHANNEL_DATA' +export const CHANNEL_END = 'CHANNEL_END' +export const CHANNEL_ERROR = 'CHANNEL_ERROR' +export const CHANNEL_STATUS = 'CHANNEL_STATUS' + class App extends Component { componentWillMount() { const { fetchTicker, fetchBalance } = this.props @@ -28,9 +33,10 @@ class App extends Component { setForm, createInvoice, payInvoice, + fetchChannels, children } = this.props - + return (
- console.log('data: ', data)} - /> +
) } diff --git a/app/routes/app/components/components/Socket.js b/app/routes/app/components/components/Socket.js new file mode 100644 index 00000000..3b949ea7 --- /dev/null +++ b/app/routes/app/components/components/Socket.js @@ -0,0 +1,26 @@ +// @flow +import React, { Component } from 'react' +import Websocket from 'react-websocket' + +class Socket extends Component { + render() { + const onMessage = ({ event, data }) => { + console.log('data: ', data) + this.props.fetchChannels() + // switch(data.event) { + // case CHANNEL_DATA: + // console.log('channel data') + // if (data.update === 'chan_pending') { + // let zapNotification = new Notification({ + + // }) + // } + // } + } + return ( + + ) + } +} + +export default Socket \ No newline at end of file diff --git a/app/routes/app/containers/AppContainer.js b/app/routes/app/containers/AppContainer.js index c43b2d9f..f93ecb8e 100644 --- a/app/routes/app/containers/AppContainer.js +++ b/app/routes/app/containers/AppContainer.js @@ -6,6 +6,7 @@ import { fetchInfo } from '../../../reducers/info' import { setForm } from '../../../reducers/form' import { createInvoice } from '../../../reducers/invoice' import { payInvoice } from '../../../reducers/payment' +import { fetchChannels } from '../../../reducers/channels' import { setAmount, setMessage, setPubkey, setPaymentRequest } from '../../../reducers/form' const mapDispatchToProps = { @@ -19,7 +20,8 @@ const mapDispatchToProps = { setPaymentRequest, setForm, createInvoice, - payInvoice + payInvoice, + fetchChannels } const mapStateToProps = (state) => ({ diff --git a/app/routes/wallet/components/components/Channels/Channels.js b/app/routes/wallet/components/components/Channels/Channels.js index 029b09c4..9a052440 100644 --- a/app/routes/wallet/components/components/Channels/Channels.js +++ b/app/routes/wallet/components/components/Channels/Channels.js @@ -24,8 +24,7 @@ class Channels extends Component { allChannels, openChannel } = this.props - console.log('allChannels: ', allChannels) - console.log('openChannel: ', openChannel) + return (
@@ -46,11 +45,11 @@ class Channels extends Component { allChannels.map((channel, index) => { if (channel.hasOwnProperty('blocks_till_open')) { return ( - + ) } else if (channel.hasOwnProperty('closing_txid')) { return ( - + ) } else { return ( diff --git a/app/routes/wallet/components/components/Channels/components/Channel/Channel.js b/app/routes/wallet/components/components/Channels/components/Channel/Channel.js index 434db7cd..8c2fc491 100644 --- a/app/routes/wallet/components/components/Channels/components/Channel/Channel.js +++ b/app/routes/wallet/components/components/Channels/components/Channel/Channel.js @@ -8,6 +8,7 @@ class Channel extends Component { const { ticker, channel, setChannel } = this.props return (
  • setChannel(channel)}> +

    Status: Open

    Remote Pubkey diff --git a/app/routes/wallet/components/components/Channels/components/Channel/Channel.scss b/app/routes/wallet/components/components/Channels/components/Channel/Channel.scss index 02f55843..16916855 100644 --- a/app/routes/wallet/components/components/Channels/components/Channel/Channel.scss +++ b/app/routes/wallet/components/components/Channels/components/Channel/Channel.scss @@ -19,9 +19,21 @@ border: none; } + .status { + color: $main; + position: absolute; + top: 0; + left: 10px; + padding: 10px; + text-transform: uppercase; + font-weight: bold; + font-size: 10px; + } + .left, .right { padding: 0 10px; margin-bottom: 5; + margin-top: 25px; section { margin-bottom: 20px; diff --git a/app/routes/wallet/components/components/Channels/components/ChannelForm/ChannelForm.js b/app/routes/wallet/components/components/Channels/components/ChannelForm/ChannelForm.js index 26a22370..983252df 100644 --- a/app/routes/wallet/components/components/Channels/components/ChannelForm/ChannelForm.js +++ b/app/routes/wallet/components/components/Channels/components/ChannelForm/ChannelForm.js @@ -2,10 +2,22 @@ import React, { Component } from 'react' import ReactModal from 'react-modal' import { FaUser, FaBitcoin, FaDollar } from 'react-icons/lib/fa' +import { usd, btc } from '../../../../../../../utils' import styles from './ChannelForm.scss' class ChannelForm extends Component { render() { + const submitClicked = () => { + const { form: { node_key, local_amt, push_amt }, openChannel, ticker } = this.props + console.log('ticker: ', ticker) + const localamt = ticker.currency === 'btc' ? btc.btcToSatoshis(local_amt) : btc.btcToSatoshis(usd.usdToBtc(local_amt, ticker.btcTicker.price_usd)) + const pushamt = ticker.currency === 'btc' ? btc.btcToSatoshis(push_amt) : btc.btcToSatoshis(usd.usdToBtc(push_amt, ticker.btcTicker.price_usd)) + + openChannel({ pubkey: node_key, localamt, pushamt }).then(channel => { + if (channel.data) { setForm({ isOpen: false }) } + }) + } + const customStyles = { overlay: { cursor: 'pointer', @@ -99,7 +111,7 @@ class ChannelForm extends Component {
    -
    +
    Submit
    diff --git a/app/routes/wallet/components/components/Channels/components/ClosedPendingChannel/ClosedPendingChannel.js b/app/routes/wallet/components/components/Channels/components/ClosedPendingChannel/ClosedPendingChannel.js index 560b4df5..7f4bd4e4 100644 --- a/app/routes/wallet/components/components/Channels/components/ClosedPendingChannel/ClosedPendingChannel.js +++ b/app/routes/wallet/components/components/Channels/components/ClosedPendingChannel/ClosedPendingChannel.js @@ -1,15 +1,63 @@ // @flow +import { shell } from 'electron' import React, { Component } from 'react' import { btc } from '../../../../../../../utils' import styles from './ClosedPendingChannel.scss' class ClosedPendingChannel extends Component { render() { - const { ticker, channel, setChannel } = this.props + const { ticker, channel: { channel, closing_txid }, setChannel } = this.props return ( -
  • - ClosedPendingChannel -
  • +
  • shell.openExternal(`https://testnet.smartbit.com.au/tx/${closing_txid}`)}> +

    Status: Closing

    +
    +
    + Remote Pubkey +

    {channel.remote_node_pub}

    +
    +
    + Channel Point +

    {channel.channel_point}

    +
    +
    +
    +
    + Capacity +

    + { + ticker.currency === 'btc' ? + btc.satoshisToBtc(channel.capacity) + : + btc.satoshisToUsd(channel.capacity, ticker.btcTicker.price_usd) + } +

    +
    +
    +
    +

    + { + ticker.currency === 'btc' ? + btc.satoshisToBtc(channel.local_balance) + : + btc.satoshisToUsd(channel.local_balance, ticker.btcTicker.price_usd) + } +

    + Local +
    +
    +

    + { + ticker.currency === 'btc' ? + btc.satoshisToBtc(channel.remote_balance) + : + btc.satoshisToUsd(channel.remote_balance, ticker.btcTicker.price_usd) + } +

    + Remote +
    +
    +
    +
  • ) } } diff --git a/app/routes/wallet/components/components/Channels/components/ClosedPendingChannel/ClosedPendingChannel.scss b/app/routes/wallet/components/components/Channels/components/ClosedPendingChannel/ClosedPendingChannel.scss index e69de29b..4d229df3 100644 --- a/app/routes/wallet/components/components/Channels/components/ClosedPendingChannel/ClosedPendingChannel.scss +++ b/app/routes/wallet/components/components/Channels/components/ClosedPendingChannel/ClosedPendingChannel.scss @@ -0,0 +1,95 @@ +@import '../../../../../../../variables.scss'; + +.channel { + position: relative; + background: $white; + padding: 10px; + display: flex; + flex-direction: row; + justify-content: space-between; + border-top: 1px solid $grey; + cursor: pointer; + transition: all 0.25s; + opacity: 0.5; + + &:hover { + opacity: 0.35; + } + + &:first-child { + border: none; + } + + .closing { + color: $red; + position: absolute; + top: 0; + left: 10px; + padding: 10px; + text-transform: uppercase; + font-weight: bold; + font-size: 10px; + } + + .left, .right { + padding: 0 10px; + margin-bottom: 5; + margin-top: 25px; + + section { + margin-bottom: 20px; + + span { + text-transform: uppercase; + letter-spacing: 1.6px; + color: $black; + font-size: 10px; + font-weight: bold; + } + + h2 { + font-size: 30px; + padding: 5px 0; + color: $main; + } + + h4 { + margin-top: 5px; + } + } + } + + .left { + flex: 7; + border-right: 1px solid $grey; + } + + .right { + flex: 3; + + .capacity { + text-align: center; + border-bottom: 1px solid $grey; + margin-bottom: 10px; + } + + .balances { + display: flex; + justify-content: space-between; + + section { + flex: 5; + text-align: center; + + h4 { + color: $main; + font-size: 16px; + } + + &:first-child { + border-right: 1px solid $grey; + } + } + } + } +} diff --git a/app/routes/wallet/components/components/Channels/components/OpenPendingChannel/OpenPendingChannel.js b/app/routes/wallet/components/components/Channels/components/OpenPendingChannel/OpenPendingChannel.js index 500edec5..8daff543 100644 --- a/app/routes/wallet/components/components/Channels/components/OpenPendingChannel/OpenPendingChannel.js +++ b/app/routes/wallet/components/components/Channels/components/OpenPendingChannel/OpenPendingChannel.js @@ -5,10 +5,57 @@ import styles from './OpenPendingChannel.scss' class OpenPendingChannel extends Component { render() { - const { ticker, channel, setChannel } = this.props + const { ticker, channel: { channel } } = this.props return (
  • - OpenPendingChannel +

    Status: Pending

    +
    +
    + Remote Pubkey +

    {channel.remote_node_pub}

    +
    +
    + Channel Point +

    {channel.channel_point}

    +
    +
    +
    +
    + Capacity +

    + { + ticker.currency === 'btc' ? + btc.satoshisToBtc(channel.capacity) + : + btc.satoshisToUsd(channel.capacity, ticker.btcTicker.price_usd) + } +

    +
    +
    +
    +

    + { + ticker.currency === 'btc' ? + btc.satoshisToBtc(channel.local_balance) + : + btc.satoshisToUsd(channel.local_balance, ticker.btcTicker.price_usd) + } +

    + Local +
    +
    +

    + { + ticker.currency === 'btc' ? + btc.satoshisToBtc(channel.remote_balance) + : + btc.satoshisToUsd(channel.remote_balance, ticker.btcTicker.price_usd) + } +

    + Remote +
    +
    +
  • ) } diff --git a/app/routes/wallet/components/components/Channels/components/OpenPendingChannel/OpenPendingChannel.scss b/app/routes/wallet/components/components/Channels/components/OpenPendingChannel/OpenPendingChannel.scss index e69de29b..a43ce844 100644 --- a/app/routes/wallet/components/components/Channels/components/OpenPendingChannel/OpenPendingChannel.scss +++ b/app/routes/wallet/components/components/Channels/components/OpenPendingChannel/OpenPendingChannel.scss @@ -0,0 +1,91 @@ +@import '../../../../../../../variables.scss'; + +.channel { + position: relative; + background: $white; + padding: 10px; + display: flex; + flex-direction: row; + justify-content: space-between; + border-top: 1px solid $grey; + cursor: pointer; + transition: all 0.25s; + opacity: 0.5; + + .pending { + color: $green; + position: absolute; + top: 0; + left: 10px; + padding: 10px; + text-transform: uppercase; + font-weight: bold; + font-size: 10px; + } + + &:first-child { + border: none; + } + + .left, .right { + padding: 0 10px; + margin-bottom: 5; + margin-top: 25px; + + section { + margin-bottom: 20px; + + span { + text-transform: uppercase; + letter-spacing: 1.6px; + color: $black; + font-size: 10px; + font-weight: bold; + } + + h2 { + font-size: 30px; + padding: 5px 0; + color: $main; + } + + h4 { + margin-top: 5px; + } + } + } + + .left { + flex: 7; + border-right: 1px solid $grey; + } + + .right { + flex: 3; + + .capacity { + text-align: center; + border-bottom: 1px solid $grey; + margin-bottom: 10px; + } + + .balances { + display: flex; + justify-content: space-between; + + section { + flex: 5; + text-align: center; + + h4 { + color: $main; + font-size: 16px; + } + + &:first-child { + border-right: 1px solid $grey; + } + } + } + } +} diff --git a/app/routes/wallet/components/components/Peers/Peers.js b/app/routes/wallet/components/components/Peers/Peers.js index da1b5dab..11ffc99e 100644 --- a/app/routes/wallet/components/components/Peers/Peers.js +++ b/app/routes/wallet/components/components/Peers/Peers.js @@ -37,7 +37,7 @@ class Peers extends Component {
      { - !peersLoading && peers.length ? + !peersLoading ? peers.map(peer => ) : 'Loading...' diff --git a/app/routes/wallet/components/components/Peers/components/PeerForm/PeerForm.js b/app/routes/wallet/components/components/Peers/components/PeerForm/PeerForm.js index 5befb8f2..94ebe3d5 100644 --- a/app/routes/wallet/components/components/Peers/components/PeerForm/PeerForm.js +++ b/app/routes/wallet/components/components/Peers/components/PeerForm/PeerForm.js @@ -4,17 +4,10 @@ import ReactModal from 'react-modal' import styles from './PeerForm.scss' class PeerForm extends Component { - constructor(props, context) { - super(props, context) - this.state = { - pubkey: '02ef6248210e27b0f0df4d11d876e63f56e04bcb0054d0d8b6ba6a1a3e90dc56e1', - host: 'lnd-testnet-2.mably.com' - } - } - render() { const submit = () => { - const { pubkey, host } = this.state + const { form: { pubkey, host } } = this.props + this.props.connect({ pubkey, host }).then(success => { if (success.data) { setForm({ isOpen: false }) } }) @@ -37,7 +30,6 @@ class PeerForm extends Component { } const { form, setForm, connect } = this.props - const { pubkey, host } = this.state return (