Browse Source

Merge pull request #1163 from gre/hotfixes/1.0.3

Prepare for 1.0.3
master
Gaëtan Renaudeau 7 years ago
committed by GitHub
parent
commit
1706303370
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      package.json
  2. 6
      src/actions/settings.js
  3. 4
      src/bridge/RippleJSBridge.js
  4. 5
      src/commands/libcoreSignAndBroadcast.js
  5. 40
      src/components/Onboarding/index.js
  6. 11
      src/components/OnboardingOrElse.js
  7. 12
      src/components/SettingsPage/LaunchOnboardingBtn.js
  8. 8
      src/components/layout/Default.js
  9. 12
      src/reducers/onboarding.js
  10. 6
      yarn.lock

2
package.json

@ -35,7 +35,7 @@
"webpack-sources": "1.0.1" "webpack-sources": "1.0.1"
}, },
"dependencies": { "dependencies": {
"@ledgerhq/hw-app-btc": "^4.13.0", "@ledgerhq/hw-app-btc": "4.20.0",
"@ledgerhq/hw-app-eth": "^4.14.0", "@ledgerhq/hw-app-eth": "^4.14.0",
"@ledgerhq/hw-app-xrp": "^4.13.0", "@ledgerhq/hw-app-xrp": "^4.13.0",
"@ledgerhq/hw-transport": "^4.13.0", "@ledgerhq/hw-transport": "^4.13.0",

6
src/actions/settings.js

@ -15,7 +15,11 @@ export const setDeveloperMode = (developerMode: boolean) => saveSettings({ devel
export const setSentryLogs = (sentryLogs: boolean) => saveSettings({ sentryLogs }) export const setSentryLogs = (sentryLogs: boolean) => saveSettings({ sentryLogs })
export const setShareAnalytics = (shareAnalytics: boolean) => saveSettings({ shareAnalytics }) export const setShareAnalytics = (shareAnalytics: boolean) => saveSettings({ shareAnalytics })
export const setMarketIndicator = (marketIndicator: *) => saveSettings({ marketIndicator }) export const setMarketIndicator = (marketIndicator: *) => saveSettings({ marketIndicator })
export const setCounterValue = (counterValue: string) => saveSettings({ counterValue }) export const setCounterValue = (counterValue: string) =>
saveSettings({
counterValue,
counterValueExchange: null,
})
export const setLanguage = (language: ?string) => saveSettings({ language }) export const setLanguage = (language: ?string) => saveSettings({ language })
export const setRegion = (region: ?string) => saveSettings({ region }) export const setRegion = (region: ?string) => saveSettings({ region })
export const setCounterValueExchange = (counterValueExchange: ?string) => export const setCounterValueExchange = (counterValueExchange: ?string) =>

4
src/bridge/RippleJSBridge.js

@ -192,11 +192,9 @@ type Tx = {
const txToOperation = (account: Account) => ({ const txToOperation = (account: Account) => ({
id, id,
sequence, sequence,
type: txType,
outcome: { fee, deliveredAmount, ledgerVersion, timestamp }, outcome: { fee, deliveredAmount, ledgerVersion, timestamp },
specification: { source, destination }, specification: { source, destination },
}: Tx): ?Operation => { }: Tx): ?Operation => {
if (txType === 'trustline') return null
const type = source.address === account.freshAddress ? 'OUT' : 'IN' const type = source.address === account.freshAddress ? 'OUT' : 'IN'
let value = deliveredAmount ? parseAPICurrencyObject(deliveredAmount) : 0 let value = deliveredAmount ? parseAPICurrencyObject(deliveredAmount) : 0
const feeValue = parseAPIValue(fee) const feeValue = parseAPIValue(fee)
@ -318,6 +316,7 @@ const RippleJSBridge: WalletBridge<Transaction> = {
const transactions = await api.getTransactions(address, { const transactions = await api.getTransactions(address, {
minLedgerVersion, minLedgerVersion,
maxLedgerVersion, maxLedgerVersion,
types: ['payment'],
}) })
if (finished) return if (finished) return
@ -406,6 +405,7 @@ const RippleJSBridge: WalletBridge<Transaction> = {
minLedgerVersion, minLedgerVersion,
), ),
maxLedgerVersion, maxLedgerVersion,
types: ['payment'],
}) })
if (finished) return if (finished) return

5
src/commands/libcoreSignAndBroadcast.js

@ -77,7 +77,9 @@ async function signTransaction({
hasTimestamp: boolean, hasTimestamp: boolean,
}) { }) {
const additionals = [] const additionals = []
let expiryHeight
if (currencyId === 'bitcoin_cash' || currencyId === 'bitcoin_gold') additionals.push('bip143') if (currencyId === 'bitcoin_cash' || currencyId === 'bitcoin_gold') additionals.push('bip143')
if (currencyId === 'zcash') expiryHeight = Buffer.from([0x00, 0x00, 0x00, 0x00])
const rawInputs = transaction.getInputs() const rawInputs = transaction.getInputs()
const inputs = await Promise.all( const inputs = await Promise.all(
@ -119,7 +121,7 @@ async function signTransaction({
const changePath = output ? output.getDerivationPath().toString() : undefined const changePath = output ? output.getDerivationPath().toString() : undefined
const outputScriptHex = Buffer.from(transaction.serializeOutputs()).toString('hex') const outputScriptHex = Buffer.from(transaction.serializeOutputs()).toString('hex')
const lockTime = transaction.getLockTime() const lockTime = undefined // TODO: transaction.getLockTime()
const initialTimestamp = hasTimestamp ? transaction.getTimestamp() : undefined const initialTimestamp = hasTimestamp ? transaction.getTimestamp() : undefined
const signedTransaction = await hwApp.createPaymentTransactionNew( const signedTransaction = await hwApp.createPaymentTransactionNew(
@ -132,6 +134,7 @@ async function signTransaction({
isSegwit, isSegwit,
initialTimestamp, initialTimestamp,
additionals, additionals,
expiryHeight,
) )
return signedTransaction return signedTransaction

40
src/components/Onboarding/index.js

@ -5,6 +5,7 @@ import { compose } from 'redux'
import { translate } from 'react-i18next' import { translate } from 'react-i18next'
import { connect } from 'react-redux' import { connect } from 'react-redux'
import styled from 'styled-components' import styled from 'styled-components'
import IconCross from 'icons/Cross'
import type { T } from 'types/common' import type { T } from 'types/common'
import type { OnboardingState } from 'reducers/onboarding' import type { OnboardingState } from 'reducers/onboarding'
@ -20,6 +21,8 @@ import {
updateGenuineCheck, updateGenuineCheck,
isLedgerNano, isLedgerNano,
flowType, flowType,
relaunchOnboarding,
onboardingRelaunchedSelector,
} from 'reducers/onboarding' } from 'reducers/onboarding'
import { getCurrentDevice } from 'reducers/devices' import { getCurrentDevice } from 'reducers/devices'
@ -54,6 +57,7 @@ const STEPS = {
const mapStateToProps = state => ({ const mapStateToProps = state => ({
hasCompletedOnboarding: state.settings.hasCompletedOnboarding, hasCompletedOnboarding: state.settings.hasCompletedOnboarding,
onboardingRelaunched: onboardingRelaunchedSelector(state),
onboarding: state.onboarding, onboarding: state.onboarding,
settings: state.settings, settings: state.settings,
getCurrentDevice: getCurrentDevice(state), getCurrentDevice: getCurrentDevice(state),
@ -66,11 +70,13 @@ const mapDispatchToProps = {
jumpStep, jumpStep,
unlock, unlock,
openModal, openModal,
relaunchOnboarding,
} }
type Props = { type Props = {
t: T, t: T,
hasCompletedOnboarding: boolean, hasCompletedOnboarding: boolean,
onboardingRelaunched: boolean,
saveSettings: Function, saveSettings: Function,
onboarding: OnboardingState, onboarding: OnboardingState,
settings: SettingsState, settings: SettingsState,
@ -80,6 +86,7 @@ type Props = {
getCurrentDevice: Function, getCurrentDevice: Function,
unlock: Function, unlock: Function,
openModal: string => void, openModal: string => void,
relaunchOnboarding: boolean => void,
} }
export type StepProps = { export type StepProps = {
@ -99,10 +106,33 @@ export type StepProps = {
flowType: Function, flowType: Function,
} }
const CloseContainer = styled(Box).attrs({
p: 4,
color: 'fog',
})`
cursor: pointer;
position: absolute;
top: 0;
right: 0;
z-index: 1;
&:hover {
color: ${p => p.theme.colors.grey};
}
&:active {
color: ${p => p.theme.colors.dark};
}
`
class Onboarding extends PureComponent<Props> { class Onboarding extends PureComponent<Props> {
getDeviceInfo = () => this.props.getCurrentDevice getDeviceInfo = () => this.props.getCurrentDevice
cancelRelaunch = () => {
this.props.relaunchOnboarding(false)
}
finish = () => { finish = () => {
this.props.saveSettings({ hasCompletedOnboarding: true }) this.props.saveSettings({ hasCompletedOnboarding: true })
this.props.relaunchOnboarding(false)
setTimeout(() => { setTimeout(() => {
this.props.openModal(MODAL_DISCLAIMER) this.props.openModal(MODAL_DISCLAIMER)
}, MODAL_DISCLAIMER_DELAY) }, MODAL_DISCLAIMER_DELAY)
@ -119,17 +149,14 @@ class Onboarding extends PureComponent<Props> {
render() { render() {
const { const {
hasCompletedOnboarding,
onboarding, onboarding,
prevStep, prevStep,
nextStep, nextStep,
jumpStep, jumpStep,
settings, settings,
t, t,
onboardingRelaunched,
} = this.props } = this.props
if (hasCompletedOnboarding) {
return null
}
const StepComponent = STEPS[onboarding.stepName] const StepComponent = STEPS[onboarding.stepName]
const step = onboarding.steps[onboarding.stepIndex] const step = onboarding.steps[onboarding.stepIndex]
@ -159,6 +186,11 @@ class Onboarding extends PureComponent<Props> {
return ( return (
<Container> <Container>
{step.options.showBreadcrumb && <OnboardingBreadcrumb />} {step.options.showBreadcrumb && <OnboardingBreadcrumb />}
{onboardingRelaunched ? (
<CloseContainer onClick={this.cancelRelaunch}>
<IconCross size={16} />
</CloseContainer>
) : null}
<StepContainer> <StepContainer>
<StepComponent {...stepProps} /> <StepComponent {...stepProps} />
</StepContainer> </StepContainer>

11
src/components/OnboardingOrElse.js

@ -4,25 +4,28 @@ import React, { PureComponent } from 'react'
import { connect } from 'react-redux' import { connect } from 'react-redux'
import { createStructuredSelector } from 'reselect' import { createStructuredSelector } from 'reselect'
import { hasCompletedOnboardingSelector } from 'reducers/settings' import { hasCompletedOnboardingSelector } from 'reducers/settings'
import { onboardingRelaunchedSelector } from 'reducers/onboarding'
import Onboarding from './Onboarding' import Onboarding from './Onboarding'
type Props = { type Props = {
hasCompletedOnboarding: boolean, hasCompletedOnboarding: boolean,
onboardingRelaunched: boolean,
children: *, children: *,
} }
class OnboardingOrElse extends PureComponent<Props> { class OnboardingOrElse extends PureComponent<Props> {
render() { render() {
const { hasCompletedOnboarding, children } = this.props const { hasCompletedOnboarding, onboardingRelaunched, children } = this.props
if (hasCompletedOnboarding) { if (!hasCompletedOnboarding || onboardingRelaunched) {
return children return <Onboarding />
} }
return <Onboarding /> return children
} }
} }
export default connect( export default connect(
createStructuredSelector({ createStructuredSelector({
hasCompletedOnboarding: hasCompletedOnboardingSelector, hasCompletedOnboarding: hasCompletedOnboardingSelector,
onboardingRelaunched: onboardingRelaunchedSelector,
}), }),
)(OnboardingOrElse) )(OnboardingOrElse)

12
src/components/SettingsPage/LaunchOnboardingBtn.js

@ -2,32 +2,24 @@
import React, { Fragment, PureComponent } from 'react' import React, { Fragment, PureComponent } from 'react'
import { connect } from 'react-redux' import { connect } from 'react-redux'
import { saveSettings } from 'actions/settings'
import { translate } from 'react-i18next' import { translate } from 'react-i18next'
import type { T } from 'types/common' import type { T } from 'types/common'
import type { SettingsState } from 'reducers/settings'
import type { OnboardingState } from 'reducers/onboarding'
import Track from 'analytics/Track' import Track from 'analytics/Track'
import Onboarding from 'components/Onboarding'
import Button from 'components/base/Button/index' import Button from 'components/base/Button/index'
import { relaunchOnboarding } from 'reducers/onboarding' import { relaunchOnboarding } from 'reducers/onboarding'
const mapDispatchToProps = { const mapDispatchToProps = {
saveSettings,
relaunchOnboarding, relaunchOnboarding,
} }
type Props = { type Props = {
saveSettings: ($Shape<SettingsState>) => void, relaunchOnboarding: boolean => void,
relaunchOnboarding: ($Shape<OnboardingState>) => void,
t: T, t: T,
} }
class LaunchOnboardingBtn extends PureComponent<Props> { class LaunchOnboardingBtn extends PureComponent<Props> {
handleLaunchOnboarding = () => { handleLaunchOnboarding = () => {
this.props.saveSettings({ hasCompletedOnboarding: false }) this.props.relaunchOnboarding(true)
this.props.relaunchOnboarding({ onboardingRelaunched: true })
return <Onboarding />
} }
render() { render() {
const { t } = this.props const { t } = this.props

8
src/components/layout/Default.js

@ -88,8 +88,8 @@ class Default extends Component<Props> {
<ExportLogsBtn hookToShortcut /> <ExportLogsBtn hookToShortcut />
<Track mandatory onMount event="App Starts" /> <Track mandatory onMount event="App Starts" />
<OnboardingOrElse> <IsUnlocked>
<IsUnlocked> <OnboardingOrElse>
{Object.entries(modals).map(([name, ModalComponent]: [string, any]) => ( {Object.entries(modals).map(([name, ModalComponent]: [string, any]) => (
<ModalComponent key={name} /> <ModalComponent key={name} />
))} ))}
@ -119,8 +119,8 @@ class Default extends Component<Props> {
<KeyboardContent sequence="BJBJBJ"> <KeyboardContent sequence="BJBJBJ">
<PerfIndicator /> <PerfIndicator />
</KeyboardContent> </KeyboardContent>
</IsUnlocked> </OnboardingOrElse>
</OnboardingOrElse> </IsUnlocked>
</Fragment> </Fragment>
) )
} }

12
src/reducers/onboarding.js

@ -2,6 +2,7 @@
import { SKIP_ONBOARDING } from 'config/constants' import { SKIP_ONBOARDING } from 'config/constants'
import { handleActions, createAction } from 'redux-actions' import { handleActions, createAction } from 'redux-actions'
import type { State } from '.'
type Step = { type Step = {
name: string, name: string,
@ -170,14 +171,17 @@ const handlers = {
...state, ...state,
isLedgerNano, isLedgerNano,
}), }),
ONBOARDING_RELAUNCH: ( ONBOARDING_RELAUNCH: (state: OnboardingState, { payload: onboardingRelaunched }) => ({
state: OnboardingState, ...initialState,
{ payload: onboardingRelaunched }: { payload: $Shape<OnboardingState> }, onboardingRelaunched,
) => ({ ...initialState, ...onboardingRelaunched }), }),
} }
export default handleActions(handlers, initialState) export default handleActions(handlers, initialState)
export const onboardingRelaunchedSelector = (s: State): ?boolean =>
s.onboarding.onboardingRelaunched
export const relaunchOnboarding = createAction('ONBOARDING_RELAUNCH') export const relaunchOnboarding = createAction('ONBOARDING_RELAUNCH')
export const nextStep = createAction('ONBOARDING_NEXT_STEP') export const nextStep = createAction('ONBOARDING_NEXT_STEP')
export const prevStep = createAction('ONBOARDING_PREV_STEP') export const prevStep = createAction('ONBOARDING_PREV_STEP')

6
yarn.lock

@ -1474,9 +1474,9 @@
version "0.7.1" version "0.7.1"
resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-0.7.1.tgz#e44e596d03c9f16ba3b127ad333a8a072bcb5a0a" resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-0.7.1.tgz#e44e596d03c9f16ba3b127ad333a8a072bcb5a0a"
"@ledgerhq/hw-app-btc@^4.13.0": "@ledgerhq/hw-app-btc@4.20.0":
version "4.19.0" version "4.20.0"
resolved "https://registry.yarnpkg.com/@ledgerhq/hw-app-btc/-/hw-app-btc-4.19.0.tgz#0fdce47ad71df7783c6bf881e6a9bc8b4c84de52" resolved "https://registry.yarnpkg.com/@ledgerhq/hw-app-btc/-/hw-app-btc-4.20.0.tgz#116f841932c199c3a286563831154207a5aa656f"
dependencies: dependencies:
"@ledgerhq/hw-transport" "^4.19.0" "@ledgerhq/hw-transport" "^4.19.0"
create-hash "^1.1.3" create-hash "^1.1.3"

Loading…
Cancel
Save