JimmyMow
6 years ago
committed by
GitHub
103 changed files with 430 additions and 362 deletions
@ -1,4 +1,4 @@ |
|||||
@import '../../styles/variables.scss'; |
@import '../../../styles/variables.scss'; |
||||
|
|
||||
.container { |
.container { |
||||
position: relative; |
position: relative; |
@ -0,0 +1,3 @@ |
|||||
|
import ActivityModal from './ActivityModal' |
||||
|
|
||||
|
export default ActivityModal |
@ -1,4 +1,4 @@ |
|||||
@import '../../styles/variables.scss'; |
@import '../../../styles/variables.scss'; |
||||
|
|
||||
.container { |
.container { |
||||
display: block; |
display: block; |
@ -0,0 +1,3 @@ |
|||||
|
import Countdown from './Countdown' |
||||
|
|
||||
|
export default Countdown |
@ -1,4 +1,4 @@ |
|||||
@import '../../styles/variables.scss'; |
@import '../../../styles/variables.scss'; |
||||
|
|
||||
.container { |
.container { |
||||
color: $white; |
color: $white; |
@ -0,0 +1,3 @@ |
|||||
|
import InvoiceModal from './InvoiceModal' |
||||
|
|
||||
|
export default InvoiceModal |
@ -1,4 +1,4 @@ |
|||||
@import '../../styles/variables.scss'; |
@import '../../../styles/variables.scss'; |
||||
|
|
||||
.container { |
.container { |
||||
color: $white; |
color: $white; |
@ -0,0 +1,3 @@ |
|||||
|
import PaymentModal from './PaymentModal' |
||||
|
|
||||
|
export default PaymentModal |
@ -1,4 +1,4 @@ |
|||||
@import '../../styles/variables.scss'; |
@import '../../../styles/variables.scss'; |
||||
|
|
||||
.container { |
.container { |
||||
color: $white; |
color: $white; |
@ -0,0 +1,3 @@ |
|||||
|
import TransactionModal from './TransactionModal' |
||||
|
|
||||
|
export default TransactionModal |
@ -1,171 +0,0 @@ |
|||||
import React, { Component } from 'react' |
|
||||
import PropTypes from 'prop-types' |
|
||||
import Isvg from 'react-inlinesvg' |
|
||||
|
|
||||
import x from 'icons/x.svg' |
|
||||
|
|
||||
import styles from './AddChannel.scss' |
|
||||
|
|
||||
class AddChannel extends Component { |
|
||||
constructor(props) { |
|
||||
super(props) |
|
||||
this.searchInput = React.createRef() |
|
||||
} |
|
||||
|
|
||||
componentDidMount() { |
|
||||
// Focus the search input field.
|
|
||||
this.searchInput.current.focus() |
|
||||
} |
|
||||
|
|
||||
render() { |
|
||||
const { |
|
||||
contactsform, |
|
||||
closeContactsForm, |
|
||||
openSubmitChannelForm, |
|
||||
updateContactFormSearchQuery, |
|
||||
updateManualFormSearchQuery, |
|
||||
setNode, |
|
||||
activeChannelPubkeys, |
|
||||
nonActiveChannelPubkeys, |
|
||||
pendingOpenChannelPubkeys, |
|
||||
filteredNetworkNodes, |
|
||||
loadingChannelPubkeys, |
|
||||
showManualForm, |
|
||||
openManualForm |
|
||||
} = this.props |
|
||||
const renderRightSide = node => { |
|
||||
if (loadingChannelPubkeys.includes(node.pub_key)) { |
|
||||
return ( |
|
||||
<span className={styles.inactive}> |
|
||||
<div className={styles.loading}> |
|
||||
<div className={styles.spinner} /> |
|
||||
</div> |
|
||||
</span> |
|
||||
) |
|
||||
} |
|
||||
|
|
||||
if (activeChannelPubkeys.includes(node.pub_key)) { |
|
||||
return ( |
|
||||
<span className={`${styles.online} ${styles.inactive}`}> |
|
||||
<span>Online</span> |
|
||||
</span> |
|
||||
) |
|
||||
} |
|
||||
|
|
||||
if (nonActiveChannelPubkeys.includes(node.pub_key)) { |
|
||||
return ( |
|
||||
<span className={`${styles.offline} ${styles.inactive}`}> |
|
||||
<span>Offline</span> |
|
||||
</span> |
|
||||
) |
|
||||
} |
|
||||
|
|
||||
if (pendingOpenChannelPubkeys.includes(node.pub_key)) { |
|
||||
return ( |
|
||||
<span className={`${styles.pending} ${styles.inactive}`}> |
|
||||
<span>Pending</span> |
|
||||
</span> |
|
||||
) |
|
||||
} |
|
||||
|
|
||||
if (!node.addresses.length) { |
|
||||
return <span className={`${styles.private} ${styles.inactive}`}>Private</span> |
|
||||
} |
|
||||
|
|
||||
return ( |
|
||||
<span |
|
||||
className={styles.connect} |
|
||||
onClick={() => { |
|
||||
// set the node public key for the submit form
|
|
||||
setNode(node) |
|
||||
// open the submit form
|
|
||||
openSubmitChannelForm() |
|
||||
}} |
|
||||
> |
|
||||
Connect |
|
||||
</span> |
|
||||
) |
|
||||
} |
|
||||
|
|
||||
const searchUpdated = search => { |
|
||||
updateContactFormSearchQuery(search) |
|
||||
|
|
||||
if (search.includes('@') && search.split('@')[0].length === 66) { |
|
||||
updateManualFormSearchQuery(search) |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
return ( |
|
||||
<div className={styles.container}> |
|
||||
<header className={styles.header}> |
|
||||
<input |
|
||||
type="text" |
|
||||
placeholder="Search the network..." |
|
||||
className={styles.searchInput} |
|
||||
value={contactsform.searchQuery} |
|
||||
onChange={event => searchUpdated(event.target.value)} |
|
||||
ref={this.searchInput} |
|
||||
/> |
|
||||
<span onClick={closeContactsForm} className={styles.closeIcon}> |
|
||||
<Isvg src={x} /> |
|
||||
</span> |
|
||||
</header> |
|
||||
|
|
||||
<section className={styles.nodes}> |
|
||||
<ul className={styles.networkResults}> |
|
||||
{filteredNetworkNodes.map(node => ( |
|
||||
<li key={node.pub_key}> |
|
||||
<section> |
|
||||
{node.alias.length > 0 ? ( |
|
||||
<h2> |
|
||||
<span>{node.alias.trim()}</span> |
|
||||
<span> |
|
||||
({node.pub_key.substr(0, 10)} |
|
||||
... |
|
||||
{node.pub_key.substr(node.pub_key.length - 10)}) |
|
||||
</span> |
|
||||
</h2> |
|
||||
) : ( |
|
||||
<h2> |
|
||||
<span>{node.pub_key}</span> |
|
||||
</h2> |
|
||||
)} |
|
||||
</section> |
|
||||
<section>{renderRightSide(node)}</section> |
|
||||
</li> |
|
||||
))} |
|
||||
</ul> |
|
||||
</section> |
|
||||
|
|
||||
{showManualForm && ( |
|
||||
<section className={styles.manualForm}> |
|
||||
<p> |
|
||||
Hm, looks like we can't see that node from here, wanna try to manually connect? |
|
||||
</p> |
|
||||
<div className={styles.manualConnectButton} onClick={openManualForm}> |
|
||||
Connect Manually |
|
||||
</div> |
|
||||
</section> |
|
||||
)} |
|
||||
</div> |
|
||||
) |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
AddChannel.propTypes = { |
|
||||
contactsform: PropTypes.object.isRequired, |
|
||||
closeContactsForm: PropTypes.func.isRequired, |
|
||||
openSubmitChannelForm: PropTypes.func.isRequired, |
|
||||
updateContactFormSearchQuery: PropTypes.func.isRequired, |
|
||||
updateManualFormSearchQuery: PropTypes.func.isRequired, |
|
||||
setNode: PropTypes.func.isRequired, |
|
||||
activeChannelPubkeys: PropTypes.array.isRequired, |
|
||||
nonActiveChannelPubkeys: PropTypes.array.isRequired, |
|
||||
pendingOpenChannelPubkeys: PropTypes.array.isRequired, |
|
||||
filteredNetworkNodes: PropTypes.array.isRequired, |
|
||||
loadingChannelPubkeys: PropTypes.array.isRequired, |
|
||||
showManualForm: PropTypes.bool.isRequired, |
|
||||
openManualForm: PropTypes.func.isRequired |
|
||||
} |
|
||||
|
|
||||
export default AddChannel |
|
@ -0,0 +1,158 @@ |
|||||
|
import React from 'react' |
||||
|
import PropTypes from 'prop-types' |
||||
|
import Isvg from 'react-inlinesvg' |
||||
|
|
||||
|
import x from 'icons/x.svg' |
||||
|
|
||||
|
import styles from './AddChannel.scss' |
||||
|
|
||||
|
const AddChannel = ({ |
||||
|
contactsform, |
||||
|
closeContactsForm, |
||||
|
openSubmitChannelForm, |
||||
|
updateContactFormSearchQuery, |
||||
|
updateManualFormSearchQuery, |
||||
|
setNode, |
||||
|
activeChannelPubkeys, |
||||
|
nonActiveChannelPubkeys, |
||||
|
pendingOpenChannelPubkeys, |
||||
|
filteredNetworkNodes, |
||||
|
loadingChannelPubkeys, |
||||
|
showManualForm, |
||||
|
openManualForm |
||||
|
}) => { |
||||
|
const renderRightSide = node => { |
||||
|
if (loadingChannelPubkeys.includes(node.pub_key)) { |
||||
|
return ( |
||||
|
<span className={styles.inactive}> |
||||
|
<div className={styles.loading}> |
||||
|
<div className={styles.spinner} /> |
||||
|
</div> |
||||
|
</span> |
||||
|
) |
||||
|
} |
||||
|
|
||||
|
if (activeChannelPubkeys.includes(node.pub_key)) { |
||||
|
return ( |
||||
|
<span className={`${styles.online} ${styles.inactive}`}> |
||||
|
<span>Online</span> |
||||
|
</span> |
||||
|
) |
||||
|
} |
||||
|
|
||||
|
if (nonActiveChannelPubkeys.includes(node.pub_key)) { |
||||
|
return ( |
||||
|
<span className={`${styles.offline} ${styles.inactive}`}> |
||||
|
<span>Offline</span> |
||||
|
</span> |
||||
|
) |
||||
|
} |
||||
|
|
||||
|
if (pendingOpenChannelPubkeys.includes(node.pub_key)) { |
||||
|
return ( |
||||
|
<span className={`${styles.pending} ${styles.inactive}`}> |
||||
|
<span>Pending</span> |
||||
|
</span> |
||||
|
) |
||||
|
} |
||||
|
|
||||
|
if (!node.addresses.length) { |
||||
|
return <span className={`${styles.private} ${styles.inactive}`}>Private</span> |
||||
|
} |
||||
|
|
||||
|
return ( |
||||
|
<span |
||||
|
className={styles.connect} |
||||
|
onClick={() => { |
||||
|
// set the node public key for the submit form
|
||||
|
setNode(node) |
||||
|
// open the submit form
|
||||
|
openSubmitChannelForm() |
||||
|
}} |
||||
|
> |
||||
|
Connect |
||||
|
</span> |
||||
|
) |
||||
|
} |
||||
|
|
||||
|
const searchUpdated = search => { |
||||
|
updateContactFormSearchQuery(search) |
||||
|
|
||||
|
if (search.includes('@') && search.split('@')[0].length === 66) { |
||||
|
updateManualFormSearchQuery(search) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return ( |
||||
|
<div className={styles.container}> |
||||
|
<header className={styles.header}> |
||||
|
<input |
||||
|
type="text" |
||||
|
placeholder="Search the network..." |
||||
|
className={styles.searchInput} |
||||
|
value={contactsform.searchQuery} |
||||
|
onChange={event => searchUpdated(event.target.value)} |
||||
|
// ref={input => input && input.focus()}
|
||||
|
/> |
||||
|
<span onClick={closeContactsForm} className={styles.closeIcon}> |
||||
|
<Isvg src={x} /> |
||||
|
</span> |
||||
|
</header> |
||||
|
|
||||
|
<section className={styles.nodes}> |
||||
|
<ul className={styles.networkResults}> |
||||
|
{filteredNetworkNodes.map(node => ( |
||||
|
<li key={node.pub_key}> |
||||
|
<section> |
||||
|
{node.alias.length > 0 ? ( |
||||
|
<h2> |
||||
|
<span>{node.alias.trim()}</span> |
||||
|
<span> |
||||
|
({node.pub_key.substr(0, 10)} |
||||
|
... |
||||
|
{node.pub_key.substr(node.pub_key.length - 10)}) |
||||
|
</span> |
||||
|
</h2> |
||||
|
) : ( |
||||
|
<h2> |
||||
|
<span>{node.pub_key}</span> |
||||
|
</h2> |
||||
|
)} |
||||
|
</section> |
||||
|
<section>{renderRightSide(node)}</section> |
||||
|
</li> |
||||
|
))} |
||||
|
</ul> |
||||
|
</section> |
||||
|
|
||||
|
{showManualForm && ( |
||||
|
<section className={styles.manualForm}> |
||||
|
<p> |
||||
|
Hm, looks like we can't see that node from here, wanna try to manually connect? |
||||
|
</p> |
||||
|
<div className={styles.manualConnectButton} onClick={openManualForm}> |
||||
|
Connect Manually |
||||
|
</div> |
||||
|
</section> |
||||
|
)} |
||||
|
</div> |
||||
|
) |
||||
|
} |
||||
|
|
||||
|
AddChannel.propTypes = { |
||||
|
contactsform: PropTypes.object.isRequired, |
||||
|
closeContactsForm: PropTypes.func.isRequired, |
||||
|
openSubmitChannelForm: PropTypes.func.isRequired, |
||||
|
updateContactFormSearchQuery: PropTypes.func.isRequired, |
||||
|
updateManualFormSearchQuery: PropTypes.func.isRequired, |
||||
|
setNode: PropTypes.func.isRequired, |
||||
|
activeChannelPubkeys: PropTypes.array.isRequired, |
||||
|
nonActiveChannelPubkeys: PropTypes.array.isRequired, |
||||
|
pendingOpenChannelPubkeys: PropTypes.array.isRequired, |
||||
|
filteredNetworkNodes: PropTypes.array.isRequired, |
||||
|
loadingChannelPubkeys: PropTypes.array.isRequired, |
||||
|
showManualForm: PropTypes.bool.isRequired, |
||||
|
openManualForm: PropTypes.func.isRequired |
||||
|
} |
||||
|
|
||||
|
export default AddChannel |
@ -1,4 +1,4 @@ |
|||||
@import '../../styles/variables.scss'; |
@import '../../../styles/variables.scss'; |
||||
|
|
||||
.container { |
.container { |
||||
position: relative; |
position: relative; |
@ -0,0 +1,3 @@ |
|||||
|
import AddChannel from './AddChannel' |
||||
|
|
||||
|
export default AddChannel |
@ -1,4 +1,4 @@ |
|||||
@import '../../styles/variables.scss'; |
@import '../../../styles/variables.scss'; |
||||
|
|
||||
.container { |
.container { |
||||
position: absolute; |
position: absolute; |
@ -0,0 +1,3 @@ |
|||||
|
import ChannelForm from './ChannelForm' |
||||
|
|
||||
|
export default ChannelForm |
@ -1,4 +1,4 @@ |
|||||
@import '../../styles/variables.scss'; |
@import '../../../styles/variables.scss'; |
||||
|
|
||||
.container { |
.container { |
||||
position: absolute; |
position: absolute; |
@ -0,0 +1,3 @@ |
|||||
|
import ConnectManually from './ConnectManually' |
||||
|
|
||||
|
export default ConnectManually |
@ -1,4 +1,4 @@ |
|||||
@import '../../styles/variables.scss'; |
@import '../../../styles/variables.scss'; |
||||
|
|
||||
.header { |
.header { |
||||
display: flex; |
display: flex; |
@ -0,0 +1,3 @@ |
|||||
|
import ContactModal from './ContactModal' |
||||
|
|
||||
|
export default ContactModal |
@ -1,4 +1,4 @@ |
|||||
@import '../../styles/variables.scss'; |
@import '../../../styles/variables.scss'; |
||||
|
|
||||
.modal { |
.modal { |
||||
position: absolute; |
position: absolute; |
@ -0,0 +1,3 @@ |
|||||
|
import ContactsForm from './ContactsForm' |
||||
|
|
||||
|
export default ContactsForm |
@ -1,4 +1,4 @@ |
|||||
@import '../../styles/variables.scss'; |
@import '../../../styles/variables.scss'; |
||||
|
|
||||
.network { |
.network { |
||||
position: relative; |
position: relative; |
@ -0,0 +1,3 @@ |
|||||
|
import Network from './Network' |
||||
|
|
||||
|
export default Network |
@ -1,4 +1,4 @@ |
|||||
@import '../../styles/variables.scss'; |
@import '../../../styles/variables.scss'; |
||||
|
|
||||
.content { |
.content { |
||||
padding: 0 40px; |
padding: 0 40px; |
@ -0,0 +1,3 @@ |
|||||
|
import SubmitChannelForm from './SubmitChannelForm' |
||||
|
|
||||
|
export default SubmitChannelForm |
@ -1,4 +1,4 @@ |
|||||
@import '../../styles/variables.scss'; |
@import '../../../styles/variables.scss'; |
||||
|
|
||||
.container { |
.container { |
||||
color: $white; |
color: $white; |
@ -0,0 +1,3 @@ |
|||||
|
import SuggestedNodes from './SuggestedNodes' |
||||
|
|
||||
|
export default SuggestedNodes |
@ -1,4 +1,4 @@ |
|||||
@import '../../styles/variables.scss'; |
@import '../../../styles/variables.scss'; |
||||
|
|
||||
.container { |
.container { |
||||
padding: 0 40px; |
padding: 0 40px; |
@ -0,0 +1,3 @@ |
|||||
|
import Pay from './Pay' |
||||
|
|
||||
|
export default Pay |
@ -1,149 +0,0 @@ |
|||||
import React, { Component } from 'react' |
|
||||
import PropTypes from 'prop-types' |
|
||||
|
|
||||
import Isvg from 'react-inlinesvg' |
|
||||
import hand from 'icons/hand.svg' |
|
||||
import FaAngleDown from 'react-icons/lib/fa/angle-down' |
|
||||
|
|
||||
import { btc } from 'lib/utils' |
|
||||
import AmountInput from 'components/AmountInput' |
|
||||
import styles from './Request.scss' |
|
||||
|
|
||||
class Request extends Component { |
|
||||
constructor(props) { |
|
||||
super(props) |
|
||||
this.amountInput = React.createRef() |
|
||||
} |
|
||||
|
|
||||
componentDidMount() { |
|
||||
const { setRequestMemo, setRequestAmount } = this.props |
|
||||
|
|
||||
// Clear the form of any previous data.
|
|
||||
setRequestMemo('') |
|
||||
setRequestAmount('') |
|
||||
|
|
||||
// Focus the amount input field.
|
|
||||
this.amountInput.current.focusTextInput() |
|
||||
} |
|
||||
|
|
||||
render() { |
|
||||
const { |
|
||||
requestform: { amount, memo, showCurrencyFilters }, |
|
||||
ticker, |
|
||||
|
|
||||
setRequestAmount, |
|
||||
setRequestMemo, |
|
||||
setCurrency, |
|
||||
setRequestCurrencyFilters, |
|
||||
currencyName, |
|
||||
requestFiatAmount, |
|
||||
|
|
||||
currentCurrencyFilters, |
|
||||
|
|
||||
onRequestSubmit |
|
||||
} = this.props |
|
||||
|
|
||||
const onCurrencyFilterClick = currency => { |
|
||||
// change the input amount
|
|
||||
setRequestAmount(btc.convert(ticker.currency, currency, amount)) |
|
||||
|
|
||||
setCurrency(currency) |
|
||||
setRequestCurrencyFilters(false) |
|
||||
} |
|
||||
|
|
||||
return ( |
|
||||
<div className={styles.container}> |
|
||||
<header className={styles.header}> |
|
||||
<Isvg src={hand} /> |
|
||||
<h1>Request Payment</h1> |
|
||||
</header> |
|
||||
|
|
||||
<div className={styles.content}> |
|
||||
<section className={styles.amount}> |
|
||||
<div className={styles.top}> |
|
||||
<label htmlFor="amount">Amount</label> |
|
||||
<span /> |
|
||||
</div> |
|
||||
<div className={styles.bottom}> |
|
||||
<AmountInput |
|
||||
id="amount" |
|
||||
amount={amount} |
|
||||
currency={ticker.currency} |
|
||||
onChangeEvent={setRequestAmount} |
|
||||
ref={this.amountInput} |
|
||||
/> |
|
||||
<div className={styles.currency}> |
|
||||
<section |
|
||||
className={styles.currentCurrency} |
|
||||
onClick={() => setRequestCurrencyFilters(!showCurrencyFilters)} |
|
||||
> |
|
||||
<span>{currencyName}</span> |
|
||||
<span> |
|
||||
<FaAngleDown /> |
|
||||
</span> |
|
||||
</section> |
|
||||
<ul className={showCurrencyFilters ? styles.active : undefined}> |
|
||||
{currentCurrencyFilters.map(filter => ( |
|
||||
<li key={filter.key} onClick={() => onCurrencyFilterClick(filter.key)}> |
|
||||
{filter.name} |
|
||||
</li> |
|
||||
))} |
|
||||
</ul> |
|
||||
</div> |
|
||||
</div> |
|
||||
|
|
||||
<div className={styles.fiatAmount}>{`≈ ${requestFiatAmount || 0} ${ |
|
||||
ticker.fiatTicker |
|
||||
}`}</div>
|
|
||||
</section> |
|
||||
|
|
||||
<section className={styles.memo}> |
|
||||
<div className={styles.top}> |
|
||||
<label htmlFor="memo">Memo</label> |
|
||||
</div> |
|
||||
<div className={styles.bottom}> |
|
||||
<input |
|
||||
type="text" |
|
||||
placeholder="Details about the request" |
|
||||
value={memo} |
|
||||
onChange={event => setRequestMemo(event.target.value)} |
|
||||
id="memo" |
|
||||
/> |
|
||||
</div> |
|
||||
</section> |
|
||||
|
|
||||
<section className={styles.submit}> |
|
||||
<div |
|
||||
className={`${styles.button} ${amount > 0 ? styles.active : undefined}`} |
|
||||
onClick={onRequestSubmit} |
|
||||
> |
|
||||
Request |
|
||||
</div> |
|
||||
</section> |
|
||||
</div> |
|
||||
</div> |
|
||||
) |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
Request.propTypes = { |
|
||||
requestform: PropTypes.shape({ |
|
||||
amount: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), |
|
||||
memo: PropTypes.string |
|
||||
}).isRequired, |
|
||||
|
|
||||
requestFiatAmount: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), |
|
||||
currencyName: PropTypes.string.isRequired, |
|
||||
|
|
||||
currentCurrencyFilters: PropTypes.array.isRequired, |
|
||||
|
|
||||
setRequestAmount: PropTypes.func.isRequired, |
|
||||
setRequestMemo: PropTypes.func.isRequired, |
|
||||
onRequestSubmit: PropTypes.func.isRequired, |
|
||||
setCurrency: PropTypes.func.isRequired, |
|
||||
setRequestCurrencyFilters: PropTypes.func.isRequired, |
|
||||
|
|
||||
ticker: PropTypes.object.isRequired |
|
||||
} |
|
||||
|
|
||||
export default Request |
|
@ -0,0 +1,128 @@ |
|||||
|
import React from 'react' |
||||
|
import PropTypes from 'prop-types' |
||||
|
|
||||
|
import Isvg from 'react-inlinesvg' |
||||
|
import hand from 'icons/hand.svg' |
||||
|
import FaAngleDown from 'react-icons/lib/fa/angle-down' |
||||
|
|
||||
|
import { btc } from 'lib/utils' |
||||
|
import AmountInput from 'components/AmountInput' |
||||
|
import styles from './Request.scss' |
||||
|
|
||||
|
const Request = ({ |
||||
|
requestform: { amount, memo, showCurrencyFilters }, |
||||
|
ticker, |
||||
|
|
||||
|
setRequestAmount, |
||||
|
setRequestMemo, |
||||
|
setCurrency, |
||||
|
setRequestCurrencyFilters, |
||||
|
currencyName, |
||||
|
requestFiatAmount, |
||||
|
|
||||
|
currentCurrencyFilters, |
||||
|
|
||||
|
onRequestSubmit |
||||
|
}) => { |
||||
|
const onCurrencyFilterClick = currency => { |
||||
|
// change the input amount
|
||||
|
setRequestAmount(btc.convert(ticker.currency, currency, amount)) |
||||
|
|
||||
|
setCurrency(currency) |
||||
|
setRequestCurrencyFilters(false) |
||||
|
} |
||||
|
|
||||
|
return ( |
||||
|
<div className={styles.container}> |
||||
|
<header className={styles.header}> |
||||
|
<Isvg src={hand} /> |
||||
|
<h1>Request Payment</h1> |
||||
|
</header> |
||||
|
|
||||
|
<div className={styles.content}> |
||||
|
<section className={styles.amount}> |
||||
|
<div className={styles.top}> |
||||
|
<label htmlFor="amount">Amount</label> |
||||
|
<span /> |
||||
|
</div> |
||||
|
<div className={styles.bottom}> |
||||
|
<AmountInput |
||||
|
id="amount" |
||||
|
amount={amount} |
||||
|
currency={ticker.currency} |
||||
|
onChangeEvent={setRequestAmount} |
||||
|
/> |
||||
|
<div className={styles.currency}> |
||||
|
<section |
||||
|
className={styles.currentCurrency} |
||||
|
onClick={() => setRequestCurrencyFilters(!showCurrencyFilters)} |
||||
|
> |
||||
|
<span>{currencyName}</span> |
||||
|
<span> |
||||
|
<FaAngleDown /> |
||||
|
</span> |
||||
|
</section> |
||||
|
<ul className={showCurrencyFilters ? styles.active : undefined}> |
||||
|
{currentCurrencyFilters.map(filter => ( |
||||
|
<li key={filter.key} onClick={() => onCurrencyFilterClick(filter.key)}> |
||||
|
{filter.name} |
||||
|
</li> |
||||
|
))} |
||||
|
</ul> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div className={styles.fiatAmount}>{`≈ ${requestFiatAmount || 0} ${ |
||||
|
ticker.fiatTicker |
||||
|
}`}</div>
|
||||
|
</section> |
||||
|
|
||||
|
<section className={styles.memo}> |
||||
|
<div className={styles.top}> |
||||
|
<label htmlFor="memo">Memo</label> |
||||
|
</div> |
||||
|
<div className={styles.bottom}> |
||||
|
<input |
||||
|
type="text" |
||||
|
placeholder="Details about the request" |
||||
|
value={memo} |
||||
|
onChange={event => setRequestMemo(event.target.value)} |
||||
|
id="memo" |
||||
|
/> |
||||
|
</div> |
||||
|
</section> |
||||
|
|
||||
|
<section className={styles.submit}> |
||||
|
<div |
||||
|
className={`${styles.button} ${amount > 0 ? styles.active : undefined}`} |
||||
|
onClick={onRequestSubmit} |
||||
|
> |
||||
|
Request |
||||
|
</div> |
||||
|
</section> |
||||
|
</div> |
||||
|
</div> |
||||
|
) |
||||
|
} |
||||
|
|
||||
|
Request.propTypes = { |
||||
|
requestform: PropTypes.shape({ |
||||
|
amount: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), |
||||
|
memo: PropTypes.string |
||||
|
}).isRequired, |
||||
|
|
||||
|
requestFiatAmount: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), |
||||
|
currencyName: PropTypes.string.isRequired, |
||||
|
|
||||
|
currentCurrencyFilters: PropTypes.array.isRequired, |
||||
|
|
||||
|
setRequestAmount: PropTypes.func.isRequired, |
||||
|
setRequestMemo: PropTypes.func.isRequired, |
||||
|
onRequestSubmit: PropTypes.func.isRequired, |
||||
|
setCurrency: PropTypes.func.isRequired, |
||||
|
setRequestCurrencyFilters: PropTypes.func.isRequired, |
||||
|
|
||||
|
ticker: PropTypes.object.isRequired |
||||
|
} |
||||
|
|
||||
|
export default Request |
@ -1,4 +1,4 @@ |
|||||
@import '../../styles/variables.scss'; |
@import '../../../styles/variables.scss'; |
||||
|
|
||||
.container { |
.container { |
||||
padding: 0 40px; |
padding: 0 40px; |
@ -0,0 +1,3 @@ |
|||||
|
import Request from './Request' |
||||
|
|
||||
|
export default Request |
@ -1,4 +1,4 @@ |
|||||
@import '../../styles/variables.scss'; |
@import '../../../styles/variables.scss'; |
||||
|
|
||||
.alias { |
.alias { |
||||
background: transparent; |
background: transparent; |
@ -0,0 +1,3 @@ |
|||||
|
import Alias from './Alias' |
||||
|
|
||||
|
export default Alias |
@ -1,4 +1,4 @@ |
|||||
@import '../../styles/variables.scss'; |
@import '../../../styles/variables.scss'; |
||||
|
|
||||
.container { |
.container { |
||||
color: $white; |
color: $white; |
@ -0,0 +1,3 @@ |
|||||
|
import Autopilot from './Autopilot' |
||||
|
|
||||
|
export default Autopilot |
@ -1,4 +1,4 @@ |
|||||
@import '../../styles/variables.scss'; |
@import '../../../styles/variables.scss'; |
||||
|
|
||||
.container { |
.container { |
||||
color: $white; |
color: $white; |
@ -0,0 +1,3 @@ |
|||||
|
import BtcPayServer from './BtcPayServer' |
||||
|
|
||||
|
export default BtcPayServer |
@ -1,4 +1,4 @@ |
|||||
@import '../../styles/variables.scss'; |
@import '../../../styles/variables.scss'; |
||||
|
|
||||
.container { |
.container { |
||||
color: $white; |
color: $white; |
@ -0,0 +1,3 @@ |
|||||
|
import ConnectionConfirm from './ConnectionConfirm' |
||||
|
|
||||
|
export default ConnectionConfirm |
@ -1,4 +1,4 @@ |
|||||
@import '../../styles/variables.scss'; |
@import '../../../styles/variables.scss'; |
||||
|
|
||||
.container { |
.container { |
||||
color: $white; |
color: $white; |
@ -0,0 +1,3 @@ |
|||||
|
import ConnectionDetails from './ConnectionDetails' |
||||
|
|
||||
|
export default ConnectionDetails |
@ -1,4 +1,4 @@ |
|||||
@import '../../styles/variables.scss'; |
@import '../../../styles/variables.scss'; |
||||
|
|
||||
.container { |
.container { |
||||
color: $white; |
color: $white; |
@ -0,0 +1,3 @@ |
|||||
|
import ConnectionType from './ConnectionType' |
||||
|
|
||||
|
export default ConnectionType |
@ -1,4 +1,4 @@ |
|||||
@import '../../styles/variables.scss'; |
@import '../../../styles/variables.scss'; |
||||
|
|
||||
.container { |
.container { |
||||
position: relative; |
position: relative; |
@ -0,0 +1,3 @@ |
|||||
|
import FormContainer from './FormContainer' |
||||
|
|
||||
|
export default FormContainer |
@ -1,7 +1,7 @@ |
|||||
import React from 'react' |
import React from 'react' |
||||
import PropTypes from 'prop-types' |
import PropTypes from 'prop-types' |
||||
import Login from './Login' |
import Signup from 'components/Onboarding/Signup' |
||||
import Signup from './Signup' |
import Login from 'components/Onboarding/Login' |
||||
import styles from './InitWallet.scss' |
import styles from './InitWallet.scss' |
||||
|
|
||||
const InitWallet = ({ hasSeed, loginProps, signupProps }) => ( |
const InitWallet = ({ hasSeed, loginProps, signupProps }) => ( |
@ -1,4 +1,4 @@ |
|||||
@import '../../styles/variables.scss'; |
@import '../../../styles/variables.scss'; |
||||
|
|
||||
.container { |
.container { |
||||
position: relative; |
position: relative; |
@ -0,0 +1,3 @@ |
|||||
|
import InitWallet from './InitWallet' |
||||
|
|
||||
|
export default InitWallet |
@ -1,4 +1,4 @@ |
|||||
@import '../../styles/variables.scss'; |
@import '../../../styles/variables.scss'; |
||||
|
|
||||
.container { |
.container { |
||||
position: relative; |
position: relative; |
@ -0,0 +1,3 @@ |
|||||
|
import Login from './Login' |
||||
|
|
||||
|
export default Login |
@ -1,4 +1,4 @@ |
|||||
@import '../../styles/variables.scss'; |
@import '../../../styles/variables.scss'; |
||||
|
|
||||
.input:nth-child(2) { |
.input:nth-child(2) { |
||||
margin-top: 30px; |
margin-top: 30px; |
@ -0,0 +1,3 @@ |
|||||
|
import NewWalletPassword from './NewWalletPassword' |
||||
|
|
||||
|
export default NewWalletPassword |
@ -1,4 +1,4 @@ |
|||||
@import '../../styles/variables.scss'; |
@import '../../../styles/variables.scss'; |
||||
|
|
||||
.container { |
.container { |
||||
font-size: 14px; |
font-size: 14px; |
@ -0,0 +1,3 @@ |
|||||
|
import NewWalletSeed from './NewWalletSeed' |
||||
|
|
||||
|
export default NewWalletSeed |
@ -1,4 +1,4 @@ |
|||||
@import '../../styles/variables.scss'; |
@import '../../../styles/variables.scss'; |
||||
|
|
||||
.seedContainer { |
.seedContainer { |
||||
display: flex; |
display: flex; |
@ -0,0 +1,3 @@ |
|||||
|
import ReEnterSeed from './ReEnterSeed' |
||||
|
|
||||
|
export default ReEnterSeed |
@ -1,4 +1,4 @@ |
|||||
@import '../../styles/variables.scss'; |
@import '../../../styles/variables.scss'; |
||||
|
|
||||
.seedContainer { |
.seedContainer { |
||||
position: relative; |
position: relative; |
@ -0,0 +1,3 @@ |
|||||
|
import RecoverForm from './RecoverForm' |
||||
|
|
||||
|
export default RecoverForm |
@ -1,4 +1,4 @@ |
|||||
@import '../../styles/variables.scss'; |
@import '../../../styles/variables.scss'; |
||||
|
|
||||
.container { |
.container { |
||||
color: $white; |
color: $white; |
@ -0,0 +1,3 @@ |
|||||
|
import Signup from './Signup' |
||||
|
|
||||
|
export default Signup |
@ -1,4 +1,4 @@ |
|||||
@import '../../styles/variables.scss'; |
@import '../../../styles/variables.scss'; |
||||
|
|
||||
.container { |
.container { |
||||
position: relative; |
position: relative; |
@ -0,0 +1,3 @@ |
|||||
|
import Syncing from './Syncing' |
||||
|
|
||||
|
export default Syncing |
@ -1,4 +1,4 @@ |
|||||
@import '../../styles/variables.scss'; |
@import '../../../styles/variables.scss'; |
||||
|
|
||||
.submenuHeader { |
.submenuHeader { |
||||
padding: 20px; |
padding: 20px; |
@ -0,0 +1,3 @@ |
|||||
|
import Fiat from './Fiat' |
||||
|
|
||||
|
export default Fiat |
@ -0,0 +1,3 @@ |
|||||
|
import Menu from './Menu' |
||||
|
|
||||
|
export default Menu |
@ -0,0 +1,3 @@ |
|||||
|
import Settings from './Settings' |
||||
|
|
||||
|
export default Settings |
Some files were not shown because too many files changed in this diff
Loading…
Reference in new issue