Browse Source

Merge pull request #63 from loeck/master

Add Send, Receive and Options button in Account page
master
Loëck Vézien 7 years ago
committed by GitHub
parent
commit
97e231978e
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 7
      package.json
  2. 54
      src/components/AccountPage.js
  3. 8
      src/components/DashboardPage.js
  4. 20
      src/components/SideBar/Item.js
  5. 8
      src/components/SideBar/index.js
  6. 8
      src/components/TransactionsList/index.js
  7. 4
      src/components/TransactionsList/stories.js
  8. 53
      src/components/base/Button/index.js
  9. 8
      src/components/base/Modal/index.js
  10. 4
      src/components/modals/AddAccount/index.js
  11. 25
      src/components/modals/Receive.js
  12. 18
      src/components/modals/Send.js
  13. 4
      src/constants.js
  14. 40
      src/helpers/btc.js
  15. 2
      src/reducers/accounts.js
  16. 3
      src/reducers/modals.js
  17. 18
      src/styles/global.js
  18. 2
      src/styles/theme.js
  19. 2
      src/types/common.js
  20. 99
      yarn.lock

7
package.json

@ -50,11 +50,10 @@
"axios": "^0.17.1",
"bcryptjs": "^2.4.3",
"bitcoinjs-lib": "^3.3.2",
"blockchain.info": "^2.11.0",
"bs58check": "^2.1.1",
"color": "^3.0.0",
"cross-env": "^5.1.3",
"downshift": "^1.26.0",
"downshift": "^1.26.1",
"electron-store": "^1.3.0",
"electron-updater": "^2.20.1",
"fuse.js": "^3.2.0",
@ -81,7 +80,7 @@
"redux-thunk": "^2.2.0",
"shortid": "^2.2.8",
"source-map-support": "^0.5.3",
"styled-components": "^3.1.1",
"styled-components": "^3.1.2",
"styled-system": "^1.1.1"
},
"devDependencies": {
@ -114,7 +113,7 @@
"eslint-plugin-jsx-a11y": "^6.0.3",
"eslint-plugin-react": "^7.6.1",
"flow-bin": "^0.64.0",
"flow-typed": "^2.2.3",
"flow-typed": "^2.3.0",
"husky": "^0.14.3",
"lint-staged": "^6.1.0",
"node-loader": "^0.6.0",

54
src/components/AccountPage.js

@ -1,23 +1,32 @@
// @flow
import React, { PureComponent, Fragment } from 'react'
import { compose } from 'redux'
import { connect } from 'react-redux'
import { translate } from 'react-i18next'
import { MODAL_SEND, MODAL_RECEIVE } from 'constants'
import type { MapStateToProps } from 'react-redux'
import type { Account, AccountData } from 'types/common'
import type { T, Account, AccountData } from 'types/common'
import { formatBTC } from 'helpers/format'
import { getAccountById, getAccountData } from 'reducers/accounts'
import { openModal } from 'reducers/modals'
import TransactionsList from 'components/TransactionsList'
import Box, { Card } from 'components/base/Box'
import Text from 'components/base/Text'
import Button from 'components/base/Button'
import Icon from 'components/base/Icon'
import ReceiveBox from 'components/ReceiveBox'
import Text from 'components/base/Text'
import TransactionsList from 'components/TransactionsList'
type Props = {
t: T,
account: Account,
accountData: AccountData,
openModal: Function,
}
const mapStateToProps: MapStateToProps<*, *, *> = (state, props) => ({
@ -25,14 +34,45 @@ const mapStateToProps: MapStateToProps<*, *, *> = (state, props) => ({
accountData: getAccountData(state, props.match.params.id),
})
const mapDispatchToProps = {
openModal,
}
class AccountPage extends PureComponent<Props> {
render() {
const { account, accountData } = this.props
const { account, accountData, openModal, t } = this.props
return (
<Box flow={3}>
<Box>
<Text fontSize={4}>{`${account.name} account`}</Text>
<Box horizontal>
<Box>
<Text fontSize={4}>{`${account.name} account`}</Text>
</Box>
<Box horizontal align="center" justify="flex-end" grow flow={20}>
<Box>
<Button primary onClick={() => openModal(MODAL_SEND, { account })}>
<Box horizontal flow={2}>
<Box>
<Icon name="upload" />
</Box>
<Box>{t('send.title')}</Box>
</Box>
</Button>
</Box>
<Box>
<Button primary onClick={() => openModal(MODAL_RECEIVE, { account })}>
<Box horizontal flow={2}>
<Box>
<Icon name="download" />
</Box>
<Box>{t('receive.title')}</Box>
</Box>
</Button>
</Box>
<Box>
<Button icon="sliders-h" />
</Box>
</Box>
</Box>
{accountData && (
<Fragment>
@ -59,4 +99,4 @@ class AccountPage extends PureComponent<Props> {
}
}
export default connect(mapStateToProps)(AccountPage)
export default compose(connect(mapStateToProps, mapDispatchToProps), translate())(AccountPage)

8
src/components/DashboardPage.js

@ -7,6 +7,8 @@ import { connect } from 'react-redux'
import chunk from 'lodash/chunk'
import { push } from 'react-router-redux'
import { MODAL_ADD_ACCOUNT } from 'constants'
import type { MapStateToProps } from 'react-redux'
import type { Accounts, T } from 'types/common'
@ -106,7 +108,7 @@ class DashboardPage extends PureComponent<Props, State> {
/>
</Card>
<Box flow={3}>
{chunk([...Object.keys(accounts), 'add-account'], 3).map((line, i) => (
{chunk([...Object.keys(accounts), MODAL_ADD_ACCOUNT], 3).map((line, i) => (
<Box
key={i} // eslint-disable-line react/no-array-index-key
horizontal
@ -114,7 +116,7 @@ class DashboardPage extends PureComponent<Props, State> {
>
{line.map(
key =>
key === 'add-account' ? (
key === MODAL_ADD_ACCOUNT ? (
<Box
key={key}
p={3}
@ -124,7 +126,7 @@ class DashboardPage extends PureComponent<Props, State> {
justify="center"
borderColor="mouse"
style={{ borderStyle: 'dashed', cursor: 'pointer', textAlign: 'center' }}
onClick={() => openModal('add-account')}
onClick={() => openModal(MODAL_ADD_ACCOUNT)}
>
{`+ ${t('addAccount.title')}`}
</Box>

20
src/components/SideBar/Item.js

@ -7,7 +7,7 @@ import { withRouter } from 'react-router'
import { push } from 'react-router-redux'
import { connect } from 'react-redux'
import { openModal, isModalOpened } from 'reducers/modals'
import { openModal } from 'reducers/modals'
import type { MapStateToProps } from 'react-redux'
import type { Location } from 'react-router'
@ -16,11 +16,10 @@ import Box from 'components/base/Box'
import Text from 'components/base/Text'
import Icon from 'components/base/Icon'
const mapStateToProps: MapStateToProps<*, *, *> = (state, { modal }: any) => ({
const mapStateToProps: MapStateToProps<*, *, *> = (state: any) => ({
// connect router here only to make components re-render
// see https://github.com/ReactTraining/react-router/issues/4671
router: state.router,
isModalOpened: modal ? isModalOpened(state, modal) : false,
})
const mapDispatchToProps = {
@ -54,24 +53,13 @@ type Props = {
desc?: string | null,
icon?: string | null,
location: Location,
isModalOpened: boolean,
push: Function,
openModal: Function,
}
function Item({
children,
desc,
icon,
linkTo,
push,
location,
modal,
openModal,
isModalOpened,
}: Props) {
function Item({ children, desc, icon, linkTo, push, location, modal, openModal }: Props) {
const { pathname } = location
const isActive = pathname === linkTo || isModalOpened
const isActive = pathname === linkTo
return (
<Container
onClick={

8
src/components/SideBar/index.js

@ -6,6 +6,8 @@ import { translate } from 'react-i18next'
import styled from 'styled-components'
import { connect } from 'react-redux'
import { MODAL_SEND, MODAL_RECEIVE, MODAL_ADD_ACCOUNT } from 'constants'
import type { MapStateToProps } from 'react-redux'
import type { Accounts, T } from 'types/common'
@ -73,10 +75,10 @@ class SideBar extends PureComponent<Props> {
<Item icon="chart-bar" linkTo="/">
{t('dashboard.title')}
</Item>
<Item icon="upload" modal="send">
<Item icon="upload" modal={MODAL_SEND}>
{t('send.title')}
</Item>
<Item icon="download" modal="receive">
<Item icon="download" modal={MODAL_RECEIVE}>
{t('receive.title')}
</Item>
<Item icon="cog" linkTo="/settings">
@ -94,7 +96,7 @@ class SideBar extends PureComponent<Props> {
))}
</div>
</Box>
<BtnAddAccount onClick={() => openModal('add-account')}>
<BtnAddAccount onClick={() => openModal(MODAL_ADD_ACCOUNT)}>
{t('addAccount.title')}
</BtnAddAccount>
</GrowScroll>

8
src/components/TransactionsList/index.js

@ -23,8 +23,6 @@ const Cap = styled(Text).attrs({
letter-spacing: 1px;
`
const Body = styled(Box)``
const HeaderCol = ({ size, children, ...props }: { size?: number, children: any }) => (
<Cell size={size} {...props}>
<Cap>{children}</Cap>
@ -54,7 +52,7 @@ const Cell = styled(Box).attrs({
`
const Transaction = ({ tx }: { tx: TransactionType }) => {
const time = moment(tx.time * 1e3)
const time = moment(tx.received_at)
return (
<TransactionRaw>
<Cell size={DATE_COL_SIZE} justify="space-between">
@ -74,7 +72,7 @@ const Transaction = ({ tx }: { tx: TransactionType }) => {
display: 'block',
}}
>
{tx.balance > 0 ? get(tx, 'inputs.0.prev_out.addr') : get(tx, 'out.0.addr')}
{tx.balance > 0 ? get(tx, 'inputs.0.address') : get(tx, 'outputs.0.address')}
</Cell>
<Cell size={AMOUNT_COL_SIZE} justify="flex-end">
<Text color={tx.balance > 0 ? 'green' : void 0}>{formatBTC(tx.balance)}</Text>
@ -92,6 +90,6 @@ export default ({ transactions }: { transactions: Array<TransactionType> }) => (
{'Amount'}
</HeaderCol>
</Box>
<Body>{transactions.map(t => <Transaction key={t.hash} tx={t} />)}</Body>
<Box>{transactions.map(t => <Transaction key={t.hash} tx={t} />)}</Box>
</Box>
)

4
src/components/TransactionsList/stories.js

@ -11,12 +11,12 @@ const transactions = [
{
hash: '5c6ea1716520c7d6e038d36a3223faced3c4b8f7ffb69d9fb5bd527d562fdb62',
balance: 130000000,
time: 1516809771,
received_at: '2018-01-09T16:03:52Z',
},
{
hash: '27416a48caab90fab053b507b8b6b9d48fba75421d3bfdbae4b85f64024bc9c4',
balance: 65000000,
time: 1516704444,
received_at: '2018-01-09T16:02:40Z',
},
]

53
src/components/base/Button/index.js

@ -2,36 +2,69 @@
import React from 'react'
import styled from 'styled-components'
import { space, fontSize, fontWeight, color } from 'styled-system'
import { borderColor, borderWidth, space, fontSize, fontWeight, color } from 'styled-system'
const Base = styled.button.attrs({
px: 4,
fontSize: 1,
})`
import Icon from 'components/base/Icon'
const Base = styled.button`
${borderColor};
${borderWidth};
${space};
${color};
${fontSize};
${fontWeight};
border-radius: 5px;
cursor: pointer;
border: none;
height: 40px;
box-shadow: ${p => (p.withShadow ? 'rgba(0, 0, 0, 0.2) 0 3px 10px' : '')};
outline: none;
`
type Props = {
children?: any,
icon?: string,
primary?: boolean,
}
const Button = ({ primary, ...props }: Props) => {
if (primary) {
return <Base fontWeight="bold" color="white" bg="blue" withShadow {...props} />
const Button = ({ primary, children, icon, ...props }: Props) => {
children = icon ? <Icon name={icon} /> : children
props = {
...props,
bg: 'transparent',
color: 'mouse',
...(icon
? {
fontSize: 3,
px: 1,
}
: {
fontSize: 1,
px: 3,
}),
...(primary
? {
color: 'white',
bg: 'blue',
borderWidth: 0,
withShadow: true,
}
: {
borderColor: 'mouse',
borderWidth: 1,
}),
}
return <Base color="white" {...props} />
return (
<Base {...props} icon={icon}>
{children}
</Base>
)
}
Button.defaultProps = {
children: undefined,
icon: undefined,
primary: false,
}

8
src/components/base/Modal/index.js

@ -11,7 +11,7 @@ import noop from 'lodash/noop'
import { rgba } from 'styles/helpers'
import { closeModal, isModalOpened } from 'reducers/modals'
import { closeModal, isModalOpened, getModalData } from 'reducers/modals'
import Box from 'components/base/Box'
import Icon from 'components/base/Icon'
@ -22,6 +22,7 @@ type Props = {
preventBackdropClick?: boolean,
preventSideMargin?: boolean,
render: Function,
data?: any,
}
const springConfig = {
@ -30,6 +31,7 @@ const springConfig = {
const mapStateToProps = (state, { name, isOpened }) => ({
isOpened: isOpened || (name && isModalOpened(state, name)),
data: getModalData(state, name),
})
const mapDispatchToProps = (dispatch, { name, onClose = noop }) => ({
@ -110,7 +112,7 @@ export class Modal extends PureComponent<Props> {
}
render() {
const { preventBackdropClick, preventSideMargin, isOpened, onClose, render } = this.props
const { preventBackdropClick, preventSideMargin, isOpened, onClose, render, data } = this.props
return (
<Mortal
isOpened={isOpened}
@ -124,7 +126,7 @@ export class Modal extends PureComponent<Props> {
<Container isVisible={isVisible}>
<Backdrop op={m.opacity} onClick={preventBackdropClick ? undefined : onClose} />
<Wrapper preventSideMargin={preventSideMargin} op={m.opacity} offset={m.y}>
{render({ onClose })}
{render({ data, onClose })}
</Wrapper>
</Container>
)}

4
src/components/modals/AddAccount/index.js

@ -4,6 +4,8 @@ import React, { PureComponent } from 'react'
import { connect } from 'react-redux'
import { ipcRenderer } from 'electron'
import { MODAL_ADD_ACCOUNT } from 'constants'
import type { MapStateToProps } from 'react-redux'
import type { Accounts, Device } from 'types/common'
@ -280,7 +282,7 @@ class AddAccountModal extends PureComponent<Props, State> {
return (
<Modal
name="add-account"
name={MODAL_ADD_ACCOUNT}
preventBackdropClick={step !== 'chooseWallet'}
onClose={this.handleClose}
render={({ onClose }) => (

25
src/components/modals/Receive.js

@ -2,6 +2,9 @@
import React, { PureComponent } from 'react'
import { translate } from 'react-i18next'
import get from 'lodash/get'
import { MODAL_RECEIVE } from 'constants'
import Modal, { ModalBody } from 'components/base/Modal'
import Text from 'components/base/Text'
@ -17,27 +20,41 @@ type State = {
account: AccountType | null,
}
const defaultState = {
account: null,
}
class ReceiveModal extends PureComponent<Props, State> {
state = {
account: null,
...defaultState,
}
handleChangeAccount = account => {
this.setState({ account })
}
handleClose = () =>
this.setState({
...defaultState,
})
render() {
const { account } = this.state
const { t } = this.props
return (
<Modal
name="receive"
render={({ onClose }) => (
name={MODAL_RECEIVE}
onClose={this.handleClose}
render={({ data, onClose }) => (
<ModalBody onClose={onClose} flow={3}>
<Text fontSize={4} color="steel">
{t('receive.modalTitle')}
</Text>
<SelectAccount value={account} onChange={this.handleChangeAccount} />
<SelectAccount
value={account || get(data, 'account')}
onChange={this.handleChangeAccount}
/>
</ModalBody>
)}
/>

18
src/components/modals/Send.js

@ -2,6 +2,9 @@
import React, { Fragment, PureComponent } from 'react'
import styled from 'styled-components'
import get from 'lodash/get'
import { MODAL_SEND } from 'constants'
import Button from 'components/base/Button'
import Input from 'components/base/Input'
@ -71,7 +74,7 @@ type State = {
const defaultState = {
inputValue: {
account: undefined,
account: null,
address: '',
amount: '',
},
@ -83,7 +86,7 @@ class Send extends PureComponent<{}, State> {
...defaultState,
}
getStepProps() {
getStepProps(data: any) {
const { inputValue, step } = this.state
const props = (predicate, props) => (predicate ? props : {})
@ -91,7 +94,10 @@ class Send extends PureComponent<{}, State> {
return {
...props(step === 'amount', {
onChangeInput: this.handleChangeInput,
value: inputValue,
value: {
...inputValue,
account: inputValue.account || get(data, 'account'),
},
}),
...props(step === 'summary', {
value: inputValue,
@ -125,13 +131,13 @@ class Send extends PureComponent<{}, State> {
return (
<Modal
name="send"
name={MODAL_SEND}
onClose={this.handleClose}
render={({ onClose }) => (
render={({ data, onClose }) => (
<Fragment>
<ModalBody>{step}</ModalBody>
<ModalBody onClose={onClose}>
<Step {...this.getStepProps()} />
<Step {...this.getStepProps(data)} />
</ModalBody>
</Fragment>
)}

4
src/constants.js

@ -1,2 +1,6 @@
export const CHECK_UPDATE_TIMEOUT = 5e3
export const SYNC_ACCOUNT_TIMEOUT = 3e3
export const MODAL_ADD_ACCOUNT = 'MODAL_ADD_ACCOUNT'
export const MODAL_SEND = 'MODAL_SEND'
export const MODAL_RECEIVE = 'MODAL_RECEIVE'

40
src/helpers/btc.js

@ -1,10 +1,8 @@
// @flow
// import axios from 'axios'
import axios from 'axios'
import bitcoin from 'bitcoinjs-lib'
const blockexplorer = require('blockchain.info/blockexplorer').usingNetwork(3)
export const networks = [
{
...bitcoin.networks.bitcoin,
@ -17,26 +15,13 @@ export const networks = [
]
export function computeTransaction(addresses: Array<*>) {
// return (transaction: Object) => {
// const outputVal = transaction.outputs
// .filter(o => addresses.includes(o.address))
// .reduce((acc, cur) => acc + cur.value, 0)
// const inputVal = transaction.inputs
// .filter(i => addresses.includes(i.address))
// .reduce((acc, cur) => acc + cur.value, 0)
// const balance = outputVal - inputVal
// return {
// ...transaction,
// balance,
// }
// }
return (transaction: Object) => {
const outputVal = transaction.out
.filter(o => addresses.includes(o.addr))
const outputVal = transaction.outputs
.filter(o => addresses.includes(o.address))
.reduce((acc, cur) => acc + cur.value, 0)
const inputVal = transaction.inputs
.filter(i => addresses.includes(i.prev_out.addr))
.reduce((acc, cur) => acc + cur.prev_out.value, 0)
.filter(i => addresses.includes(i.address))
.reduce((acc, cur) => acc + cur.value, 0)
const balance = outputVal - inputVal
return {
...transaction,
@ -46,12 +31,13 @@ export function computeTransaction(addresses: Array<*>) {
}
export function getTransactions(addresses: Array<string>) {
// return axios.get(
// `http://api.ledgerwallet.com/blockchain/v2/btc_testnet/addresses/${addresses.join(
// ',',
// )}/transactions?noToken=true`,
// )
return blockexplorer.getMultiAddress(addresses)
return axios
.get(
`http://api.ledgerwallet.com/blockchain/v2/btc_testnet/addresses/${addresses.join(
',',
)}/transactions?noToken=true`,
)
.then(({ data }) => data)
}
export async function getAccount({
@ -104,7 +90,7 @@ export async function getAccount({
new Promise(resolve => setTimeout(() => resolve(getAddress(params)), asyncDelay))
const getLastAddress = (addresses, txs) => {
const txsAddresses = [...txs.inputs.map(tx => tx.prev_out.addr), ...txs.out.map(tx => tx.addr)]
const txsAddresses = [...txs.inputs.map(tx => tx.address), ...txs.outputs.map(tx => tx.address)]
const lastAddress = addresses.reverse().find(a => txsAddresses.includes(a.address)) || {
index: 0,
}

2
src/reducers/accounts.js

@ -17,7 +17,7 @@ const state: AccountsState = {}
function getAccount(account: Account) {
const transactions = get(account.data, 'transactions', [])
transactions.sort((a, b) => b.time - a.time)
transactions.sort((a, b) => new Date(b.received_at) - new Date(a.received_at))
return {
...account,

3
src/reducers/modals.js

@ -53,6 +53,9 @@ export const closeModal = createAction('MODAL_CLOSE', name => ({ name }))
export const isModalOpened = (state: Object, name: string) =>
state.modals[name] && state.modals[name].isOpened
export const getModalData = (state: Object, name: string) =>
state.modals[name] && state.modals[name].data
// Exporting reducer
export default handleActions(handlers, state)

18
src/styles/global.js

@ -21,6 +21,10 @@ injectGlobal`
flex-shrink: 0;
}
html {
-ms-overflow-style: -ms-autohiding-scrollbar;
}
body {
line-height: 1.5;
font-size: 16px;
@ -40,8 +44,18 @@ injectGlobal`
em {
font-style: italic;
}
::-webkit-scrollbar {
display: none;
background-color: rgba(0, 0, 0, 0);
width: 6px;
}
::-webkit-scrollbar:hover {
background-color: rgba(0, 0, 0, 0.09);
}
::-webkit-scrollbar-thumb:vertical {
background: rgba(0, 0, 0, 0.5);
}
::-webkit-scrollbar-thumb:vertical:active {
background: rgba(0, 0, 0, 0.61);
}
`

2
src/styles/theme.js

@ -5,6 +5,8 @@ export default {
sideBarWidth: 250,
},
colors: {
transparent: 'transparent',
black: '#000000',
white: '#ffffff',

2
src/types/common.js

@ -13,7 +13,7 @@ export type Devices = Array<Device>
export type Transaction = {
balance: number,
hash: string,
time: number,
received_at: string,
}
// -------------------- Accounts

99
yarn.lock

@ -1481,7 +1481,7 @@ babel-plugin-transform-undefined-to-void@^6.8.3:
version "6.8.3"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-undefined-to-void/-/babel-plugin-transform-undefined-to-void-6.8.3.tgz#fc52707f6ee1ddc71bb91b0d314fbefdeef9beb4"
babel-polyfill@^6.23.0:
babel-polyfill@^6.26.0:
version "6.26.0"
resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153"
dependencies:
@ -1803,28 +1803,12 @@ block-stream@*:
dependencies:
inherits "~2.0.0"
blockchain.info@^2.11.0:
version "2.11.0"
resolved "https://registry.yarnpkg.com/blockchain.info/-/blockchain.info-2.11.0.tgz#63b46617e194164d377e183e6c667d3ef38ad5b6"
dependencies:
q "^1.4.1"
request-promise "^0.4.3"
url-join "0.0.1"
url-parse "^1.0.5"
url-pattern "^0.10.2"
optionalDependencies:
ws "^1.1.2"
bluebird-lst@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/bluebird-lst/-/bluebird-lst-1.0.5.tgz#bebc83026b7e92a72871a3dc599e219cbfb002a9"
dependencies:
bluebird "^3.5.1"
bluebird@^2.3:
version "2.11.0"
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.11.0.tgz#534b9033c022c9579c56ba3b3e5a5caafbb650e1"
bluebird@^3.4.7, bluebird@^3.5.0, bluebird@^3.5.1:
version "3.5.1"
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9"
@ -2217,7 +2201,7 @@ chalk@0.5.1:
strip-ansi "^0.3.0"
supports-color "^0.2.0"
chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3:
chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
dependencies:
@ -3154,9 +3138,9 @@ dotenv@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-4.0.0.tgz#864ef1379aced55ce6f95debecdce179f7a0cd1d"
downshift@^1.26.0:
version "1.26.0"
resolved "https://registry.yarnpkg.com/downshift/-/downshift-1.26.0.tgz#1ee954fef129861f977c6b9effe93fb78e7dc363"
downshift@^1.26.1:
version "1.26.1"
resolved "https://registry.yarnpkg.com/downshift/-/downshift-1.26.1.tgz#ae45a016f211d02f8000584d0b466142fde2dd6b"
duplexer3@^0.1.4:
version "0.1.4"
@ -4094,25 +4078,24 @@ flow-bin@^0.64.0:
version "0.64.0"
resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.64.0.tgz#ddd3fb3b183ab1ab35a5d5dec9caf5ebbcded167"
flow-typed@^2.2.3:
version "2.2.3"
resolved "https://registry.yarnpkg.com/flow-typed/-/flow-typed-2.2.3.tgz#e7a35915a0f4cfcf8068c1ce291b5c99e6b89efa"
flow-typed@^2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/flow-typed/-/flow-typed-2.3.0.tgz#0f8604faab60691b885024e16ec0e3256e3b680e"
dependencies:
babel-polyfill "^6.23.0"
babel-polyfill "^6.26.0"
colors "^1.1.2"
fs-extra "^4.0.0"
fs-extra "^5.0.0"
github "0.2.4"
glob "^7.1.2"
got "^7.1.0"
md5 "^2.1.0"
mkdirp "^0.5.1"
request "^2.81.0"
rimraf "^2.6.1"
semver "^5.1.0"
table "^4.0.1"
rimraf "^2.6.2"
semver "^5.5.0"
table "^4.0.2"
through "^2.3.8"
unzip "^0.1.11"
which "^1.2.14"
which "^1.3.0"
yargs "^4.2.0"
flush-write-stream@^1.0.0:
@ -4200,7 +4183,7 @@ fs-extra@^0.30.0:
path-is-absolute "^1.0.0"
rimraf "^2.2.8"
fs-extra@^4.0.0, fs-extra@^4.0.1:
fs-extra@^4.0.1:
version "4.0.3"
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94"
dependencies:
@ -5687,7 +5670,7 @@ lodash.uniq@^4.5.0:
version "4.5.0"
resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
lodash@^3.10.0, lodash@^3.10.1:
lodash@^3.10.1:
version "3.10.1"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6"
@ -6388,10 +6371,6 @@ optionator@^0.8.2:
type-check "~0.3.2"
wordwrap "~1.0.0"
options@>=0.0.5:
version "0.0.6"
resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f"
ora@^0.2.3:
version "0.2.3"
resolved "https://registry.yarnpkg.com/ora/-/ora-0.2.3.tgz#37527d220adcd53c39b73571d754156d5db657a4"
@ -7165,7 +7144,7 @@ pushdata-bitcoin@^1.0.1:
dependencies:
bitcoin-ops "^1.3.0"
q@^1.1.2, q@^1.4.1:
q@^1.1.2:
version "1.5.1"
resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
@ -7792,15 +7771,6 @@ repeating@^2.0.0:
dependencies:
is-finite "^1.0.0"
request-promise@^0.4.3:
version "0.4.3"
resolved "https://registry.yarnpkg.com/request-promise/-/request-promise-0.4.3.tgz#3c8ddc82f06f8908d720aede1d6794258e22121c"
dependencies:
bluebird "^2.3"
chalk "^1.1.0"
lodash "^3.10.0"
request "^2.34"
request@2.81.0:
version "2.81.0"
resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0"
@ -7828,7 +7798,7 @@ request@2.81.0:
tunnel-agent "^0.6.0"
uuid "^3.0.0"
request@^2.34, request@^2.45.0, request@^2.81.0, request@^2.83.0:
request@^2.45.0, request@^2.83.0:
version "2.83.0"
resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356"
dependencies:
@ -7934,7 +7904,7 @@ right-align@^0.1.1:
dependencies:
align-text "^0.1.1"
rimraf@2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.1:
rimraf@2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2:
version "2.6.2"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36"
dependencies:
@ -8565,9 +8535,9 @@ style-loader@^0.19.0, style-loader@^0.19.1:
loader-utils "^1.0.2"
schema-utils "^0.3.0"
styled-components@^3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-3.1.1.tgz#7896819070b2663c6519f428017d6ca7e2a3c7cd"
styled-components@^3.1.2:
version "3.1.2"
resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-3.1.2.tgz#0769655335eb6800dc5f6691425f6f7fe1801e32"
dependencies:
buffer "^5.0.3"
css-to-react-native "^2.0.3"
@ -8660,7 +8630,7 @@ symbol-observable@^1.0.3:
version "1.1.0"
resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.1.0.tgz#5c68fd8d54115d9dfb72a84720549222e8db9b32"
table@^4.0.1:
table@^4.0.1, table@^4.0.2:
version "4.0.2"
resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36"
dependencies:
@ -8939,10 +8909,6 @@ uid-number@^0.0.6:
version "0.0.6"
resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81"
ultron@1.0.x:
version "1.0.2"
resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa"
union-value@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4"
@ -9040,10 +9006,6 @@ urix@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
url-join@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/url-join/-/url-join-0.0.1.tgz#1db48ad422d3402469a87f7d97bdebfe4fb1e3c8"
url-loader@^0.6.2:
version "0.6.2"
resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-0.6.2.tgz#a007a7109620e9d988d14bce677a1decb9a993f7"
@ -9065,17 +9027,13 @@ url-parse@1.0.x:
querystringify "0.0.x"
requires-port "1.0.x"
url-parse@^1.0.5, url-parse@^1.1.8:
url-parse@^1.1.8:
version "1.2.0"
resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.2.0.tgz#3a19e8aaa6d023ddd27dcc44cb4fc8f7fec23986"
dependencies:
querystringify "~1.0.0"
requires-port "~1.0.0"
url-pattern@^0.10.2:
version "0.10.2"
resolved "https://registry.yarnpkg.com/url-pattern/-/url-pattern-0.10.2.tgz#e9f07104982b72312db4473dd86a527b580015da"
url-to-options@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9"
@ -9327,7 +9285,7 @@ which-module@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
which@^1.2.10, which@^1.2.14, which@^1.2.9:
which@^1.2.10, which@^1.2.9, which@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a"
dependencies:
@ -9403,13 +9361,6 @@ write@^0.2.1:
dependencies:
mkdirp "^0.5.1"
ws@^1.1.2:
version "1.1.5"
resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.5.tgz#cbd9e6e75e09fc5d2c90015f21f0c40875e0dd51"
dependencies:
options ">=0.0.5"
ultron "1.0.x"
xdg-basedir@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4"

Loading…
Cancel
Save