From d474e0b976e8d23917290d3c2055937e89e5c787 Mon Sep 17 00:00:00 2001 From: meriadec Date: Mon, 9 Jul 2018 17:10:01 +0200 Subject: [PATCH 01/58] Remove length limitation on password closes #953 --- src/components/base/InputPassword/index.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/components/base/InputPassword/index.js b/src/components/base/InputPassword/index.js index b6784878..bf550696 100644 --- a/src/components/base/InputPassword/index.js +++ b/src/components/base/InputPassword/index.js @@ -47,7 +47,6 @@ type State = { } type Props = { - maxLength: number, onChange: Function, t: T, value: string, @@ -58,7 +57,6 @@ class InputPassword extends PureComponent { static defaultProps = { onChange: noop, value: '', - maxLength: 20, } state = { @@ -86,7 +84,7 @@ class InputPassword extends PureComponent { } render() { - const { t, value, maxLength, withStrength } = this.props + const { t, value, withStrength } = this.props const { passwordStrength, inputType } = this.state const hasValue = value.trim() !== '' @@ -96,7 +94,6 @@ class InputPassword extends PureComponent { From 3e158fb2b4dabecf473f0305f70a4381ce1cf517 Mon Sep 17 00:00:00 2001 From: Anastasia Poupeney Date: Mon, 9 Jul 2018 18:31:33 +0200 Subject: [PATCH 02/58] adding 2 new exchanges, extracting urls and making them more general --- src/components/ExchangePage/index.js | 21 +++++++-- src/components/ExchangePage/logos/paybis.js | 46 +++++++++++++++++++ src/components/ExchangePage/logos/simplex.js | 27 +++++++++++ src/components/FeesField/GenericContainer.js | 2 +- src/components/ManagerPage/index.js | 2 +- src/components/Onboarding/steps/Finish.js | 2 +- .../Onboarding/steps/GenuineCheck/index.js | 4 +- src/components/Onboarding/steps/NoDevice.js | 2 +- src/components/SettingsPage/sections/About.js | 2 +- src/components/SettingsPage/sections/Help.js | 2 +- src/components/modals/Receive/index.js | 4 +- .../modals/Send/fields/RecipientField.js | 2 +- src/config/{support.js => urls.js} | 16 +++++-- static/i18n/en/app.yml | 2 + 14 files changed, 115 insertions(+), 19 deletions(-) create mode 100644 src/components/ExchangePage/logos/paybis.js create mode 100644 src/components/ExchangePage/logos/simplex.js rename src/config/{support.js => urls.js} (66%) diff --git a/src/components/ExchangePage/index.js b/src/components/ExchangePage/index.js index f3b770fc..ed5f4ed2 100644 --- a/src/components/ExchangePage/index.js +++ b/src/components/ExchangePage/index.js @@ -4,6 +4,7 @@ import React, { PureComponent } from 'react' import { translate } from 'react-i18next' import type { T } from 'types/common' +import { urls } from 'config/urls' import TrackPage from 'analytics/TrackPage' import Box from 'components/base/Box' @@ -12,6 +13,8 @@ import ExchangeCard from './ExchangeCard' import CoinhouseLogo from './logos/coinhouse' import ChangellyLogo from './logos/changelly' import CoinmamaLogo from './logos/bigmama' +import SimplexLogo from './logos/simplex' +import PaybisLogo from './logos/paybis' type Props = { t: T, @@ -21,21 +24,33 @@ const cards = [ { key: 'coinhouse', id: 'coinhouse', - url: 'https://www.coinhouse.com/r/157530', + url: urls.coinbase, logo: , }, { key: 'changelly', id: 'changelly', - url: 'https://changelly.com/?ref_id=aac789605a01', + url: urls.changelly, logo: , }, { key: 'coinmama', id: 'coinmama', - url: 'http://go.coinmama.com/visit/?bta=51801&nci=5343', + url: urls.coinmama, logo: , }, + { + key: 'simplex', + id: 'simplex', + url: urls.simplex, + logo: , + }, + { + key: 'paybis', + id: 'paybis', + url: urls.paybis, + logo: , + }, ] class ExchangePage extends PureComponent { diff --git a/src/components/ExchangePage/logos/paybis.js b/src/components/ExchangePage/logos/paybis.js new file mode 100644 index 00000000..2c6336ac --- /dev/null +++ b/src/components/ExchangePage/logos/paybis.js @@ -0,0 +1,46 @@ +// @flow + +import React, { Fragment } from 'react' + +const inner = ( + + + + + + + + + + + + + + + + +) + +export default ({ width, height }: { width: number, height: number }) => ( + + {inner} + +) diff --git a/src/components/ExchangePage/logos/simplex.js b/src/components/ExchangePage/logos/simplex.js new file mode 100644 index 00000000..94d68a37 --- /dev/null +++ b/src/components/ExchangePage/logos/simplex.js @@ -0,0 +1,27 @@ +// @flow + +import React, { Fragment } from 'react' + +const inner = ( + + + + + +) + +export default ({ width, height }: { width: number, height: number }) => ( + + {inner} + +) diff --git a/src/components/FeesField/GenericContainer.js b/src/components/FeesField/GenericContainer.js index aa4a857d..af1d9c67 100644 --- a/src/components/FeesField/GenericContainer.js +++ b/src/components/FeesField/GenericContainer.js @@ -6,7 +6,7 @@ import Box from 'components/base/Box' import LabelWithExternalIcon from 'components/base/LabelWithExternalIcon' import { translate } from 'react-i18next' import { openURL } from 'helpers/linking' -import { urls } from 'config/support' +import { urls } from 'config/urls' import { track } from 'analytics/segment' export default translate()(({ children, t }: { children: React$Node, t: * }) => ( diff --git a/src/components/ManagerPage/index.js b/src/components/ManagerPage/index.js index 7a755bbd..956d7c90 100644 --- a/src/components/ManagerPage/index.js +++ b/src/components/ManagerPage/index.js @@ -3,7 +3,7 @@ import React, { PureComponent, Fragment } from 'react' import invariant from 'invariant' import { openURL } from 'helpers/linking' -import { urls } from 'config/support' +import { urls } from 'config/urls' import type { Device } from 'types/common' import type { DeviceInfo } from 'helpers/devices/getDeviceInfo' diff --git a/src/components/Onboarding/steps/Finish.js b/src/components/Onboarding/steps/Finish.js index 80b3c2a1..da9155be 100644 --- a/src/components/Onboarding/steps/Finish.js +++ b/src/components/Onboarding/steps/Finish.js @@ -4,7 +4,7 @@ import React, { Component } from 'react' import { openURL } from 'helpers/linking' import styled from 'styled-components' import { i } from 'helpers/staticPath' -import { urls } from 'config/support' +import { urls } from 'config/urls' import Box from 'components/base/Box' import Button from 'components/base/Button' diff --git a/src/components/Onboarding/steps/GenuineCheck/index.js b/src/components/Onboarding/steps/GenuineCheck/index.js index 0518d0ee..10ed1bbb 100644 --- a/src/components/Onboarding/steps/GenuineCheck/index.js +++ b/src/components/Onboarding/steps/GenuineCheck/index.js @@ -5,7 +5,7 @@ import { openURL } from 'helpers/linking' import { connect } from 'react-redux' import styled from 'styled-components' import { colors } from 'styles/theme' -import { urls } from 'config/support' +import { urls } from 'config/urls' import { updateGenuineCheck } from 'reducers/onboarding' @@ -144,7 +144,7 @@ class GenuineCheck extends PureComponent { } contactSupport = () => { - openURL(urls.genuineCheckContactSupport) + openURL(urls.contactSupport) } handlePrevStep = () => { diff --git a/src/components/Onboarding/steps/NoDevice.js b/src/components/Onboarding/steps/NoDevice.js index abe35227..29c8cfbd 100644 --- a/src/components/Onboarding/steps/NoDevice.js +++ b/src/components/Onboarding/steps/NoDevice.js @@ -7,7 +7,7 @@ import { i } from 'helpers/staticPath' import Box from 'components/base/Box' import GrowScroll from 'components/base/GrowScroll' import TrackPage from 'analytics/TrackPage' -import { urls } from 'config/support' +import { urls } from 'config/urls' import IconCart from 'icons/Cart' import IconTruck from 'icons/Truck' import IconInfoCircle from 'icons/InfoCircle' diff --git a/src/components/SettingsPage/sections/About.js b/src/components/SettingsPage/sections/About.js index 407f29b2..3a5f8a82 100644 --- a/src/components/SettingsPage/sections/About.js +++ b/src/components/SettingsPage/sections/About.js @@ -6,7 +6,7 @@ import { translate } from 'react-i18next' import type { T } from 'types/common' import TrackPage from 'analytics/TrackPage' -import { urls } from 'config/support' +import { urls } from 'config/urls' import IconLoader from 'icons/Loader' import ReleaseNotesButton from '../ReleaseNotesButton' diff --git a/src/components/SettingsPage/sections/Help.js b/src/components/SettingsPage/sections/Help.js index cfd1ceb6..685721af 100644 --- a/src/components/SettingsPage/sections/Help.js +++ b/src/components/SettingsPage/sections/Help.js @@ -6,7 +6,7 @@ import type { T } from 'types/common' import TrackPage from 'analytics/TrackPage' import IconHelp from 'icons/Help' import resolveLogsDirectory from 'helpers/resolveLogsDirectory' -import { urls } from 'config/support' +import { urls } from 'config/urls' import ExportLogsBtn from 'components/ExportLogsBtn' import CleanButton from '../CleanButton' diff --git a/src/components/modals/Receive/index.js b/src/components/modals/Receive/index.js index 77d4e1ca..a025471e 100644 --- a/src/components/modals/Receive/index.js +++ b/src/components/modals/Receive/index.js @@ -13,7 +13,7 @@ import type { Account } from '@ledgerhq/live-common/lib/types' import { MODAL_RECEIVE } from 'config/constants' import { openURL } from 'helpers/linking' -import { urls } from 'config/support' +import { urls } from 'config/urls' import type { T, Device } from 'types/common' import type { StepProps as DefaultStepProps } from 'components/base/Stepper' @@ -133,7 +133,7 @@ class ReceiveModal extends PureComponent { isAppOpened: false, }) handleContactUs = () => { - openURL(urls.receiveFlowContactSupport) + openURL(urls.contactSupport) } handleReset = () => this.setState({ ...INITIAL_STATE }) diff --git a/src/components/modals/Send/fields/RecipientField.js b/src/components/modals/Send/fields/RecipientField.js index 1313d0aa..d1615bea 100644 --- a/src/components/modals/Send/fields/RecipientField.js +++ b/src/components/modals/Send/fields/RecipientField.js @@ -4,7 +4,7 @@ import type { Account } from '@ledgerhq/live-common/lib/types' import type { T } from 'types/common' import type { WalletBridge } from 'bridge/types' import { openURL } from 'helpers/linking' -import { urls } from 'config/support' +import { urls } from 'config/urls' import Box from 'components/base/Box' import LabelWithExternalIcon from 'components/base/LabelWithExternalIcon' import RecipientAddress from 'components/RecipientAddress' diff --git a/src/config/support.js b/src/config/urls.js similarity index 66% rename from src/config/support.js rename to src/config/urls.js index fc642029..07de6762 100644 --- a/src/config/support.js +++ b/src/config/urls.js @@ -1,21 +1,27 @@ // @flow export const urls = { + // Social twitter: 'https://twitter.com/LedgerHQ', github: 'https://github.com/LedgerHQ/ledger-live-desktop', reddit: 'https://www.reddit.com/r/ledgerwallet/', + + // Ledger support faq: 'https://support.ledgerwallet.com/hc/en-us', terms: 'https://www.ledgerwallet.com/terms', noDeviceBuyNew: 'https://www.ledgerwallet.com/', noDeviceTrackOrder: 'http://order.ledgerwallet.com/', noDeviceLearnMore: 'https://www.ledgerwallet.com/', managerHelpRequest: 'https://support.ledgerwallet.com/hc/en-us/articles/360006523674 ', - genuineCheckContactSupport: - 'https://support.ledgerwallet.com/hc/en-us/requests/new?ticket_form_id=248165', + contactSupport: 'https://support.ledgerwallet.com/hc/en-us/requests/new?ticket_form_id=248165', feesMoreInfo: 'https://support.ledgerwallet.com/hc/en-us/articles/360006535873', recipientAddressInfo: 'https://support.ledgerwallet.com/hc/en-us/articles/360006433934', - // should join and generalize naming for the same urls once defined - receiveFlowContactSupport: - 'https://support.ledgerwallet.com/hc/en-us/requests/new?ticket_form_id=248165', privacyPolicy: 'https://www.ledgerwallet.com/privacy-policy', + + // Exchanges + coinbase: 'https://www.coinhouse.com/r/157530', + changelly: 'https://changelly.com/?ref_id=aac789605a01', + coinmama: 'http://go.coinmama.com/visit/?bta=51801&nci=5343', + simplex: 'https://www.simplex.com/', + paybis: 'https://paybis.com/', } diff --git a/static/i18n/en/app.yml b/static/i18n/en/app.yml index 13c73942..c9a8a73c 100644 --- a/static/i18n/en/app.yml +++ b/static/i18n/en/app.yml @@ -152,6 +152,8 @@ exchange: coinhouse: 'Coinhouse is a trusted platform for individuals and institutional investors looking to analyze, acquire, sell and securely store crypto assets.' changelly: 'Changelly is a popular instant crypto asset exchange with 100+ coins and tokens listed.' coinmama: 'Coinmama is a financial service that makes it fast, safe and fun to buy digital assets, anywhere in the world.' + simplex: 'Simplex is a EU licensed financial institution, providing a fraudless credit card payment solution.' + paybis: 'it is safe and easy to Buy Bitcoin with credit card from PayBis. Service operates inΒ US, Canada, Germany, Russia and Saudi Arabia.' genuinecheck: modal: title: Genuine check From 81d185d49cfaba82c4ae4775aed229f0b0b9d3fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABtan=20Renaudeau?= Date: Mon, 9 Jul 2018 21:45:52 +0200 Subject: [PATCH 03/58] Update feature_request.md --- .github/ISSUE_TEMPLATE/feature_request.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 946065e3..76f5e6e6 100755 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -5,10 +5,10 @@ about: Any feature you find missing in Ledger Live? Discuss to suggest feature r - [ ] I have checked this feature was not yet requested. -#### Part of the application + - -#### Description - +#### Part of the application + + From a5f8ff57fff32f662d199668cbd967c3c397d906 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABtan=20Renaudeau?= Date: Mon, 9 Jul 2018 21:46:35 +0200 Subject: [PATCH 04/58] Update enhancement.md --- .github/ISSUE_TEMPLATE/enhancement.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/enhancement.md b/.github/ISSUE_TEMPLATE/enhancement.md index 6fe17a94..c876b7e8 100755 --- a/.github/ISSUE_TEMPLATE/enhancement.md +++ b/.github/ISSUE_TEMPLATE/enhancement.md @@ -3,6 +3,10 @@ name: πŸ—£ Start a Discussion about: Discuss to propose changes to improve the state of Ledger Live. --- + + + + #### Ledger Live Version @@ -12,7 +16,3 @@ about: Discuss to propose changes to improve the state of Ledger Live. #### Part of the application to improve - -#### Description - - From ca903c5daca4349efcd223aa880cd4b681eed518 Mon Sep 17 00:00:00 2001 From: meriadec Date: Tue, 10 Jul 2018 00:16:52 +0200 Subject: [PATCH 05/58] Add context menu - Allows cut/copy/paste with mouse - `Inspect element` in dev closes #978 --- package.json | 1 + src/main/app.js | 14 ++++++++++++++ yarn.lock | 51 ++++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 65 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 06ad81ff..bac08f54 100644 --- a/package.json +++ b/package.json @@ -55,6 +55,7 @@ "debug": "^3.1.0", "downshift": "^1.31.16", "eip55": "^1.0.3", + "electron-context-menu": "^0.10.0", "electron-store": "^1.3.0", "electron-updater": "^2.21.8", "ethereumjs-tx": "^1.3.4", diff --git a/src/main/app.js b/src/main/app.js index 4ae2099a..18a7b839 100644 --- a/src/main/app.js +++ b/src/main/app.js @@ -35,6 +35,20 @@ const { UPGRADE_EXTENSIONS, ELECTRON_WEBPACK_WDS_PORT, DEV_TOOLS, DEV_TOOLS_MODE const devTools = __DEV__ || DEV_TOOLS +// context menu - see #978 +require('electron-context-menu')({ + showInspectElement: __DEV__ || DEV_TOOLS, + showCopyImageAddress: false, + // TODO: i18n for labels + labels: { + cut: 'Cut', + copy: 'Copy', + paste: 'Paste', + copyLink: 'Copy Link', + inspect: 'Inspect element', + }, +}) + const getWindowPosition = (height, width, display = screen.getPrimaryDisplay()) => { const { bounds } = display diff --git a/yarn.lock b/yarn.lock index c6e72999..7c6fa13a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5794,6 +5794,13 @@ electron-builder@20.14.7: update-notifier "^2.5.0" yargs "^11.0.0" +electron-context-menu@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/electron-context-menu/-/electron-context-menu-0.10.0.tgz#97fce2b805e03ac2b1dae11eb6a68b064b78d633" + dependencies: + electron-dl "^1.2.0" + electron-is-dev "^0.3.0" + electron-devtools-installer@^2.2.3, electron-devtools-installer@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/electron-devtools-installer/-/electron-devtools-installer-2.2.4.tgz#261a50337e37121d338b966f07922eb4939a8763" @@ -5803,6 +5810,14 @@ electron-devtools-installer@^2.2.3, electron-devtools-installer@^2.2.4: rimraf "^2.5.2" semver "^5.3.0" +electron-dl@^1.2.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/electron-dl/-/electron-dl-1.12.0.tgz#328c7f12d3e458ed4ddc773d8ffc28d59ab35d2e" + dependencies: + ext-name "^5.0.0" + pupa "^1.0.0" + unused-filename "^1.0.0" + electron-download-tf@4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/electron-download-tf/-/electron-download-tf-4.3.4.tgz#b03740b2885aa2ad3f8784fae74df427f66d5165" @@ -6543,6 +6558,19 @@ express@^4.16.2, express@^4.16.3: utils-merge "1.0.1" vary "~1.1.2" +ext-list@^2.0.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/ext-list/-/ext-list-2.2.2.tgz#0b98e64ed82f5acf0f2931babf69212ef52ddd37" + dependencies: + mime-db "^1.28.0" + +ext-name@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ext-name/-/ext-name-5.0.0.tgz#70781981d183ee15d13993c8822045c506c8f0a6" + dependencies: + ext-list "^2.0.0" + sort-keys-length "^1.0.0" + extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" @@ -9654,7 +9682,7 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -"mime-db@>= 1.34.0 < 2": +"mime-db@>= 1.34.0 < 2", mime-db@^1.28.0: version "1.34.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.34.0.tgz#452d0ecff5c30346a6dc1e64b1eaee0d3719ff9a" @@ -9809,6 +9837,10 @@ mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdi dependencies: minimist "0.0.8" +modify-filename@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/modify-filename/-/modify-filename-1.1.0.tgz#9a2dec83806fbb2d975f22beec859ca26b393aa1" + moment@^2.11.2, moment@^2.21.0, moment@^2.22.2: version "2.22.2" resolved "https://registry.yarnpkg.com/moment/-/moment-2.22.2.tgz#3c257f9839fc0e93ff53149632239eb90783ff66" @@ -11500,6 +11532,10 @@ punycode@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" +pupa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/pupa/-/pupa-1.0.0.tgz#9a9568a5af7e657b8462a6e9d5328743560ceff6" + pushdata-bitcoin@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/pushdata-bitcoin/-/pushdata-bitcoin-1.0.1.tgz#15931d3cd967ade52206f523aa7331aef7d43af7" @@ -13141,6 +13177,12 @@ socks@~2.2.0: ip "^1.1.5" smart-buffer "^4.0.1" +sort-keys-length@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/sort-keys-length/-/sort-keys-length-1.0.1.tgz#9cb6f4f4e9e48155a6aa0671edd336ff1479a188" + dependencies: + sort-keys "^1.0.0" + sort-keys@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" @@ -14185,6 +14227,13 @@ untildify@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/untildify/-/untildify-3.0.3.tgz#1e7b42b140bcfd922b22e70ca1265bfe3634c7c9" +unused-filename@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unused-filename/-/unused-filename-1.0.0.tgz#d340880f71ae2115ebaa1325bef05cc6684469c6" + dependencies: + modify-filename "^1.1.0" + path-exists "^3.0.0" + unzip-response@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" From cd1be4d531bd30c0c445b77bdf029260e50169da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABtan=20Renaudeau?= Date: Tue, 10 Jul 2018 09:36:02 +0200 Subject: [PATCH 06/58] Better sentry logs + opt-out from tracking xhr/ui clicks/.. --- src/components/SelectExchange.js | 16 ++++---- src/logger/logger.js | 66 ++++++++++++++++++++++++++++---- src/sentry/browser.js | 4 ++ src/sentry/install.js | 32 ++++++++-------- src/sentry/node.js | 4 ++ 5 files changed, 91 insertions(+), 31 deletions(-) diff --git a/src/components/SelectExchange.js b/src/components/SelectExchange.js index 635c5a2c..b9aa37d4 100644 --- a/src/components/SelectExchange.js +++ b/src/components/SelectExchange.js @@ -106,13 +106,15 @@ class SelectExchange extends Component< ) : ( - + {exchanges ? ( + + ) : null}