Browse Source

Merge pull request #309 from MortalKastor/feature-send

Send funds flow (minus the part where the funds are actually sent)
master
Gaëtan Renaudeau 7 years ago
committed by GitHub
parent
commit
aaafc3ae38
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 53
      src/components/WarnBox/index.js
  2. 18
      src/components/WarnBox/stories.js
  3. 53
      src/components/modals/Send/03-step-verification.js
  4. 57
      src/components/modals/Send/04-step-confirmation.js
  5. 67
      src/components/modals/Send/Footer.js
  6. 64
      src/components/modals/Send/index.js
  7. 12
      src/icons/CheckCircle.js
  8. 12
      src/icons/ExclamationCircleThin.js
  9. 5
      src/styles/helpers.js
  10. 15
      static/i18n/en/send.yml
  11. 138
      yarn.lock

53
src/components/WarnBox/index.js

@ -0,0 +1,53 @@
// @flow
import * as React from 'react'
import styled from 'styled-components'
import Box from 'components/base/Box'
const Container = styled(Box).attrs({
color: 'graphite',
borderRadius: 1,
px: 4,
py: 3,
horizontal: true,
ff: 'Open Sans',
fontSize: 4,
flow: 4,
})`
border: solid 1px;
border-color: ${p => p.theme.colors.fog};
align-items: center;
`
const svg = (
<svg width="36" height="43">
<g fill="none">
<path
fill="#4B84FF"
fillOpacity=".08"
d="M18.177 2C18.06 24.126 18 37.184 18 41.174h.354C27.74 38.96 35 29.762 35 19.884V9.154L18.177 2z"
/>
<path
stroke="#142533"
strokeWidth="2"
d="M18 2L1 9.153v10.73c0 9.88 7.158 19.077 16.821 21.29h.358C27.663 38.96 35 29.764 35 19.884V9.154L18 2z"
/>
<path
fill="#4B84FF"
d="M23.733 15.036c-.568 0-1.03.448-1.03 1.001l-.019 4.488s.002.313-.308.313c-.316 0-.307-.313-.307-.313v-6.474c0-.553-.456-.982-1.024-.982-.57 0-.974.43-.974.982v6.474s-.035.316-.34.316c-.303 0-.327-.316-.327-.316v-7.553c0-.552-.428-.972-.996-.972-.569 0-1 .42-1 .972v7.553s-.016.303-.344.303c-.321 0-.323-.303-.323-.303v-5.611c0-.553-.445-.9-1.013-.9-.57 0-.985.347-.985.9v8.2s-.056.365-.594-.237c-1.378-1.543-2.097-1.85-2.097-1.85s-1.31-.622-1.889.503c-.42.816.025.86.712 1.861.607.888 2.529 3.221 2.529 3.221s2.28 3.126 5.355 3.126c0 0 6.024.25 6.024-5.544l-.021-8.157c0-.553-.46-1.001-1.03-1.001"
/>
</g>
</svg>
)
type Props = {
children: React.Node,
}
export default (props: Props) => (
<Container>
<Box mx={1}>{svg}</Box>
<Box shrink>{props.children}</Box>
</Container>
)

18
src/components/WarnBox/stories.js

@ -0,0 +1,18 @@
// @flow
import React from 'react'
import { storiesOf } from '@storybook/react'
import { text } from '@storybook/addon-knobs'
import WarnBox from 'components/WarnBox'
const stories = storiesOf('Components', module)
stories.add('WarnBox', () => (
<WarnBox>
{text(
'children',
'Nulla ornare ligula nec velit fermentum accumsan. Mauris sagittis iaculis pretium. Maecenas tincidunt tortor ullamcorper neque scelerisque lacinia sit amet sit amet elit. Quisque vulputate at tellus ut fringilla. Sed varius neque accumsan nunc consequat semper. In interdum euismod velit, sed pulvinar justo finibus ac. Nullam euismod felis non pellentesque fermentum. Nullam sed libero eu ligula porta accumsan eget et neque. Sed varius lobortis vestibulum. Morbi efficitur leo at augue venenatis, vitae faucibus ante lobortis. Nunc tincidunt, sem eget ultricies convallis, dolor est gravida sem, non vestibulum urna lorem a justo. Quisque ultrices feugiat arcu, sit amet tristique tellus maximus in. Phasellus ultricies mattis erat vitae laoreet. Fusce ac dignissim dui. Etiam semper purus nisi, eu semper tortor mollis nec.',
)}
</WarnBox>
))

