Skip to content

Commit

Permalink
feat(simple buy): add cards to general settings page
Browse files Browse the repository at this point in the history
  • Loading branch information
Philip London committed Apr 27, 2020
1 parent 2e369d7 commit 6064e44
Show file tree
Hide file tree
Showing 6 changed files with 165 additions and 28 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ type MessagesType = {
'borrow.validation.belowmin.amt': 'The amount you entered is below the minimum amount of {minFiat}.'
'borrow.validation.belowmin.safe': 'You must enter an amount greater than {minFiat}.'
'borrowhistory.model.pending': 'Pending'
'buttons.add_card': 'Add Card'
'buttons.back': 'Back'
'buttons.cancel': 'Cancel'
'buttons.close': 'Close'
Expand All @@ -21,6 +22,7 @@ type MessagesType = {
'buttons.go_back': 'Go Back'
'buttons.learn_more': 'Learn More'
'buttons.ok': 'OK'
'buttons.remove': 'Remove'
'components.DateInputBox.placeholder.month': 'Month'
'components.EmailVerification.changeemail': 'Change Email'
'components.EmailVerification.checkinbox': 'Check your inbox. We sent an email to:'
Expand Down Expand Up @@ -1012,7 +1014,6 @@ type MessagesType = {
'modals.signmessage.secondstep.message': 'Message:'
'modals.signmessage.secondstep.signature': 'Signature:'
'modals.signmessage.title': 'Sign Message'
'modals.simplebuy.addcard': 'Add Card'
'modals.simplebuy.buycrypto': 'Buy Crypto'
'modals.simplebuy.canceled': 'Trade Canceled'
'modals.simplebuy.cancelorder.areyousure': 'Are you sure?'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -424,6 +424,7 @@ export const showModal = (
| 'emptyFeed'
| 'pendingOrder'
| 'priceChart'
| 'settingsGeneral'
| 'settingsProfile'
| 'sideNav'
| 'welcomeModal',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,10 +56,7 @@ const Success: React.FC<InjectedFormProps<{}, Props> & Props> = props => {
})
}
/>
<FormattedMessage
id='modals.simplebuy.addcard'
defaultMessage='Add Card'
/>
<FormattedMessage id='buttons.add_card' defaultMessage='Add Card' />
</TopText>
<Form onSubmit={props.handleSubmit}>
<FormGroup margin='24px'>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,36 @@
import { actions } from 'data'
import { actions, selectors } from 'data'
import { bindActionCreators, Dispatch } from 'redux'
import { connect, ConnectedProps } from 'react-redux'
import {
FiatType,
RemoteDataType,
SBCardType,
SBPaymentMethodsType
} from 'core/types'
import { getData } from './selectors'
import { RemoteDataType, SBCardType } from 'core/types'
import { RootState } from 'data/rootReducer'
import React, { PureComponent } from 'react'
import Success from './template.success'

class LinkedCards extends PureComponent<Props> {
componentDidMount () {
this.props.simpleBuyActions.fetchSBCards()
this.props.simpleBuyActions.fetchSBPaymentMethods(
this.props.fiatCurrency || 'USD'
)
}

handleCreditCardClick = (/* id: string */) => {
this.props.simpleBuyActions.showModal('settingsGeneral')
this.props.simpleBuyActions.setStep({
step: 'ENTER_AMOUNT',
fiatCurrency: this.props.fiatCurrency || 'USD'
})
}

render () {
return this.props.data.cata({
Success: val => <Success {...val} />,
Success: val => <Success {...val} {...this.props} />,
Loading: () => null,
Failure: () => null,
NotAsked: () => null
Expand All @@ -23,6 +39,7 @@ class LinkedCards extends PureComponent<Props> {
}

const mapStateToProps = (state: RootState): LinkStatePropsType => ({
fiatCurrency: selectors.components.simpleBuy.getFiatCurrency(state),
data: getData(state)
})

Expand All @@ -37,10 +54,12 @@ const connector = connect(

export type SuccessStateType = {
cards: Array<SBCardType>
paymentMethods: SBPaymentMethodsType
}
type LinkStatePropsType = {
data: RemoteDataType<string, SuccessStateType>
fiatCurrency?: FiatType
}
type Props = ConnectedProps<typeof connector>
export type Props = ConnectedProps<typeof connector>

export default connector(LinkedCards)
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,12 @@ import { selectors } from 'data'

export const getData = (state: RootState) => {
const cardsR = selectors.components.simpleBuy.getSBCards(state)
const paymentMethodsR = selectors.components.simpleBuy.getSBPaymentMethods(
state
)

return lift(cards => ({ cards }))(cardsR)
return lift((cards, paymentMethods) => ({ cards, paymentMethods }))(
cardsR,
paymentMethodsR
)
}
Original file line number Diff line number Diff line change
@@ -1,42 +1,155 @@
import { Button } from 'blockchain-info-components'
import { Button, Text, TooltipHost } from 'blockchain-info-components'
import {
CARD_TYPES,
DEFAULT_CARD_SVG_LOGO
} from 'components/Form/CreditCardBox/model'
import { convertBaseToStandard } from 'data/components/exchange/services'
import { fiatToString } from 'core/exchange/currency'
import { FiatType } from 'core/types'
import { FormattedMessage } from 'react-intl'
import { Props as OwnProps, SuccessStateType } from '.'
import {
SettingComponent,
SettingContainer,
SettingHeader,
SettingSummary
} from 'components/Setting'
import { SuccessStateType } from '.'
import media from 'services/ResponsiveService'
import React from 'react'
import styled from 'styled-components'

const CardWrapper = styled.div`
display: flex;
padding: 16px;
border-radius: 8px;
margin-bottom: 12px;
justify-content: space-between;
border: 1px solid ${props => props.theme.grey000};
cursor: pointer;
width: 430px;
${media.mobile`
width: 100%;
`}
`
const CustomSettingContainer = styled(SettingContainer)`
@media (min-width: 992px) {
flex-direction: row;
align-items: flex-start;
justify-content: space-between;
}
`
const CustomSettingHeader = styled(SettingHeader)`
margin-bottom: 18px;
`
const CustomSettingComponent = styled(SettingComponent)`
margin-top: 36px;
${media.tablet`
margin-top: 8px;
`}
`
const Child = styled.div`
display: flex;
div:last-child {
margin-top: 4px;
}
`
const CardImg = styled.img`
margin-right: 14px;
width: 24px;
`
const CardDetails = styled.div<{ right?: boolean }>`
text-align: ${props => (props.right ? 'right' : 'initial')};
`

const Success: React.FC<Props & { fiatCurrency?: FiatType }> = props => {
const ccPaymentMethod = props.paymentMethods.methods.find(
m => m.type === 'CARD'
)
const activeCards = props.cards.filter(card => card.state === 'ACTIVE')

const Success: React.FC<Props> = props => {
return (
<SettingContainer>
return !activeCards.length ? null : (
<CustomSettingContainer>
<SettingSummary>
<SettingHeader>
<CustomSettingHeader>
<FormattedMessage
id='scenes.settings.linked_cards'
defaultMessage='Linked Cards'
/>
</SettingHeader>
{props.cards.map((card, i) => {
</CustomSettingHeader>
{activeCards.map((card, i) => {
let cardType = CARD_TYPES.find(
cardType =>
cardType.type === (card.card ? card.card.type.toLowerCase() : '')
)

if (card.state !== 'ACTIVE') return

return (
<div key={i}>{card.state === 'ACTIVE' ? card.card.number : ''}</div>
<CardWrapper
key={i}
onClick={() =>
props.simpleBuyActions.showModal('settingsGeneral')
}
>
<Child>
<CardImg
src={cardType ? cardType.logo : DEFAULT_CARD_SVG_LOGO}
/>
<CardDetails>
<Text size='16px' color='grey800' weight={600}>
{card.card.label}
</Text>
{ccPaymentMethod && (
<Text size='14px' color='grey600' weight={500}>
{fiatToString({
value: convertBaseToStandard(
'FIAT',
ccPaymentMethod.limits.max
),
unit: props.fiatCurrency || 'USD'
})}{' '}
{props.fiatCurrency} Limit
</Text>
)}
</CardDetails>
</Child>
<Child>
<CardDetails right>
<Text size='16px' color='grey800' weight={600}>
···· {card.card.number}
</Text>
<Text size='14px' color='grey600' weight={500}>
Exp: {card.card.expireMonth}/{card.card.expireYear}
</Text>
</CardDetails>
<TooltipHost id='coming-soon' data-place='right'>
<Button
data-e2e='removeCard'
nature='light-red'
disabled
style={{ marginLeft: '18px', minWidth: 'auto' }}
>
<FormattedMessage
id='buttons.remove'
defaultMessage='Remove'
/>
</Button>
</TooltipHost>
</Child>
</CardWrapper>
)
})}
</SettingSummary>
<SettingComponent>
<Button nature='empty' data-e2e='addCardFromSettings'>
<FormattedMessage
id='scenes.lockbox.settings.adddevice.add'
defaultMessage='Add Device'
/>
<CustomSettingComponent>
<Button nature='primary' data-e2e='addCardFromSettings'>
<FormattedMessage id='buttons.add_card' defaultMessage='Add Card' />
</Button>
</SettingComponent>
</SettingContainer>
</CustomSettingComponent>
</CustomSettingContainer>
)
}

type Props = SuccessStateType
type Props = OwnProps & SuccessStateType

export default Success

0 comments on commit 6064e44

Please sign in to comment.