Browse Source

feature(request): make request in both btc and usd

renovate/lint-staged-8.x
Jack Mallers 8 years ago
parent
commit
264762ad17
  1. 42
      app/reducers/form.js
  2. 2
      app/reducers/index.js
  3. 97
      app/reducers/invoice.js
  4. 45
      app/reducers/payment.js
  5. 6
      app/routes/activity/components/components/Invoices.js
  6. 10
      app/routes/activity/components/components/Payments.js
  7. 9
      app/routes/app/components/App.js
  8. 10
      app/routes/app/components/components/Form/Form.js
  9. 10
      app/routes/app/components/components/Nav.js
  10. 6
      app/routes/app/containers/AppContainer.js
  11. 7
      app/utils/btc.js
  12. 7
      app/utils/index.js
  13. 9
      app/utils/usd.js

42
app/reducers/form.js

@ -1,6 +1,10 @@
// Constants // Constants
// ------------------------------------ // ------------------------------------
export const SET_FORM = 'SET_FORM' export const SET_FORM = 'SET_FORM'
export const SET_AMOUNT = 'SET_AMOUNT'
export const SET_MESSAGE = 'SET_MESSAGE'
export const SET_PUBKEY = 'SET_PUBKEY'
export const RESET_FORM = 'RESET_FORM'
// ------------------------------------ // ------------------------------------
// Actions // Actions
@ -13,11 +17,42 @@ export function setForm({ modalOpen, formType }) {
} }
} }
export function setAmount(amount) {
return {
type: SET_AMOUNT,
amount
}
}
export function setMessage(message) {
return {
type: SET_MESSAGE,
message
}
}
export function setPubkey(pubkey) {
return {
type: SET_PUBKEY,
pubkey
}
}
export function resetForm() {
return {
type: RESET_FORM
}
}
// ------------------------------------ // ------------------------------------
// Action Handlers // Action Handlers
// ------------------------------------ // ------------------------------------
const ACTION_HANDLERS = { const ACTION_HANDLERS = {
[SET_FORM]: (state, { modalOpen, formType }) => ({ ...state, modalOpen, formType }) [SET_FORM]: (state, { modalOpen, formType }) => ({ ...state, modalOpen, formType }),
[SET_AMOUNT]: (state, { amount }) => ({ ...state, amount }),
[SET_MESSAGE]: (state, { message }) => ({ ...state, message }),
[SET_PUBKEY]: (state, { pubkey }) => ({ ...state, pubkey }),
[RESET_FORM]: () => (initialState)
} }
// ------------------------------------ // ------------------------------------
@ -25,7 +60,10 @@ const ACTION_HANDLERS = {
// ------------------------------------ // ------------------------------------
const initialState = { const initialState = {
modalOpen: false, modalOpen: false,
formType: 'pay' formType: 'pay',
amount: '0',
message: '',
pubkey: ''
} }
export default function formReducer(state = initialState, action) { export default function formReducer(state = initialState, action) {

2
app/reducers/index.js

@ -7,6 +7,7 @@ import balance from './balance'
import payment from './payment' import payment from './payment'
import peers from './peers' import peers from './peers'
import form from './form' import form from './form'
import invoice from './invoice'
import activity from './activity' import activity from './activity'
const rootReducer = combineReducers({ const rootReducer = combineReducers({
@ -17,6 +18,7 @@ const rootReducer = combineReducers({
payment, payment,
peers, peers,
form, form,
invoice,
activity activity
}) })

97
app/reducers/invoice.js

@ -0,0 +1,97 @@
import { callApi } from '../api'
import { btc, usd } from '../utils'
// ------------------------------------
// Constants
// ------------------------------------
export const GET_INVOICE = 'GET_INVOICE'
export const RECEIVE_INVOICE = 'RECEIVE_INVOICE'
export const SEND_INVOICE = 'SEND_INVOICE'
export const INVOICE_SUCCESSFUL = 'INVOICE_SUCCESSFUL'
export const INVOICE_FAILED = 'INVOICE_FAILED'
// ------------------------------------
// Actions
// ------------------------------------
export function getInvoice() {
return {
type: GET_INVOICE
}
}
export function receiveInvoice(data) {
return {
type: RECEIVE_INVOICE,
data
}
}
export function sendInvoice() {
return {
type: SEND_INVOICE
}
}
export function invoiceSuccessful(data) {
return {
type: INVOICE_SUCCESSFUL,
data
}
}
export function invoiceFailed() {
return {
type: SEND_PAYMENT
}
}
export const fetchInvoice = (r_hash) => async (dispatch) => {
dispatch(getInvoice())
const invoice = await callApi(`invoice/${r_hash}`, 'get')
invoice ?
dispatch(receiveInvoice(invoice.data))
:
dispatch(invoiceFailed())
return invoice
}
export const createInvoice = (amount, memo, currency, rate) => async (dispatch) => {
const value = currency === 'btc' ? btc.btcToSatoshis(amount) : btc.btcToSatoshis(usd.usdToBtc(amount, rate))
dispatch(sendInvoice())
const invoice = await callApi('addinvoice', 'post', { value, memo })
console.log('invoice: ', invoice.data)
if (invoice) {
dispatch(invoiceSuccessful(invoice.data))
} else {
dispatch(invoiceFailed())
}
return invoice
}
// ------------------------------------
// Action Handlers
// ------------------------------------
const ACTION_HANDLERS = {
[GET_INVOICE]: (state) => ({ ...state, loading: true }),
[RECEIVE_INVOICE]: (state, { data }) => ({ ...state, loading: false, data }),
[SEND_INVOICE]: (state) => ({ ...state, loading: true }),
[INVOICE_SUCCESSFUL]: (state, { data }) => ({ ...state, loading: false, data }),
[INVOICE_FAILED]: (state) => ({ ...state, loading: false, data: null })
}
// ------------------------------------
// Reducer
// ------------------------------------
const initialState = {
loading: false,
data: {}
}
export default function invoiceReducer(state = initialState, action) {
const handler = ACTION_HANDLERS[action.type]
return handler ? handler(state, action) : state
}

45
app/reducers/payment.js

@ -1,54 +1,59 @@
import { callApi } from '../api' import { callApi } from '../api'
import { btcToSatoshis, btcToUsd } from '../utils/bitcoin' import { btc } from '../utils'
// ------------------------------------ // ------------------------------------
// Constants // Constants
// ------------------------------------ // ------------------------------------
export const SET_AMOUNT = 'SET_AMOUNT' export const SEND_PAYMENT = 'SEND_PAYMENT'
export const SET_MESSAGE = 'SET_MESSAGE' export const PAYMENT_SUCCESSFULL = 'PAYMENT_SUCCESSFULL'
export const SET_PUBKEY = 'SET_PUBKEY' export const PAYMENT_FAILED = 'PAYMENT_FAILED'
// ------------------------------------ // ------------------------------------
// Actions // Actions
// ------------------------------------ // ------------------------------------
export function setAmount(amount) { export function sendPayment() {
return { return {
type: SET_AMOUNT, type: SEND_PAYMENT
amount
} }
} }
export function setMessage(message) { export function paymentSuccessfull(data) {
return { return {
type: SET_MESSAGE, type: PAYMENT_SUCCESSFULL,
message data
} }
} }
export function setPubkey(pubkey) { export function paymentFailed() {
return { return {
type: SET_PUBKEY, type: PAYMENT_FAILED
pubkey
} }
} }
export const makePayment = (dest_string, btc_amount) => async (dispatch) => {
const amt = btc.btcToSatoshis(btc_amount)
dispatch(sendPayment())
const payment = await callApi('payments', 'post', { dest_string, amt })
payment ?
dispatch(paymentSuccessfull(payment))
:
dispatch(paymentFailed())
return payment
}
// ------------------------------------ // ------------------------------------
// Action Handlers // Action Handlers
// ------------------------------------ // ------------------------------------
const ACTION_HANDLERS = { const ACTION_HANDLERS = {
[SET_AMOUNT]: (state, { amount }) => ({ ...state, amount }),
[SET_MESSAGE]: (state, { message }) => ({ ...state, message }),
[SET_PUBKEY]: (state, { pubkey }) => ({ ...state, pubkey })
} }
// ------------------------------------ // ------------------------------------
// Reducer // Reducer
// ------------------------------------ // ------------------------------------
const initialState = { const initialState = {
paymentLoading: false, paymentLoading: false
amount: '0',
message: '',
pubkey: ''
} }
export default function paymentReducer(state = initialState, action) { export default function paymentReducer(state = initialState, action) {

6
app/routes/activity/components/components/Invoices.js

@ -2,7 +2,7 @@
import React, { Component } from 'react' import React, { Component } from 'react'
import Moment from 'react-moment' import Moment from 'react-moment'
import 'moment-timezone' import 'moment-timezone'
import { satoshisToBtc, satoshisToUsd } from '../../../../utils/bitcoin' import { btc } from '../../../../utils'
import styles from './Invoices.scss' import styles from './Invoices.scss'
class Invoices extends Component { class Invoices extends Component {
@ -34,9 +34,9 @@ class Invoices extends Component {
<div className={invoice.settled ? styles.settled : null}> <div className={invoice.settled ? styles.settled : null}>
{ {
ticker.currency === 'btc' ? ticker.currency === 'btc' ?
satoshisToBtc(invoice.value) btc.satoshisToBtc(invoice.value)
: :
satoshisToUsd(invoice.value, ticker.btcTicker.price_usd) btc.satoshisToUsd(invoice.value, ticker.btcTicker.price_usd)
} }
</div> </div>
</div> </div>

10
app/routes/activity/components/components/Payments.js

@ -2,7 +2,7 @@
import React, { Component } from 'react' import React, { Component } from 'react'
import Moment from 'react-moment' import Moment from 'react-moment'
import 'moment-timezone' import 'moment-timezone'
import { satoshisToBtc, satoshisToUsd } from '../../../../utils/bitcoin' import { btc } from '../../../../utils'
import styles from './Payments.scss' import styles from './Payments.scss'
class Payments extends Component { class Payments extends Component {
@ -39,9 +39,9 @@ class Payments extends Component {
<span className={styles.fee}> <span className={styles.fee}>
{ {
ticker.currency === 'btc' ? ticker.currency === 'btc' ?
satoshisToBtc(payment.fee) btc.satoshisToBtc(payment.fee)
: :
satoshisToUsd(payment.fee, ticker.btcTicker.price_usd) btc.satoshisToUsd(payment.fee, ticker.btcTicker.price_usd)
} }
</span> </span>
</div> </div>
@ -49,9 +49,9 @@ class Payments extends Component {
<span className={styles.value}> <span className={styles.value}>
{ {
ticker.currency === 'btc' ? ticker.currency === 'btc' ?
satoshisToBtc(payment.value) btc.satoshisToBtc(payment.value)
: :
satoshisToUsd(payment.value, ticker.btcTicker.price_usd) btc.satoshisToUsd(payment.value, ticker.btcTicker.price_usd)
} }
</span> </span>
</div> </div>

9
app/routes/app/components/App.js

@ -5,13 +5,6 @@ import Nav from './components/Nav.js'
import styles from './App.scss' import styles from './App.scss'
class App extends Component { class App extends Component {
constructor(props, context) {
super(props, context)
this.state = {
form: false
}
}
componentWillMount() { componentWillMount() {
const { fetchTicker, fetchBalance } = this.props const { fetchTicker, fetchBalance } = this.props
@ -32,6 +25,7 @@ class App extends Component {
fetchPeers, fetchPeers,
setCurrency, setCurrency,
setForm, setForm,
createInvoice,
children children
} = this.props } = this.props
@ -48,6 +42,7 @@ class App extends Component {
peers={peers} peers={peers}
ticker={ticker} ticker={ticker}
form={form} form={form}
createInvoice={createInvoice}
/> />
<Nav <Nav
ticker={ticker} ticker={ticker}

10
app/routes/app/components/components/Form/Form.js

@ -11,15 +11,15 @@ class Form extends Component {
render() { render() {
const { const {
form: { formType }, form: { formType, amount, message, pubkey },
setAmount, setAmount,
setMessage, setMessage,
setPubkey, setPubkey,
payment: { amount, message, pubkey },
peers: { peers }, peers: { peers },
ticker: { currency }, ticker: { currency, btcTicker },
isOpen, isOpen,
close close,
createInvoice
} = this.props } = this.props
return ( return (
@ -102,7 +102,7 @@ class Form extends Component {
</section> </section>
: :
<section className={styles.buttonGroup}> <section className={styles.buttonGroup}>
<div className={styles.button}>Request</div> <div className={styles.button} onClick={() => createInvoice(amount, message, currency, btcTicker.price_usd)}>Request</div>
</section> </section>
} }
</div> </div>

10
app/routes/app/components/components/Nav.js

@ -4,7 +4,7 @@ import { Link } from 'react-router-dom'
import ReactSVG from 'react-svg' import ReactSVG from 'react-svg'
import { MdAccountBalanceWallet, MdSettings } from 'react-icons/lib/md' import { MdAccountBalanceWallet, MdSettings } from 'react-icons/lib/md'
import { FaClockO, FaBitcoin, FaDollar } from 'react-icons/lib/fa' import { FaClockO, FaBitcoin, FaDollar } from 'react-icons/lib/fa'
import { satoshisToBtc, satoshisToUsd } from '../../../../utils/bitcoin' import { btc } from '../../../../utils'
import styles from './Nav.scss' import styles from './Nav.scss'
class Nav extends Component { class Nav extends Component {
@ -38,9 +38,9 @@ class Nav extends Component {
<span> <span>
{ {
ticker.currency === 'btc' ? ticker.currency === 'btc' ?
satoshisToBtc(balance.walletBalance) btc.satoshisToBtc(balance.walletBalance)
: :
satoshisToUsd(balance.walletBalance, ticker.btcTicker.price_usd) btc.satoshisToUsd(balance.walletBalance, ticker.btcTicker.price_usd)
} }
</span> </span>
</p> </p>
@ -51,9 +51,9 @@ class Nav extends Component {
<span> <span>
{ {
ticker.currency === 'btc' ? ticker.currency === 'btc' ?
satoshisToBtc(balance.channelBalance) btc.satoshisToBtc(balance.channelBalance)
: :
satoshisToUsd(balance.channelBalance, ticker.btcTicker.price_usd) btc.satoshisToUsd(balance.channelBalance, ticker.btcTicker.price_usd)
} }
</span> </span>
</p> </p>

6
app/routes/app/containers/AppContainer.js

@ -5,7 +5,8 @@ import { fetchBalance } from '../../../reducers/balance'
import { fetchInfo } from '../../../reducers/info' import { fetchInfo } from '../../../reducers/info'
import { fetchPeers } from '../../../reducers/peers' import { fetchPeers } from '../../../reducers/peers'
import { setForm } from '../../../reducers/form' import { setForm } from '../../../reducers/form'
import { setAmount, setMessage, setPubkey } from '../../../reducers/payment' import { createInvoice } from '../../../reducers/invoice'
import { setAmount, setMessage, setPubkey } from '../../../reducers/form'
const mapDispatchToProps = { const mapDispatchToProps = {
fetchTicker, fetchTicker,
@ -16,7 +17,8 @@ const mapDispatchToProps = {
setAmount, setAmount,
setMessage, setMessage,
setPubkey, setPubkey,
setForm setForm,
createInvoice
} }
const mapStateToProps = (state) => ({ const mapStateToProps = (state) => ({

7
app/utils/bitcoin.js → app/utils/btc.js

@ -21,3 +21,10 @@ export function satoshisToUsd(satoshis, price) {
export function btcToUsd(btc, price) { export function btcToUsd(btc, price) {
return parseFloat((btc * price).toFixed(2)).toLocaleString('en') return parseFloat((btc * price).toFixed(2)).toLocaleString('en')
} }
export default {
btcToSatoshis,
satoshisToBtc,
satoshisToUsd,
btcToUsd
}

7
app/utils/index.js

@ -0,0 +1,7 @@
import btc from './btc'
import usd from './usd'
export default {
btc,
usd
}

9
app/utils/usd.js

@ -0,0 +1,9 @@
export function usdToBtc(usd, rate) {
if (usd == undefined || usd === '') return
return (usd / rate).toFixed(8)
}
export default {
usdToBtc
}
Loading…
Cancel
Save