53
src/components/modals/Send/03-step-verification.js

@ -1,7 +1,54 @@
// @flow
import React from 'react'
import styled from 'styled-components'
import Box from 'components/base/Box'
import WarnBox from 'components/WarnBox'
import { multiline } from 'styles/helpers'
import DeviceCheckAddress from 'components/DeviceCheckAddress'
import DeviceConfirm from 'components/DeviceConfirm'
import type { Account } from '@ledgerhq/wallet-common/lib/types'
import type { Device, T } from 'types/common'
const Container = styled(Box).attrs({
alignItems: 'center',
fontSize: 4,
pb: 4,
})``
const Info = styled(Box).attrs({
ff: 'Open Sans|SemiBold',
color: 'dark',
mt: 6,
mb: 4,
px: 5,
})`
text-align: center;
`
function StepVerification() {
return <div>step verification</div>
type Props = {
account: ?Account,
device: ?Device,
onValidate: Function,
t: T,
}
export default StepVerification
export default (props: Props) => (
<Container>
<WarnBox>{multiline(props.t('send:steps.verification.warning'))}</WarnBox>
<Info>{props.t('send:steps.verification.body')}</Info>
{// TODO: Actually create a tx
// DeviceCheckAddress used as a placeholder in the meantime
props.account &&
props.device && (
<DeviceCheckAddress
account={props.account}
device={props.device}
onCheck={props.onValidate}
render={({ isVerified }) => <DeviceConfirm notValid={isVerified === false} />}
/>
)}
</Container>
)

57
src/components/modals/Send/04-step-confirmation.js

@ -1,7 +1,60 @@
// @flow
import React from 'react'
import styled from 'styled-components'
function StepConfirmation() {
return <div>step confirmation</div>
import IconCheckCircle from 'icons/CheckCircle'
import IconExclamationCircleThin from 'icons/ExclamationCircleThin'
import Box from 'components/base/Box'
import { multiline } from 'styles/helpers'
import { colors } from 'styles/theme'
import type { T } from 'types/common'
const Container = styled(Box).attrs({
alignItems: 'center',
justifyContent: 'center',
grow: true,
color: 'dark',
})`
height: 220px;
`
const Title = styled(Box).attrs({
ff: 'Museo Sans',
fontSize: 5,
mt: 4,
})`
text-align: center;
`
const Text = styled(Box).attrs({
ff: 'Open Sans',
fontSize: 4,
mt: 2,
})`
text-align: center;
`
type Props = {
txValidated: boolean,
t: T,
}
function StepConfirmation(props: Props) {
const { t, txValidated } = props
const Icon = txValidated ? IconCheckCircle : IconExclamationCircleThin
const iconColor = txValidated ? colors.positiveGreen : colors.alertRed
const tPrefix = txValidated ? 'send:steps.confirmation.success' : 'send:steps.confirmation.error'
return (
<Container>
<span style={{ color: iconColor }}>
<Icon size={43} />
</span>
<Title>{t(`${tPrefix}.title`)}</Title>
<Text>{multiline(t(`${tPrefix}.text`))}</Text>
</Container>
)
}
export default StepConfirmation

67
src/components/modals/Send/Footer.js

@ -20,42 +20,47 @@ type Props = {
fees: number,
onNext: Function,
canNext: boolean,
showTotal: boolean,
}
function Footer({ account, amount, fees, t, onNext, canNext }: Props) {
function Footer({ account, amount, fees, t, onNext, canNext, showTotal }: Props) {
return (
<ModalFooter horizontal alignItems="center">
<Box grow>
<Label>{t('send:totalSpent')}</Label>
<Box horizontal flow={2} align="center">
<FormattedVal
disableRounding
color="dark"
val={amount + fees}
unit={account.unit}
showCode
/>
<Box horizontal align="center">
<Text ff="Rubik" fontSize={3}>
{'('}
</Text>
<CounterValue
ticker={account.currency.units[0].code}
value={amount + fees}
disableRounding
color="grey"
fontSize={3}
showCode
/>
<Text ff="Rubik" fontSize={3}>
{')'}
</Text>
<ModalFooter>
<Box horizontal alignItems="center" justifyContent="flex-end" flow={2}>
{showTotal && (
<Box grow>
<Label>{t('send:totalSpent')}</Label>
<Box horizontal flow={2} align="center">
<FormattedVal
disableRounding
color="dark"
val={amount + fees}
unit={account.unit}
showCode
/>
<Box horizontal align="center">
<Text ff="Rubik" fontSize={3}>
{'('}
</Text>
<CounterValue
ticker={account.currency.units[0].code}
value={amount + fees}
disableRounding
color="grey"
fontSize={3}
showCode
/>
<Text ff="Rubik" fontSize={3}>
{')'}
</Text>
</Box>
</Box>
</Box>
</Box>
)}
<Button primary onClick={onNext} disabled={!canNext}>
{'Next'}
</Button>
</Box>
<Button primary onClick={onNext} disabled={!canNext}>
{'Next'}
</Button>
</ModalFooter>
)
}

64
src/components/modals/Send/index.js

@ -37,6 +37,7 @@ type State = {
fees: number,
isRBF: boolean,
recipientAddress: string,
txValidated: null | boolean,
stepIndex: number,
}
@ -59,6 +60,7 @@ const INITIAL_STATE = {
fees: 0,
isRBF: false,
recipientAddress: '',
txValidated: null,
stepIndex: 0,
}
@ -136,6 +138,15 @@ class SendModal extends PureComponent<Props, State> {
})
}
handleValidate = isValidated => {
const { stepIndex } = this.state
this.setState({
txValidated: isValidated,
stepIndex: stepIndex + 1,
})
}
createChangeHandler = key => value => {
const patch = { [key]: value }
// ensure max is always restecped when changing fees
@ -158,34 +169,47 @@ class SendModal extends PureComponent<Props, State> {
renderStep = () => {
const { t } = this.props
const { stepIndex, amount, deviceSelected, ...otherState } = this.state
const { stepIndex, deviceSelected, txValidated, ...otherState } = this.state
const step = this._steps[stepIndex]
if (!step) {
return null
}
const { Comp } = step
const props = (predicate, props) => (predicate ? props : {})
const stepProps = {
...otherState,
t,
amount,
account: this._account,
...props(stepIndex === 1, {
accountName: this._account ? this._account.name : undefined,
deviceSelected,
onChangeDevice: this.handleChangeDevice,
onStatusChange: this.handleChangeStatus,
}),
}
return <Comp onChange={this.createChangeHandler} {...stepProps} {...this.props} />
switch (stepIndex) {
case 1:
stepProps.accountName = this._account ? this._account.name : undefined
stepProps.deviceSelected = deviceSelected
stepProps.onChangeDevice = this.handleChangeDevice
stepProps.onStatusChange = this.handleChangeStatus
break
case 2:
stepProps.device = deviceSelected
stepProps.onValidate = this.handleValidate
break
case 3:
if (txValidated !== null) {
stepProps.txValidated = txValidated
}
break
default:
break
}
return <Comp onChange={this.createChangeHandler} {...stepProps} />
}
render() {
const { accounts, t } = this.props
const { stepIndex, amount, account, fees } = this.state
const { stepIndex, amount, account, fees, txValidated } = this.state
const canNext = this.canNext()
const canPrev = this.canPrev()
@ -210,20 +234,30 @@ class SendModal extends PureComponent<Props, State> {
{this.renderStep()}
</ModalContent>
{this._account &&
stepIndex !== 3 && (
stepIndex < 2 && (
<Footer
canNext={canNext}
onNext={this.handleNextStep}
account={this._account}
amount={amount}
fees={fees}
showTotal={stepIndex === 0}
t={t}
/>
)}
{stepIndex === 3 && (
<ModalFooter horizontal alignItems="center" justifyContent="flex-end" flow={2}>
<Button onClick={onClose}>{t('common:close')}</Button>
<Button primary>{t('send:steps.confirmation.cta')}</Button>
{txValidated ? (
// TODO: actually go to operations details
<Button onClick={onClose} primary>
{t('send:steps.confirmation.success.cta')}
</Button>
) : (
<Button onClick={() => this.setState({ stepIndex: 0 })} primary>
{t('send:steps.confirmation.error.cta')}
</Button>
)}
</ModalFooter>
)}
</ModalBody>

12
src/icons/CheckCircle.js

@ -0,0 +1,12 @@
// @flow
import React from 'react'
export default ({ size, ...p }: { size: number }) => (
<svg viewBox="0 0 24 24" height={size} width={size} {...p}>
<path
fill="currentColor"
d="M12 .375C5.58.375.375 5.58.375 12S5.58 23.625 12 23.625 23.625 18.42 23.625 12 18.42.375 12 .375zm0 21.75C6.438 22.125 1.875 17.622 1.875 12 1.875 6.438 6.378 1.875 12 1.875c5.562 0 10.125 4.503 10.125 10.125 0 5.562-4.503 10.125-10.125 10.125zm6.639-12.889l-8.46 8.392a.562.562 0 0 1-.796-.003l-4.025-4.058a.562.562 0 0 1 .003-.795l.4-.397a.562.562 0 0 1 .795.004l3.233 3.259 7.661-7.6a.562.562 0 0 1 .796.003l.396.4a.562.562 0 0 1-.003.795z"
/>
</svg>
)

12
src/icons/ExclamationCircleThin.js

@ -0,0 +1,12 @@
// @flow
import React from 'react'
export default ({ size, ...p }: { size: number }) => (
<svg viewBox="0 0 24 24" height={size} width={size} {...p}>
<path
fill="currentColor"
d="M12 1.875c5.56 0 10.125 4.504 10.125 10.125A10.122 10.122 0 0 1 12 22.125C6.41 22.125 1.875 17.599 1.875 12 1.875 6.412 6.403 1.875 12 1.875zm0-1.5C5.58.375.375 5.582.375 12 .375 18.422 5.58 23.625 12 23.625S23.625 18.422 23.625 12C23.625 5.582 18.42.375 12 .375zM11.461 6h1.078c.32 0 .575.266.562.586l-.329 7.875a.562.562 0 0 1-.562.539h-.42a.563.563 0 0 1-.563-.54L10.9 6.587A.563.563 0 0 1 11.461 6zM12 15.938a1.312 1.312 0 1 0 0 2.624 1.312 1.312 0 0 0 0-2.625z"
/>
</svg>
)

5
src/styles/helpers.js

@ -1,6 +1,8 @@
// @flow
import React from 'react'
import Color from 'color'
import uniqueId from 'lodash/uniqueId'
import staticPath from 'helpers/staticPath'
import { colors, fontFamilies } from 'styles/theme'
@ -53,6 +55,9 @@ export const fontFace = ({
}
`
export const multiline = (str: string) =>
str.split('\n').map(line => <p key={uniqueId()}>{line}</p>)
export function getMarketColor({
marketIndicator,
isNegative,

15
static/i18n/en/send.yml

@ -15,6 +15,19 @@ steps:
title: Connect device
verification:
title: Verification
warning: |
You are about to validate a transaction.
Be careful, we strongly recommand you to verify that the informations on your Ledger device are correct.
body: Once you have checked everything is ok, you can validate securely the transaction on your device.
confirmation:
title: Confirmation
cta: View operation details
success:
title: Transaction successfully completed
text: You may have to wait few confirmations unitl the transaction appear
cta: View operation details
error:
title: Transaction aborted
text: |
The transaction have been aborted on your device.
You can try again the operation.
cta: Retry operation

138
yarn.lock

@ -1430,14 +1430,26 @@ app-builder-bin-linux@1.8.5:
version "1.8.5"
resolved "https://registry.yarnpkg.com/app-builder-bin-linux/-/app-builder-bin-linux-1.8.5.tgz#bf001d3ef347e1179680a1760fea83d0832fc344"
app-builder-bin-linux@1.8.6:
version "1.8.6"
resolved "https://registry.yarnpkg.com/app-builder-bin-linux/-/app-builder-bin-linux-1.8.6.tgz#81176bbcb2929958a90f2184afb54df90b7210a3"
app-builder-bin-mac@1.8.5:
version "1.8.5"
resolved "https://registry.yarnpkg.com/app-builder-bin-mac/-/app-builder-bin-mac-1.8.5.tgz#31282504d232081a9de94d377736bf904bbfbd53"
app-builder-bin-mac@1.8.6:
version "1.8.6"
resolved "https://registry.yarnpkg.com/app-builder-bin-mac/-/app-builder-bin-mac-1.8.6.tgz#20d7233c5cadf00472e7b0ccaf85627b53f90787"
app-builder-bin-win@1.8.5:
version "1.8.5"
resolved "https://registry.yarnpkg.com/app-builder-bin-win/-/app-builder-bin-win-1.8.5.tgz#d7eefc1dff6052e137a3c5d68cd6e68ba862054b"
app-builder-bin-win@1.8.6:
version "1.8.6"
resolved "https://registry.yarnpkg.com/app-builder-bin-win/-/app-builder-bin-win-1.8.6.tgz#d09f78fb1dd5a5f8ea231294828fd5c9ad0358a5"
app-builder-bin@1.8.5:
version "1.8.5"
resolved "https://registry.yarnpkg.com/app-builder-bin/-/app-builder-bin-1.8.5.tgz#ac0c0fad3c348ff3bde367e49b25cf5edc414407"
@ -1446,6 +1458,14 @@ app-builder-bin@1.8.5:
app-builder-bin-mac "1.8.5"
app-builder-bin-win "1.8.5"
app-builder-bin@1.8.6:
version "1.8.6"
resolved "https://registry.yarnpkg.com/app-builder-bin/-/app-builder-bin-1.8.6.tgz#85604ece9c1b63ed0437abe92ddaf41c88c3f2e4"
optionalDependencies:
app-builder-bin-linux "1.8.6"
app-builder-bin-mac "1.8.6"
app-builder-bin-win "1.8.6"
app-root-path@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-2.0.1.tgz#cd62dcf8e4fd5a417efc664d2e5b10653c651b46"
@ -3137,6 +3157,25 @@ builder-util@5.7.6, builder-util@^5.7.6:
stat-mode "^0.2.2"
temp-file "^3.1.1"
builder-util@5.7.9:
version "5.7.9"
resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-5.7.9.tgz#a481bd14e03ae4a8336569d469f8bd0dd400fca1"
dependencies:
"7zip-bin" "~3.1.0"
app-builder-bin "1.8.6"
bluebird-lst "^1.0.5"
builder-util-runtime "^4.2.0"
chalk "^2.3.2"
debug "^3.1.0"
fs-extra-p "^4.5.2"
is-ci "^1.1.0"
js-yaml "^3.11.0"
lazy-val "^1.0.3"
semver "^5.5.0"
source-map-support "^0.5.4"
stat-mode "^0.2.2"
temp-file "^3.1.1"
builtin-modules@^1.0.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f"
@ -3413,7 +3452,7 @@ class-utils@^0.3.5:
isobject "^3.0.0"
static-extend "^0.1.1"
classnames@^2.2.3, classnames@^2.2.4, classnames@^2.2.5:
classnames@^2.2.5:
version "2.2.5"
resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.5.tgz#fb3801d453467649ef3603c7d61a02bd129bde6d"
@ -4589,7 +4628,7 @@ dom-converter@~0.1:
dependencies:
utila "~0.3"
"dom-helpers@^2.4.0 || ^3.0.0", dom-helpers@^3.2.0:
dom-helpers@^3.2.0:
version "3.3.1"
resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.3.1.tgz#fc1a4e15ffdf60ddde03a480a9c0fece821dd4a6"
@ -4730,6 +4769,39 @@ ejs@^2.5.7:
version "2.5.7"
resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.5.7.tgz#cc872c168880ae3c7189762fd5ffc00896c9518a"
ejs@^2.5.9:
version "2.5.9"
resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.5.9.tgz#7ba254582a560d267437109a68354112475b0ce5"
electron-builder-lib@20.10.0:
version "20.10.0"
resolved "https://registry.yarnpkg.com/electron-builder-lib/-/electron-builder-lib-20.10.0.tgz#037812e8697edbf8a1287e7932f337cc8d4311b5"
dependencies:
"7zip-bin" "~3.1.0"
app-builder-bin "1.8.6"
async-exit-hook "^2.0.1"
bluebird-lst "^1.0.5"
builder-util "5.7.9"
builder-util-runtime "4.2.0"
chromium-pickle-js "^0.2.0"
debug "^3.1.0"
ejs "^2.5.9"
electron-osx-sign "0.4.10"
electron-publish "20.9.0"
fs-extra-p "^4.5.2"
hosted-git-info "^2.6.0"
is-ci "^1.1.0"
isbinaryfile "^3.0.2"
js-yaml "^3.11.0"
lazy-val "^1.0.3"
minimatch "^3.0.4"
normalize-package-data "^2.4.0"
plist "^3.0.1"
read-config-file "3.0.0"
sanitize-filename "^1.6.1"
semver "^5.5.0"
temp-file "^3.1.1"
electron-builder-lib@20.9.0, electron-builder-lib@~20.9.0:
version "20.9.0"
resolved "https://registry.yarnpkg.com/electron-builder-lib/-/electron-builder-lib-20.9.0.tgz#bb4725a796e80d15c5512e50a1ed0be08fea0e4f"
@ -4759,6 +4831,25 @@ electron-builder-lib@20.9.0, electron-builder-lib@~20.9.0:
semver "^5.5.0"
temp-file "^3.1.1"
electron-builder@^20.0.4:
version "20.10.0"
resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-20.10.0.tgz#89eb1b18fe71e657cefc83e2a700decd096566a3"
dependencies:
bluebird-lst "^1.0.5"
builder-util "5.7.9"
builder-util-runtime "4.2.0"
chalk "^2.3.2"
dmg-builder "4.1.5"
electron-builder-lib "20.10.0"
electron-download-tf "4.3.4"
fs-extra-p "^4.5.2"
is-ci "^1.1.0"
lazy-val "^1.0.3"
read-config-file "3.0.0"
sanitize-filename "^1.6.1"
update-notifier "^2.5.0"
yargs "^11.0.0"
electron-builder@^20.9.0:
version "20.9.0"
resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-20.9.0.tgz#3010d5fbd927c0e1d5c4db6984d797f4b87cd239"
@ -4935,6 +5026,14 @@ electron@1.8.4:
electron-download "^3.0.1"
extract-zip "^1.0.3"
electron@^1.8.2:
version "1.8.6"
resolved "https://registry.yarnpkg.com/electron/-/electron-1.8.6.tgz#6d45e377b321a35b78a794b64e40b2cf8face6ae"
dependencies:
"@types/node" "^8.0.24"
electron-download "^3.0.1"
extract-zip "^1.0.3"
elegant-spinner@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e"
@ -8223,7 +8322,7 @@ longest@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.0, loose-envify@^1.3.1:
loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1:
version "1.3.1"
resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848"
dependencies:
@ -10139,12 +10238,6 @@ react-icons@^2.2.7:
dependencies:
react-icon-base "2.1.0"
react-input-autosize@^2.1.2:
version "2.2.1"
resolved "https://registry.yarnpkg.com/react-input-autosize/-/react-input-autosize-2.2.1.tgz#ec428fa15b1592994fb5f9aa15bb1eb6baf420f8"
dependencies:
prop-types "^15.5.8"
react-inspector@^2.2.2:
version "2.2.2"
resolved "https://registry.yarnpkg.com/react-inspector/-/react-inspector-2.2.2.tgz#c04f5248fa92ab6c23e37960e725fb7f48c34d05"
@ -10249,14 +10342,6 @@ react-router@^4.2.0:
prop-types "^15.5.4"
warning "^3.0.0"
react-select@^1.0.0-rc.2:
version "1.2.1"
resolved "https://registry.yarnpkg.com/react-select/-/react-select-1.2.1.tgz#a2fe58a569eb14dcaa6543816260b97e538120d1"
dependencies:
classnames "^2.2.4"
prop-types "^15.5.8"
react-input-autosize "^2.1.2"
react-smooth-scrollbar@^8.0.6:
version "8.0.6"
resolved "https://registry.yarnpkg.com/react-smooth-scrollbar/-/react-smooth-scrollbar-8.0.6.tgz#179072e6a547b3af589ea303c50fd86366275edc"
@ -10318,25 +10403,6 @@ react-treebeard@^2.1.0:
shallowequal "^0.2.2"
velocity-react "^1.3.1"
react-virtualized-select@^3.1.3:
version "3.1.3"
resolved "https://registry.yarnpkg.com/react-virtualized-select/-/react-virtualized-select-3.1.3.tgz#e5c1fed5e493e3e5a628e53100e83d27cfd8c0ac"
dependencies:
babel-runtime "^6.11.6"
prop-types "^15.5.8"
react-select "^1.0.0-rc.2"
react-virtualized "^9.0.0"
react-virtualized@^9.0.0:
version "9.18.5"
resolved "https://registry.yarnpkg.com/react-virtualized/-/react-virtualized-9.18.5.tgz#42dd390ebaa7ea809bfcaf775d39872641679b89"
dependencies:
babel-runtime "^6.26.0"
classnames "^2.2.3"
dom-helpers "^2.4.0 || ^3.0.0"
loose-envify "^1.3.0"
prop-types "^15.6.0"
react@^16.0.0, react@^16.2.0:
version "16.2.0"
resolved "https://registry.yarnpkg.com/react/-/react-16.2.0.tgz#a31bd2dab89bff65d42134fa187f24d054c273ba"

Loading…
Cancel
Save